eslint-plugin-sonarjs 4.0.3 → 4.1.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 (810) hide show
  1. package/README.md +52 -56
  2. package/cjs/S100/generated-meta.js +2 -1
  3. package/cjs/S101/generated-meta.js +2 -1
  4. package/cjs/S104/generated-meta.js +2 -1
  5. package/cjs/S105/generated-meta.js +2 -1
  6. package/cjs/S1066/generated-meta.js +2 -1
  7. package/cjs/S1067/generated-meta.js +2 -1
  8. package/cjs/S1110/generated-meta.js +2 -1
  9. package/cjs/S1119/generated-meta.js +2 -1
  10. package/cjs/S1121/generated-meta.js +2 -1
  11. package/cjs/S1125/generated-meta.js +2 -1
  12. package/cjs/S1126/generated-meta.js +2 -1
  13. package/cjs/S1128/generated-meta.js +2 -1
  14. package/cjs/S1134/generated-meta.js +2 -1
  15. package/cjs/S1135/generated-meta.js +2 -1
  16. package/cjs/S1154/generated-meta.js +2 -1
  17. package/cjs/S1154/rule.js +21 -2
  18. package/cjs/S117/generated-meta.js +2 -1
  19. package/cjs/S1172/generated-meta.js +2 -1
  20. package/cjs/S1192/generated-meta.js +2 -1
  21. package/cjs/S1219/generated-meta.js +2 -1
  22. package/cjs/S1226/generated-meta.js +2 -1
  23. package/cjs/S124/generated-meta.js +2 -1
  24. package/cjs/{S2255 → S1244}/generated-meta.js +8 -7
  25. package/cjs/S1244/meta.js +21 -0
  26. package/cjs/S1244/rule.js +265 -0
  27. package/cjs/S125/generated-meta.js +3 -2
  28. package/cjs/S126/generated-meta.js +2 -1
  29. package/cjs/S1264/generated-meta.js +2 -1
  30. package/cjs/S128/generated-meta.js +2 -1
  31. package/cjs/S1291/generated-meta.js +2 -1
  32. package/cjs/S1301/generated-meta.js +3 -2
  33. package/cjs/S1313/generated-meta.js +2 -1
  34. package/cjs/S134/generated-meta.js +2 -1
  35. package/cjs/S135/generated-meta.js +2 -1
  36. package/cjs/S138/generated-meta.js +2 -1
  37. package/cjs/S1439/generated-meta.js +2 -1
  38. package/cjs/S1444/generated-meta.js +2 -1
  39. package/cjs/S1451/generated-meta.js +2 -1
  40. package/cjs/S1472/generated-meta.js +2 -1
  41. package/cjs/S1479/generated-meta.js +2 -1
  42. package/cjs/S1481/generated-meta.js +2 -1
  43. package/cjs/S1488/generated-meta.js +2 -1
  44. package/cjs/S1515/generated-meta.js +2 -1
  45. package/cjs/S1523/generated-meta.js +3 -2
  46. package/cjs/S1526/generated-meta.js +2 -1
  47. package/cjs/S1527/generated-meta.js +2 -1
  48. package/cjs/S1528/generated-meta.js +2 -1
  49. package/cjs/S1529/generated-meta.js +2 -1
  50. package/cjs/S1530/generated-meta.js +2 -1
  51. package/cjs/S1533/generated-meta.js +2 -1
  52. package/cjs/S1535/generated-meta.js +2 -1
  53. package/cjs/S1541/generated-meta.js +2 -1
  54. package/cjs/S1607/generated-meta.js +2 -1
  55. package/cjs/S1607/rule.js +72 -7
  56. package/cjs/S1764/generated-meta.js +2 -1
  57. package/cjs/S1821/generated-meta.js +2 -1
  58. package/cjs/S1848/generated-meta.js +2 -1
  59. package/cjs/S1854/generated-meta.js +2 -1
  60. package/cjs/S1862/generated-meta.js +2 -1
  61. package/cjs/S1871/generated-meta.js +2 -1
  62. package/cjs/S1874/generated-meta.js +2 -1
  63. package/cjs/S1940/generated-meta.js +2 -1
  64. package/cjs/S1994/generated-meta.js +2 -1
  65. package/cjs/S2004/generated-meta.js +2 -1
  66. package/cjs/S2068/generated-meta.js +2 -1
  67. package/cjs/S2068/rule.js +0 -14
  68. package/cjs/S2077/generated-meta.js +3 -2
  69. package/cjs/S2092/generated-meta.js +2 -1
  70. package/cjs/S2123/generated-meta.js +2 -1
  71. package/cjs/S2137/generated-meta.js +2 -1
  72. package/cjs/S2138/generated-meta.js +2 -1
  73. package/cjs/S2187/generated-meta.js +2 -1
  74. package/cjs/S2187/rule.js +50 -13
  75. package/cjs/S2201/generated-meta.js +2 -1
  76. package/cjs/S2208/generated-meta.js +2 -1
  77. package/cjs/S2234/generated-meta.js +2 -1
  78. package/cjs/S2245/generated-meta.js +3 -2
  79. package/cjs/S2251/generated-meta.js +2 -1
  80. package/cjs/S2259/generated-meta.js +2 -1
  81. package/cjs/S2301/generated-meta.js +2 -1
  82. package/cjs/S2310/generated-meta.js +2 -1
  83. package/cjs/S2392/generated-meta.js +2 -1
  84. package/cjs/S2424/generated-meta.js +2 -1
  85. package/cjs/S2428/generated-meta.js +2 -1
  86. package/cjs/S2486/generated-meta.js +2 -1
  87. package/cjs/S2589/generated-meta.js +2 -1
  88. package/cjs/S2598/generated-meta.js +2 -1
  89. package/cjs/S2612/generated-meta.js +2 -1
  90. package/cjs/S2639/generated-meta.js +2 -1
  91. package/cjs/S2681/generated-meta.js +2 -1
  92. package/cjs/S2692/generated-meta.js +2 -1
  93. package/cjs/S2699/generated-meta.js +2 -1
  94. package/cjs/S2699/rule.js +19 -5
  95. package/cjs/S2703/generated-meta.js +2 -1
  96. package/cjs/S2737/generated-meta.js +2 -1
  97. package/cjs/S2755/generated-meta.js +2 -1
  98. package/cjs/S2757/generated-meta.js +2 -1
  99. package/cjs/S2817/generated-meta.js +2 -1
  100. package/cjs/S2819/generated-meta.js +2 -1
  101. package/cjs/S2870/generated-meta.js +2 -1
  102. package/cjs/S2871/generated-meta.js +2 -1
  103. package/cjs/S2871/rule.js +85 -1
  104. package/cjs/S2970/generated-meta.js +2 -1
  105. package/cjs/S2990/generated-meta.js +2 -1
  106. package/cjs/S2999/generated-meta.js +2 -1
  107. package/cjs/S3001/generated-meta.js +2 -1
  108. package/cjs/S3003/generated-meta.js +2 -1
  109. package/cjs/S3317/generated-meta.js +2 -1
  110. package/cjs/S3330/generated-meta.js +3 -2
  111. package/cjs/S3358/generated-meta.js +2 -1
  112. package/cjs/S3402/generated-meta.js +2 -1
  113. package/cjs/S3403/generated-meta.js +2 -1
  114. package/cjs/S3403/rule.js +21 -1
  115. package/cjs/S3415/generated-meta.js +2 -1
  116. package/cjs/S3499/generated-meta.js +2 -1
  117. package/cjs/S3500/generated-meta.js +2 -1
  118. package/cjs/S3513/generated-meta.js +2 -1
  119. package/cjs/S3514/generated-meta.js +2 -1
  120. package/cjs/S3516/generated-meta.js +2 -1
  121. package/cjs/S3524/generated-meta.js +2 -1
  122. package/cjs/S3525/generated-meta.js +2 -1
  123. package/cjs/S3531/generated-meta.js +2 -1
  124. package/cjs/S3533/generated-meta.js +2 -1
  125. package/cjs/S3579/generated-meta.js +2 -1
  126. package/cjs/S3616/generated-meta.js +2 -1
  127. package/cjs/S3626/generated-meta.js +2 -1
  128. package/cjs/S3626/rule.js +1 -1
  129. package/cjs/S3686/generated-meta.js +2 -1
  130. package/cjs/S3699/generated-meta.js +2 -1
  131. package/cjs/S3735/generated-meta.js +2 -1
  132. package/cjs/S3757/generated-meta.js +2 -1
  133. package/cjs/S3757/rule.js +3 -1
  134. package/cjs/S3758/generated-meta.js +2 -1
  135. package/cjs/S3760/generated-meta.js +2 -1
  136. package/cjs/S3776/generated-meta.js +2 -1
  137. package/cjs/S3782/generated-meta.js +2 -1
  138. package/cjs/S3785/generated-meta.js +2 -1
  139. package/cjs/S3796/generated-meta.js +2 -1
  140. package/cjs/S3798/generated-meta.js +2 -1
  141. package/cjs/S3798/rule.js +57 -17
  142. package/cjs/S3800/generated-meta.js +2 -1
  143. package/cjs/S3801/generated-meta.js +2 -1
  144. package/cjs/S3827/generated-meta.js +2 -1
  145. package/cjs/S3923/generated-meta.js +2 -1
  146. package/cjs/S3972/generated-meta.js +2 -1
  147. package/cjs/S3973/generated-meta.js +2 -1
  148. package/cjs/S3981/generated-meta.js +2 -1
  149. package/cjs/S3984/generated-meta.js +2 -1
  150. package/cjs/S4030/generated-meta.js +2 -1
  151. package/cjs/S4036/generated-meta.js +3 -2
  152. package/cjs/S4043/generated-meta.js +2 -1
  153. package/cjs/S4139/generated-meta.js +2 -1
  154. package/cjs/S4143/generated-meta.js +2 -1
  155. package/cjs/S4144/generated-meta.js +2 -1
  156. package/cjs/S4158/generated-meta.js +2 -1
  157. package/cjs/S4165/generated-meta.js +2 -1
  158. package/cjs/S4322/generated-meta.js +2 -1
  159. package/cjs/S4323/generated-meta.js +2 -1
  160. package/cjs/S4324/generated-meta.js +2 -1
  161. package/cjs/S4328/generated-meta.js +2 -1
  162. package/cjs/S4328/rule.js +7 -2
  163. package/cjs/S4335/generated-meta.js +2 -1
  164. package/cjs/S4423/generated-meta.js +2 -1
  165. package/cjs/S4426/generated-meta.js +2 -1
  166. package/cjs/S4502/generated-meta.js +3 -2
  167. package/cjs/S4507/generated-meta.js +3 -2
  168. package/cjs/S4524/generated-meta.js +2 -1
  169. package/cjs/S4619/generated-meta.js +2 -1
  170. package/cjs/S4621/generated-meta.js +2 -1
  171. package/cjs/S4622/generated-meta.js +2 -1
  172. package/cjs/S4623/generated-meta.js +2 -1
  173. package/cjs/S4624/generated-meta.js +2 -1
  174. package/cjs/S4624/rule.js +2 -7
  175. package/cjs/S4634/generated-meta.js +2 -1
  176. package/cjs/S4721/generated-meta.js +5 -4
  177. package/cjs/S4782/generated-meta.js +2 -1
  178. package/cjs/S4782/rule.js +96 -14
  179. package/cjs/S4790/generated-meta.js +3 -2
  180. package/cjs/S4790/rule.js +217 -2
  181. package/cjs/S4798/generated-meta.js +2 -1
  182. package/cjs/S4822/generated-meta.js +2 -1
  183. package/cjs/S4830/generated-meta.js +2 -1
  184. package/cjs/S5042/generated-meta.js +2 -1
  185. package/cjs/S5122/generated-meta.js +2 -1
  186. package/cjs/S5148/generated-meta.js +2 -1
  187. package/cjs/S5247/generated-meta.js +3 -2
  188. package/cjs/S5256/generated-meta.js +2 -1
  189. package/cjs/S5257/generated-meta.js +2 -1
  190. package/cjs/S5260/generated-meta.js +2 -1
  191. package/cjs/S5264/generated-meta.js +2 -1
  192. package/cjs/S5332/generated-meta.js +3 -2
  193. package/cjs/S5332/rule.lib.js +54 -46
  194. package/cjs/S5443/generated-meta.js +2 -1
  195. package/cjs/S5527/generated-meta.js +2 -1
  196. package/cjs/S5542/generated-meta.js +2 -1
  197. package/cjs/S5547/generated-meta.js +2 -1
  198. package/cjs/S5604/generated-meta.js +5 -4
  199. package/cjs/S5659/generated-meta.js +2 -1
  200. package/cjs/S5689/generated-meta.js +2 -1
  201. package/cjs/S5691/generated-meta.js +5 -4
  202. package/cjs/S5693/generated-meta.js +2 -1
  203. package/cjs/S5693/rule.js +45 -1
  204. package/cjs/S5725/generated-meta.js +3 -2
  205. package/cjs/S5725/rule.js +75 -12
  206. package/cjs/S5728/generated-meta.js +3 -2
  207. package/cjs/S5730/generated-meta.js +5 -4
  208. package/cjs/S5732/generated-meta.js +5 -4
  209. package/cjs/S5734/generated-meta.js +3 -2
  210. package/cjs/S5736/generated-meta.js +3 -2
  211. package/cjs/S5739/generated-meta.js +3 -2
  212. package/cjs/S5757/generated-meta.js +5 -4
  213. package/cjs/S5759/generated-meta.js +5 -4
  214. package/cjs/S5842/generated-meta.js +2 -1
  215. package/cjs/S5843/generated-meta.js +2 -1
  216. package/cjs/S5845/generated-meta.js +52 -0
  217. package/cjs/S5845/meta.js +21 -0
  218. package/cjs/S5845/rule.js +296 -0
  219. package/cjs/S5850/generated-meta.js +2 -1
  220. package/cjs/S5852/generated-meta.js +3 -2
  221. package/cjs/S5852/rule.js +11 -3
  222. package/cjs/S5856/generated-meta.js +2 -1
  223. package/cjs/S5860/generated-meta.js +2 -1
  224. package/cjs/S5863/generated-meta.js +2 -1
  225. package/cjs/S5867/generated-meta.js +2 -1
  226. package/cjs/S5868/generated-meta.js +2 -1
  227. package/cjs/S5868/rule.js +54 -25
  228. package/cjs/S5869/generated-meta.js +2 -1
  229. package/cjs/S5876/generated-meta.js +2 -1
  230. package/cjs/S5906/assertion-suggestions.js +279 -0
  231. package/cjs/S5906/assertion-utils.js +103 -0
  232. package/cjs/S5906/cypress-suggestions.js +62 -0
  233. package/cjs/S5906/expect-chain.js +16 -0
  234. package/cjs/S5906/generated-meta.js +52 -0
  235. package/cjs/S5906/meta.js +21 -0
  236. package/cjs/S5906/playwright-suggestions.js +103 -0
  237. package/cjs/S5906/rule.js +365 -0
  238. package/cjs/S5914/generated-meta.js +52 -0
  239. package/cjs/{S4817 → S5914}/meta.js +1 -1
  240. package/cjs/S5914/rule.js +213 -0
  241. package/cjs/S5958/generated-meta.js +2 -1
  242. package/cjs/S5973/generated-meta.js +2 -1
  243. package/cjs/S5973/rule.js +1 -1
  244. package/cjs/S6019/generated-meta.js +2 -1
  245. package/cjs/S6035/generated-meta.js +2 -1
  246. package/cjs/S6079/generated-meta.js +2 -1
  247. package/cjs/S6080/generated-meta.js +2 -1
  248. package/cjs/S6092/generated-meta.js +2 -1
  249. package/cjs/S6249/generated-meta.js +3 -2
  250. package/cjs/S6252/generated-meta.js +3 -2
  251. package/cjs/S6265/generated-meta.js +2 -1
  252. package/cjs/S6268/generated-meta.js +3 -2
  253. package/cjs/S6270/generated-meta.js +2 -1
  254. package/cjs/S6275/generated-meta.js +2 -1
  255. package/cjs/S6281/generated-meta.js +3 -2
  256. package/cjs/S6281/rule.js +7 -20
  257. package/cjs/S6302/generated-meta.js +2 -1
  258. package/cjs/S6303/generated-meta.js +2 -1
  259. package/cjs/S6304/generated-meta.js +3 -2
  260. package/cjs/S6308/generated-meta.js +2 -1
  261. package/cjs/S6317/generated-meta.js +2 -1
  262. package/cjs/S6319/generated-meta.js +3 -2
  263. package/cjs/S6321/generated-meta.js +2 -1
  264. package/cjs/S6323/generated-meta.js +2 -1
  265. package/cjs/S6324/generated-meta.js +2 -1
  266. package/cjs/S6324/rule.js +5 -5
  267. package/cjs/S6326/generated-meta.js +2 -1
  268. package/cjs/S6327/generated-meta.js +3 -2
  269. package/cjs/S6328/generated-meta.js +2 -1
  270. package/cjs/S6329/generated-meta.js +3 -2
  271. package/cjs/S6330/generated-meta.js +2 -1
  272. package/cjs/S6331/generated-meta.js +2 -1
  273. package/cjs/S6332/generated-meta.js +3 -2
  274. package/cjs/S6333/generated-meta.js +3 -2
  275. package/cjs/S6351/generated-meta.js +2 -1
  276. package/cjs/S6353/generated-meta.js +2 -1
  277. package/cjs/S6397/generated-meta.js +2 -1
  278. package/cjs/S6418/generated-meta.js +2 -1
  279. package/cjs/S6426/generated-meta.js +2 -1
  280. package/cjs/S6426/rule.js +6 -1
  281. package/cjs/S6437/generated-meta.js +2 -1
  282. package/cjs/S6437/rule.js +4 -2
  283. package/cjs/S6439/generated-meta.js +2 -1
  284. package/cjs/S6442/generated-meta.js +2 -1
  285. package/cjs/S6443/generated-meta.js +2 -1
  286. package/cjs/S6486/generated-meta.js +2 -1
  287. package/cjs/S6486/rule.js +4 -4
  288. package/cjs/S6564/generated-meta.js +2 -1
  289. package/cjs/S6594/generated-meta.js +2 -1
  290. package/cjs/S6627/generated-meta.js +2 -1
  291. package/cjs/S6759/generated-meta.js +2 -1
  292. package/cjs/S6759/rule.js +31 -1
  293. package/cjs/S6958/generated-meta.js +2 -1
  294. package/cjs/S6959/generated-meta.js +2 -1
  295. package/cjs/S7059/generated-meta.js +2 -1
  296. package/cjs/S7639/generated-meta.js +2 -1
  297. package/cjs/S7790/generated-meta.js +2 -1
  298. package/cjs/S8441/generated-meta.js +2 -1
  299. package/cjs/S8479/generated-meta.js +3 -2
  300. package/cjs/{S4817 → S8754}/generated-meta.js +10 -9
  301. package/cjs/{S5743 → S8754}/meta.js +1 -1
  302. package/cjs/S8754/rule.js +289 -0
  303. package/cjs/{S4784 → S8780}/generated-meta.js +9 -8
  304. package/cjs/{S2255 → S8780}/meta.js +1 -1
  305. package/cjs/S8780/rule.js +321 -0
  306. package/cjs/S8781/generated-meta.js +52 -0
  307. package/cjs/{S4787 → S8781}/meta.js +1 -1
  308. package/cjs/{S4784 → S8781}/rule.js +38 -46
  309. package/cjs/S8782/generated-meta.js +52 -0
  310. package/cjs/{S4784 → S8782}/meta.js +1 -1
  311. package/cjs/S8782/rule.js +148 -0
  312. package/cjs/S8783/generated-meta.js +52 -0
  313. package/cjs/S8783/meta.js +21 -0
  314. package/cjs/S8783/rule.js +167 -0
  315. package/cjs/{S4787 → S8786}/generated-meta.js +9 -8
  316. package/cjs/S8786/meta.js +22 -0
  317. package/cjs/{S4818 → S8786}/rule.js +24 -20
  318. package/cjs/S881/generated-meta.js +2 -1
  319. package/cjs/S888/generated-meta.js +2 -1
  320. package/cjs/S930/generated-meta.js +2 -1
  321. package/cjs/helpers/assertions-chai-common.js +29 -0
  322. package/cjs/helpers/assertions-chai.js +331 -0
  323. package/cjs/helpers/assertions-cypress.js +95 -0
  324. package/cjs/helpers/assertions.js +285 -0
  325. package/cjs/helpers/ast.js +30 -0
  326. package/cjs/helpers/chai.js +1 -1
  327. package/cjs/helpers/configs.js +37 -1
  328. package/cjs/helpers/cypress.js +73 -0
  329. package/cjs/helpers/dependency-manifests/all-in-parent-dirs.js +92 -0
  330. package/cjs/helpers/{package-jsons → dependency-manifests}/closest.js +17 -9
  331. package/cjs/helpers/dependency-manifests/dependencies.js +255 -0
  332. package/cjs/helpers/dependency-manifests/index.js +78 -0
  333. package/cjs/helpers/dependency-manifests/parse.js +51 -0
  334. package/cjs/helpers/dependency-manifests/parsed-dependency-files.js +80 -0
  335. package/cjs/helpers/dependency-manifests/resolvers/deno.js +79 -0
  336. package/cjs/helpers/dependency-manifests/resolvers/helpers.js +41 -0
  337. package/cjs/helpers/dependency-manifests/resolvers/package-json.js +167 -0
  338. package/cjs/helpers/dependency-manifests/resolvers/types.js +4 -0
  339. package/cjs/helpers/files.js +29 -0
  340. package/cjs/helpers/find-up/all-in-parent-dirs.js +1 -0
  341. package/cjs/helpers/find-up/closest.js +1 -0
  342. package/cjs/helpers/find-up/find-minimatch.js +2 -2
  343. package/cjs/helpers/generate-meta.js +1 -1
  344. package/cjs/helpers/mocha-style-test-frameworks.js +132 -0
  345. package/cjs/helpers/mocha.js +17 -7
  346. package/cjs/helpers/module.js +116 -23
  347. package/cjs/helpers/numbers.js +62 -0
  348. package/cjs/helpers/playwright.js +13 -0
  349. package/cjs/helpers/regex/extract.js +21 -9
  350. package/cjs/helpers/regex/flags.js +12 -5
  351. package/cjs/helpers/sinon.js +0 -4
  352. package/cjs/helpers/supertest.js +0 -4
  353. package/cjs/helpers/test-file-pattern.js +63 -0
  354. package/cjs/helpers/type-origin.js +82 -0
  355. package/cjs/helpers/type.js +162 -1
  356. package/cjs/helpers/vitest.js +0 -4
  357. package/cjs/plugin-rules.js +296 -298
  358. package/docs/async-test-assertions.md +7 -0
  359. package/docs/aws-apigateway-public-api.md +1 -1
  360. package/docs/aws-ec2-rds-dms-public.md +1 -1
  361. package/docs/aws-efs-unencrypted.md +1 -1
  362. package/docs/aws-iam-all-resources-accessible.md +1 -1
  363. package/docs/aws-s3-bucket-insecure-http.md +1 -1
  364. package/docs/aws-s3-bucket-public-access.md +1 -1
  365. package/docs/aws-s3-bucket-versioning.md +1 -1
  366. package/docs/aws-sagemaker-unencrypted-notebook.md +1 -1
  367. package/docs/aws-sns-unencrypted-topics.md +1 -1
  368. package/docs/code-eval.md +1 -1
  369. package/docs/confidential-information-logging.md +4 -2
  370. package/docs/content-security-policy.md +1 -1
  371. package/docs/cookie-no-httponly.md +1 -1
  372. package/docs/csrf.md +1 -1
  373. package/docs/disabled-auto-escaping.md +1 -1
  374. package/docs/disabled-resource-integrity.md +1 -1
  375. package/docs/dompurify-unsafe-config.md +2 -0
  376. package/docs/frame-ancestors.md +4 -2
  377. package/docs/hashing.md +1 -1
  378. package/docs/hidden-files.md +4 -2
  379. package/docs/hooks-before-test-cases.md +7 -0
  380. package/docs/no-angular-bypass-sanitization.md +1 -1
  381. package/docs/no-clear-text-protocols.md +1 -1
  382. package/docs/no-commented-code.md +1 -1
  383. package/docs/no-duplicate-test-title.md +7 -0
  384. package/docs/no-empty-test-title.md +7 -0
  385. package/docs/no-floating-point-equality.md +7 -0
  386. package/docs/no-forced-browser-interaction.md +7 -0
  387. package/docs/no-incompatible-assertion-types.md +9 -0
  388. package/docs/no-intrusive-permissions.md +4 -2
  389. package/docs/no-ip-forward.md +4 -2
  390. package/docs/no-mime-sniff.md +1 -1
  391. package/docs/no-mixed-content.md +4 -2
  392. package/docs/no-os-command-from-path.md +1 -1
  393. package/docs/no-referrer-policy.md +1 -1
  394. package/docs/no-small-switch.md +2 -0
  395. package/docs/no-trivial-assertions.md +7 -0
  396. package/docs/os-command.md +4 -2
  397. package/docs/prefer-specific-assertions.md +9 -0
  398. package/docs/production-debug.md +1 -1
  399. package/docs/pseudo-random.md +1 -1
  400. package/docs/slow-regex.md +1 -1
  401. package/docs/sql-queries.md +1 -1
  402. package/docs/strict-transport-security.md +1 -1
  403. package/docs/super-linear-regex.md +7 -0
  404. package/package.json +5 -4
  405. package/types/S100/generated-meta.d.ts +1 -0
  406. package/types/S101/generated-meta.d.ts +1 -0
  407. package/types/S104/generated-meta.d.ts +1 -0
  408. package/types/S105/generated-meta.d.ts +1 -0
  409. package/types/S1066/generated-meta.d.ts +1 -0
  410. package/types/S1067/generated-meta.d.ts +1 -0
  411. package/types/S1110/generated-meta.d.ts +1 -0
  412. package/types/S1119/generated-meta.d.ts +1 -0
  413. package/types/S1121/generated-meta.d.ts +1 -0
  414. package/types/S1125/generated-meta.d.ts +1 -0
  415. package/types/S1126/generated-meta.d.ts +1 -0
  416. package/types/S1128/generated-meta.d.ts +1 -0
  417. package/types/S1134/generated-meta.d.ts +1 -0
  418. package/types/S1135/generated-meta.d.ts +1 -0
  419. package/types/S1154/generated-meta.d.ts +1 -0
  420. package/types/S117/generated-meta.d.ts +1 -0
  421. package/types/S1172/generated-meta.d.ts +1 -0
  422. package/types/S1192/generated-meta.d.ts +1 -0
  423. package/types/S1219/generated-meta.d.ts +1 -0
  424. package/types/S1226/generated-meta.d.ts +1 -0
  425. package/types/S124/generated-meta.d.ts +1 -0
  426. package/types/{S2255 → S1244}/generated-meta.d.ts +3 -2
  427. package/types/S1244/meta.d.ts +2 -0
  428. package/types/S125/generated-meta.d.ts +1 -0
  429. package/types/S126/generated-meta.d.ts +1 -0
  430. package/types/S1264/generated-meta.d.ts +1 -0
  431. package/types/S128/generated-meta.d.ts +1 -0
  432. package/types/S1291/generated-meta.d.ts +1 -0
  433. package/types/S1301/generated-meta.d.ts +2 -1
  434. package/types/S1313/generated-meta.d.ts +1 -0
  435. package/types/S134/generated-meta.d.ts +1 -0
  436. package/types/S135/generated-meta.d.ts +1 -0
  437. package/types/S138/generated-meta.d.ts +1 -0
  438. package/types/S1439/generated-meta.d.ts +1 -0
  439. package/types/S1444/generated-meta.d.ts +1 -0
  440. package/types/S1451/generated-meta.d.ts +1 -0
  441. package/types/S1472/generated-meta.d.ts +1 -0
  442. package/types/S1479/generated-meta.d.ts +1 -0
  443. package/types/S1481/generated-meta.d.ts +1 -0
  444. package/types/S1488/generated-meta.d.ts +1 -0
  445. package/types/S1515/generated-meta.d.ts +1 -0
  446. package/types/S1523/generated-meta.d.ts +1 -0
  447. package/types/S1526/generated-meta.d.ts +1 -0
  448. package/types/S1527/generated-meta.d.ts +1 -0
  449. package/types/S1528/generated-meta.d.ts +1 -0
  450. package/types/S1529/generated-meta.d.ts +1 -0
  451. package/types/S1530/generated-meta.d.ts +1 -0
  452. package/types/S1533/generated-meta.d.ts +1 -0
  453. package/types/S1535/generated-meta.d.ts +1 -0
  454. package/types/S1541/generated-meta.d.ts +1 -0
  455. package/types/S1607/generated-meta.d.ts +1 -0
  456. package/types/S1764/generated-meta.d.ts +1 -0
  457. package/types/S1821/generated-meta.d.ts +1 -0
  458. package/types/S1848/generated-meta.d.ts +1 -0
  459. package/types/S1854/generated-meta.d.ts +1 -0
  460. package/types/S1862/generated-meta.d.ts +1 -0
  461. package/types/S1871/generated-meta.d.ts +1 -0
  462. package/types/S1874/generated-meta.d.ts +1 -0
  463. package/types/S1940/generated-meta.d.ts +1 -0
  464. package/types/S1994/generated-meta.d.ts +1 -0
  465. package/types/S2004/generated-meta.d.ts +1 -0
  466. package/types/S2068/generated-meta.d.ts +1 -0
  467. package/types/S2077/generated-meta.d.ts +1 -0
  468. package/types/S2092/generated-meta.d.ts +1 -0
  469. package/types/S2123/generated-meta.d.ts +1 -0
  470. package/types/S2137/generated-meta.d.ts +1 -0
  471. package/types/S2138/generated-meta.d.ts +1 -0
  472. package/types/S2187/generated-meta.d.ts +1 -0
  473. package/types/S2201/generated-meta.d.ts +1 -0
  474. package/types/S2208/generated-meta.d.ts +1 -0
  475. package/types/S2234/generated-meta.d.ts +1 -0
  476. package/types/S2245/generated-meta.d.ts +1 -0
  477. package/types/S2251/generated-meta.d.ts +1 -0
  478. package/types/S2259/generated-meta.d.ts +1 -0
  479. package/types/S2301/generated-meta.d.ts +1 -0
  480. package/types/S2310/generated-meta.d.ts +1 -0
  481. package/types/S2392/generated-meta.d.ts +1 -0
  482. package/types/S2424/generated-meta.d.ts +1 -0
  483. package/types/S2428/generated-meta.d.ts +1 -0
  484. package/types/S2486/generated-meta.d.ts +1 -0
  485. package/types/S2589/generated-meta.d.ts +1 -0
  486. package/types/S2598/generated-meta.d.ts +1 -0
  487. package/types/S2612/generated-meta.d.ts +1 -0
  488. package/types/S2639/generated-meta.d.ts +1 -0
  489. package/types/S2681/generated-meta.d.ts +1 -0
  490. package/types/S2692/generated-meta.d.ts +1 -0
  491. package/types/S2699/generated-meta.d.ts +1 -0
  492. package/types/S2703/generated-meta.d.ts +1 -0
  493. package/types/S2737/generated-meta.d.ts +1 -0
  494. package/types/S2755/generated-meta.d.ts +1 -0
  495. package/types/S2757/generated-meta.d.ts +1 -0
  496. package/types/S2817/generated-meta.d.ts +1 -0
  497. package/types/S2819/generated-meta.d.ts +1 -0
  498. package/types/S2870/generated-meta.d.ts +1 -0
  499. package/types/S2871/generated-meta.d.ts +1 -0
  500. package/types/S2970/generated-meta.d.ts +1 -0
  501. package/types/S2990/generated-meta.d.ts +1 -0
  502. package/types/S2999/generated-meta.d.ts +1 -0
  503. package/types/S3001/generated-meta.d.ts +1 -0
  504. package/types/S3003/generated-meta.d.ts +1 -0
  505. package/types/S3317/generated-meta.d.ts +1 -0
  506. package/types/S3330/generated-meta.d.ts +1 -0
  507. package/types/S3358/generated-meta.d.ts +1 -0
  508. package/types/S3402/generated-meta.d.ts +1 -0
  509. package/types/S3403/generated-meta.d.ts +1 -0
  510. package/types/S3415/generated-meta.d.ts +1 -0
  511. package/types/S3499/generated-meta.d.ts +1 -0
  512. package/types/S3500/generated-meta.d.ts +1 -0
  513. package/types/S3513/generated-meta.d.ts +1 -0
  514. package/types/S3514/generated-meta.d.ts +1 -0
  515. package/types/S3516/generated-meta.d.ts +1 -0
  516. package/types/S3524/generated-meta.d.ts +1 -0
  517. package/types/S3525/generated-meta.d.ts +1 -0
  518. package/types/S3531/generated-meta.d.ts +1 -0
  519. package/types/S3533/generated-meta.d.ts +1 -0
  520. package/types/S3579/generated-meta.d.ts +1 -0
  521. package/types/S3616/generated-meta.d.ts +1 -0
  522. package/types/S3626/generated-meta.d.ts +1 -0
  523. package/types/S3686/generated-meta.d.ts +1 -0
  524. package/types/S3699/generated-meta.d.ts +1 -0
  525. package/types/S3735/generated-meta.d.ts +1 -0
  526. package/types/S3757/generated-meta.d.ts +1 -0
  527. package/types/S3758/generated-meta.d.ts +1 -0
  528. package/types/S3760/generated-meta.d.ts +1 -0
  529. package/types/S3776/generated-meta.d.ts +1 -0
  530. package/types/S3782/generated-meta.d.ts +1 -0
  531. package/types/S3785/generated-meta.d.ts +1 -0
  532. package/types/S3796/generated-meta.d.ts +1 -0
  533. package/types/S3798/generated-meta.d.ts +1 -0
  534. package/types/S3800/generated-meta.d.ts +1 -0
  535. package/types/S3801/generated-meta.d.ts +1 -0
  536. package/types/S3827/generated-meta.d.ts +1 -0
  537. package/types/S3923/generated-meta.d.ts +1 -0
  538. package/types/S3972/generated-meta.d.ts +1 -0
  539. package/types/S3973/generated-meta.d.ts +1 -0
  540. package/types/S3981/generated-meta.d.ts +1 -0
  541. package/types/S3984/generated-meta.d.ts +1 -0
  542. package/types/S4030/generated-meta.d.ts +1 -0
  543. package/types/S4036/generated-meta.d.ts +1 -0
  544. package/types/S4043/generated-meta.d.ts +1 -0
  545. package/types/S4139/generated-meta.d.ts +1 -0
  546. package/types/S4143/generated-meta.d.ts +1 -0
  547. package/types/S4144/generated-meta.d.ts +1 -0
  548. package/types/S4158/generated-meta.d.ts +1 -0
  549. package/types/S4165/generated-meta.d.ts +1 -0
  550. package/types/S4322/generated-meta.d.ts +1 -0
  551. package/types/S4323/generated-meta.d.ts +1 -0
  552. package/types/S4324/generated-meta.d.ts +1 -0
  553. package/types/S4328/generated-meta.d.ts +1 -0
  554. package/types/S4335/generated-meta.d.ts +1 -0
  555. package/types/S4423/generated-meta.d.ts +1 -0
  556. package/types/S4426/generated-meta.d.ts +1 -0
  557. package/types/S4502/generated-meta.d.ts +1 -0
  558. package/types/S4507/generated-meta.d.ts +1 -0
  559. package/types/S4524/generated-meta.d.ts +1 -0
  560. package/types/S4619/generated-meta.d.ts +1 -0
  561. package/types/S4621/generated-meta.d.ts +1 -0
  562. package/types/S4622/generated-meta.d.ts +1 -0
  563. package/types/S4623/generated-meta.d.ts +1 -0
  564. package/types/S4624/generated-meta.d.ts +1 -0
  565. package/types/S4634/generated-meta.d.ts +1 -0
  566. package/types/S4721/generated-meta.d.ts +2 -1
  567. package/types/S4782/generated-meta.d.ts +1 -0
  568. package/types/S4790/generated-meta.d.ts +1 -0
  569. package/types/S4798/generated-meta.d.ts +1 -0
  570. package/types/S4822/generated-meta.d.ts +1 -0
  571. package/types/S4830/generated-meta.d.ts +1 -0
  572. package/types/S5042/generated-meta.d.ts +1 -0
  573. package/types/S5122/generated-meta.d.ts +1 -0
  574. package/types/S5148/generated-meta.d.ts +1 -0
  575. package/types/S5247/generated-meta.d.ts +1 -0
  576. package/types/S5256/generated-meta.d.ts +1 -0
  577. package/types/S5257/generated-meta.d.ts +1 -0
  578. package/types/S5260/generated-meta.d.ts +1 -0
  579. package/types/S5264/generated-meta.d.ts +1 -0
  580. package/types/S5332/generated-meta.d.ts +1 -0
  581. package/types/S5443/generated-meta.d.ts +1 -0
  582. package/types/S5527/generated-meta.d.ts +1 -0
  583. package/types/S5542/generated-meta.d.ts +1 -0
  584. package/types/S5547/generated-meta.d.ts +1 -0
  585. package/types/S5604/generated-meta.d.ts +2 -1
  586. package/types/S5659/generated-meta.d.ts +1 -0
  587. package/types/S5689/generated-meta.d.ts +1 -0
  588. package/types/S5691/generated-meta.d.ts +2 -1
  589. package/types/S5693/generated-meta.d.ts +1 -0
  590. package/types/S5725/generated-meta.d.ts +1 -0
  591. package/types/S5728/generated-meta.d.ts +1 -0
  592. package/types/S5730/generated-meta.d.ts +2 -1
  593. package/types/S5732/generated-meta.d.ts +2 -1
  594. package/types/S5734/generated-meta.d.ts +1 -0
  595. package/types/S5736/generated-meta.d.ts +1 -0
  596. package/types/S5739/generated-meta.d.ts +1 -0
  597. package/types/S5757/generated-meta.d.ts +2 -1
  598. package/types/S5759/generated-meta.d.ts +2 -1
  599. package/types/S5842/generated-meta.d.ts +1 -0
  600. package/types/S5843/generated-meta.d.ts +1 -0
  601. package/types/S5845/generated-meta.d.ts +18 -0
  602. package/types/S5845/meta.d.ts +2 -0
  603. package/types/S5850/generated-meta.d.ts +1 -0
  604. package/types/S5852/generated-meta.d.ts +1 -0
  605. package/types/S5856/generated-meta.d.ts +1 -0
  606. package/types/S5860/generated-meta.d.ts +1 -0
  607. package/types/S5863/generated-meta.d.ts +1 -0
  608. package/types/S5867/generated-meta.d.ts +1 -0
  609. package/types/S5868/generated-meta.d.ts +1 -0
  610. package/types/S5869/generated-meta.d.ts +1 -0
  611. package/types/S5876/generated-meta.d.ts +1 -0
  612. package/types/S5906/assertion-suggestions.d.ts +7 -0
  613. package/types/S5906/assertion-utils.d.ts +14 -0
  614. package/types/S5906/cypress-suggestions.d.ts +4 -0
  615. package/types/S5906/expect-chain.d.ts +5 -0
  616. package/types/S5906/generated-meta.d.ts +18 -0
  617. package/types/S5906/meta.d.ts +2 -0
  618. package/types/S5906/playwright-suggestions.d.ts +4 -0
  619. package/types/{S4817 → S5914}/generated-meta.d.ts +5 -4
  620. package/types/S5914/meta.d.ts +2 -0
  621. package/types/S5958/generated-meta.d.ts +1 -0
  622. package/types/S5973/generated-meta.d.ts +1 -0
  623. package/types/S6019/generated-meta.d.ts +1 -0
  624. package/types/S6035/generated-meta.d.ts +1 -0
  625. package/types/S6079/generated-meta.d.ts +1 -0
  626. package/types/S6080/generated-meta.d.ts +1 -0
  627. package/types/S6092/generated-meta.d.ts +1 -0
  628. package/types/S6249/generated-meta.d.ts +1 -0
  629. package/types/S6252/generated-meta.d.ts +1 -0
  630. package/types/S6265/generated-meta.d.ts +1 -0
  631. package/types/S6268/generated-meta.d.ts +1 -0
  632. package/types/S6270/generated-meta.d.ts +1 -0
  633. package/types/S6275/generated-meta.d.ts +1 -0
  634. package/types/S6281/generated-meta.d.ts +1 -0
  635. package/types/S6302/generated-meta.d.ts +1 -0
  636. package/types/S6303/generated-meta.d.ts +1 -0
  637. package/types/S6304/generated-meta.d.ts +1 -0
  638. package/types/S6308/generated-meta.d.ts +1 -0
  639. package/types/S6317/generated-meta.d.ts +1 -0
  640. package/types/S6319/generated-meta.d.ts +1 -0
  641. package/types/S6321/generated-meta.d.ts +1 -0
  642. package/types/S6323/generated-meta.d.ts +1 -0
  643. package/types/S6324/generated-meta.d.ts +1 -0
  644. package/types/S6326/generated-meta.d.ts +1 -0
  645. package/types/S6327/generated-meta.d.ts +1 -0
  646. package/types/S6328/generated-meta.d.ts +1 -0
  647. package/types/S6329/generated-meta.d.ts +1 -0
  648. package/types/S6330/generated-meta.d.ts +1 -0
  649. package/types/S6331/generated-meta.d.ts +1 -0
  650. package/types/S6332/generated-meta.d.ts +1 -0
  651. package/types/S6333/generated-meta.d.ts +1 -0
  652. package/types/S6351/generated-meta.d.ts +1 -0
  653. package/types/S6353/generated-meta.d.ts +1 -0
  654. package/types/S6397/generated-meta.d.ts +1 -0
  655. package/types/S6418/generated-meta.d.ts +1 -0
  656. package/types/S6426/generated-meta.d.ts +1 -0
  657. package/types/S6437/generated-meta.d.ts +1 -0
  658. package/types/S6439/generated-meta.d.ts +1 -0
  659. package/types/S6442/generated-meta.d.ts +1 -0
  660. package/types/S6443/generated-meta.d.ts +1 -0
  661. package/types/S6486/generated-meta.d.ts +1 -0
  662. package/types/S6564/generated-meta.d.ts +1 -0
  663. package/types/S6594/generated-meta.d.ts +1 -0
  664. package/types/S6627/generated-meta.d.ts +1 -0
  665. package/types/S6759/generated-meta.d.ts +1 -0
  666. package/types/S6958/generated-meta.d.ts +1 -0
  667. package/types/S6959/generated-meta.d.ts +1 -0
  668. package/types/S7059/generated-meta.d.ts +1 -0
  669. package/types/S7639/generated-meta.d.ts +1 -0
  670. package/types/S7790/generated-meta.d.ts +1 -0
  671. package/types/S8441/generated-meta.d.ts +1 -0
  672. package/types/S8479/generated-meta.d.ts +2 -1
  673. package/types/S8754/generated-meta.d.ts +18 -0
  674. package/types/{S5743 → S8754}/meta.d.ts +1 -1
  675. package/types/{S4787 → S8780}/generated-meta.d.ts +4 -3
  676. package/types/S8780/meta.d.ts +2 -0
  677. package/types/S8781/generated-meta.d.ts +18 -0
  678. package/types/S8781/meta.d.ts +2 -0
  679. package/types/S8782/generated-meta.d.ts +18 -0
  680. package/types/S8782/meta.d.ts +2 -0
  681. package/types/S8783/generated-meta.d.ts +18 -0
  682. package/types/S8783/meta.d.ts +2 -0
  683. package/types/{S4784 → S8786}/generated-meta.d.ts +4 -3
  684. package/types/S8786/meta.d.ts +2 -0
  685. package/types/S881/generated-meta.d.ts +1 -0
  686. package/types/S888/generated-meta.d.ts +1 -0
  687. package/types/S930/generated-meta.d.ts +1 -0
  688. package/types/helpers/assertions-chai-common.d.ts +7 -0
  689. package/types/helpers/assertions-chai.d.ts +4 -0
  690. package/types/helpers/assertions-cypress.d.ts +7 -0
  691. package/types/helpers/assertions.d.ts +39 -0
  692. package/types/helpers/ast.d.ts +10 -0
  693. package/types/helpers/configs.d.ts +7 -38
  694. package/types/helpers/cypress.d.ts +11 -0
  695. package/types/helpers/dependency-manifests/all-in-parent-dirs.d.ts +18 -0
  696. package/types/helpers/dependency-manifests/closest.d.ts +5 -0
  697. package/types/helpers/{package-jsons → dependency-manifests}/dependencies.d.ts +22 -17
  698. package/types/helpers/dependency-manifests/index.d.ts +22 -0
  699. package/types/helpers/dependency-manifests/parse.d.ts +12 -0
  700. package/types/helpers/dependency-manifests/parsed-dependency-files.d.ts +8 -0
  701. package/types/helpers/dependency-manifests/resolvers/deno.d.ts +12 -0
  702. package/types/helpers/dependency-manifests/resolvers/helpers.d.ts +12 -0
  703. package/types/helpers/dependency-manifests/resolvers/package-json.d.ts +2 -0
  704. package/types/helpers/dependency-manifests/resolvers/types.d.ts +46 -0
  705. package/types/helpers/files.d.ts +10 -2
  706. package/types/helpers/generate-meta.d.ts +5 -0
  707. package/types/helpers/mocha-style-test-frameworks.d.ts +19 -0
  708. package/types/helpers/mocha.d.ts +7 -0
  709. package/types/helpers/module.d.ts +14 -8
  710. package/types/helpers/numbers.d.ts +4 -0
  711. package/types/helpers/playwright.d.ts +2 -0
  712. package/types/helpers/regex/extract.d.ts +7 -3
  713. package/types/helpers/sinon.d.ts +0 -1
  714. package/types/helpers/supertest.d.ts +0 -1
  715. package/types/helpers/test-file-pattern.d.ts +17 -0
  716. package/types/helpers/type-origin.d.ts +31 -0
  717. package/types/helpers/type.d.ts +92 -1
  718. package/types/helpers/vitest.d.ts +0 -1
  719. package/types/plugin-rules.d.ts +10 -11
  720. package/cjs/S2255/rule.js +0 -111
  721. package/cjs/S4787/rule.js +0 -124
  722. package/cjs/S4817/rule.js +0 -103
  723. package/cjs/S4818/generated-meta.js +0 -51
  724. package/cjs/S4818/meta.js +0 -21
  725. package/cjs/S4823/generated-meta.js +0 -51
  726. package/cjs/S4823/meta.js +0 -21
  727. package/cjs/S4823/rule.js +0 -75
  728. package/cjs/S4829/generated-meta.js +0 -51
  729. package/cjs/S4829/meta.js +0 -21
  730. package/cjs/S4829/rule.js +0 -75
  731. package/cjs/S5742/generated-meta.js +0 -51
  732. package/cjs/S5742/meta.js +0 -22
  733. package/cjs/S5742/rule.js +0 -75
  734. package/cjs/S5743/generated-meta.js +0 -51
  735. package/cjs/S5743/rule.js +0 -78
  736. package/cjs/S6245/generated-meta.js +0 -51
  737. package/cjs/S6245/meta.js +0 -22
  738. package/cjs/S6245/rule.js +0 -87
  739. package/cjs/S6299/generated-meta.js +0 -51
  740. package/cjs/S6299/index.js +0 -21
  741. package/cjs/S6299/meta.js +0 -21
  742. package/cjs/S6299/rule.js +0 -93
  743. package/cjs/helpers/package-jsons/all-in-parent-dirs.js +0 -31
  744. package/cjs/helpers/package-jsons/dependencies.js +0 -221
  745. package/cjs/helpers/package-jsons/index.js +0 -42
  746. package/cjs/helpers/package-jsons/parse.js +0 -79
  747. package/docs/aws-s3-bucket-server-encryption.md +0 -9
  748. package/docs/certificate-transparency.md +0 -9
  749. package/docs/cookies.md +0 -9
  750. package/docs/dns-prefetching.md +0 -9
  751. package/docs/encryption.md +0 -9
  752. package/docs/no-vue-bypass-sanitization.md +0 -9
  753. package/docs/process-argv.md +0 -9
  754. package/docs/regular-expr.md +0 -9
  755. package/docs/sockets.md +0 -9
  756. package/docs/standard-input.md +0 -9
  757. package/docs/xpath.md +0 -9
  758. package/types/S2255/meta.d.ts +0 -2
  759. package/types/S4784/meta.d.ts +0 -2
  760. package/types/S4787/meta.d.ts +0 -2
  761. package/types/S4817/meta.d.ts +0 -2
  762. package/types/S4818/generated-meta.d.ts +0 -17
  763. package/types/S4818/meta.d.ts +0 -2
  764. package/types/S4823/generated-meta.d.ts +0 -17
  765. package/types/S4823/meta.d.ts +0 -2
  766. package/types/S4829/generated-meta.d.ts +0 -17
  767. package/types/S4829/meta.d.ts +0 -2
  768. package/types/S5742/generated-meta.d.ts +0 -17
  769. package/types/S5742/meta.d.ts +0 -3
  770. package/types/S5743/generated-meta.d.ts +0 -17
  771. package/types/S6245/generated-meta.d.ts +0 -17
  772. package/types/S6245/meta.d.ts +0 -3
  773. package/types/S6299/generated-meta.d.ts +0 -17
  774. package/types/S6299/index.d.ts +0 -1
  775. package/types/S6299/meta.d.ts +0 -2
  776. package/types/S6299/rule.d.ts +0 -2
  777. package/types/helpers/package-jsons/all-in-parent-dirs.d.ts +0 -10
  778. package/types/helpers/package-jsons/closest.d.ts +0 -2
  779. package/types/helpers/package-jsons/index.d.ts +0 -8
  780. package/types/helpers/package-jsons/parse.d.ts +0 -13
  781. /package/cjs/{S2255 → S1244}/index.js +0 -0
  782. /package/cjs/{S4784 → S5845}/index.js +0 -0
  783. /package/cjs/{S4787 → S5906}/index.js +0 -0
  784. /package/cjs/{S4817 → S5914}/index.js +0 -0
  785. /package/cjs/{S4818 → S8754}/index.js +0 -0
  786. /package/cjs/{S4823 → S8780}/index.js +0 -0
  787. /package/cjs/{S4829 → S8781}/index.js +0 -0
  788. /package/cjs/{S5742 → S8782}/index.js +0 -0
  789. /package/cjs/{S5743 → S8783}/index.js +0 -0
  790. /package/cjs/{S6245 → S8786}/index.js +0 -0
  791. /package/types/{S2255 → S1244}/index.d.ts +0 -0
  792. /package/types/{S2255 → S1244}/rule.d.ts +0 -0
  793. /package/types/{S4784 → S5845}/index.d.ts +0 -0
  794. /package/types/{S4784 → S5845}/rule.d.ts +0 -0
  795. /package/types/{S4787 → S5906}/index.d.ts +0 -0
  796. /package/types/{S4787 → S5906}/rule.d.ts +0 -0
  797. /package/types/{S4817 → S5914}/index.d.ts +0 -0
  798. /package/types/{S4817 → S5914}/rule.d.ts +0 -0
  799. /package/types/{S4818 → S8754}/index.d.ts +0 -0
  800. /package/types/{S4818 → S8754}/rule.d.ts +0 -0
  801. /package/types/{S4823 → S8780}/index.d.ts +0 -0
  802. /package/types/{S4823 → S8780}/rule.d.ts +0 -0
  803. /package/types/{S4829 → S8781}/index.d.ts +0 -0
  804. /package/types/{S4829 → S8781}/rule.d.ts +0 -0
  805. /package/types/{S5742 → S8782}/index.d.ts +0 -0
  806. /package/types/{S5742 → S8782}/rule.d.ts +0 -0
  807. /package/types/{S5743 → S8783}/index.d.ts +0 -0
  808. /package/types/{S5743 → S8783}/rule.d.ts +0 -0
  809. /package/types/{S6245 → S8786}/index.d.ts +0 -0
  810. /package/types/{S6245 → S8786}/rule.d.ts +0 -0
@@ -0,0 +1,279 @@
1
+ "use strict";
2
+ /*
3
+ * SonarQube JavaScript Plugin
4
+ * Copyright (C) SonarSource Sàrl
5
+ * mailto:info AT sonarsource DOT com
6
+ *
7
+ * You can redistribute and/or modify this program under the terms of
8
+ * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ * See the Sonar Source-Available License for more details.
14
+ *
15
+ * You should have received a copy of the Sonar Source-Available License
16
+ * along with this program; if not, see https://sonarsource.com/license/ssal/
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.getBooleanExpressionSuggestion = getBooleanExpressionSuggestion;
20
+ exports.chaiShouldReceiver = chaiShouldReceiver;
21
+ const ast_js_1 = require("../helpers/ast.js");
22
+ const assertion_utils_js_1 = require("./assertion-utils.js");
23
+ const STRICT_EQUALITY_OPERATORS = new Set(['===', '!==']);
24
+ const STRING_LIKE_IDENTIFIER = /(?:text|string|message|content|html)$/i;
25
+ const NUMERIC_IDENTIFIER = /(?:amount|count|delta|depth|diff|duration|elapsed|height|index|length|level|limit|number|price|score|size|total|width)$/i;
26
+ const DATE_LIKE_IDENTIFIER = /(?:date|time|timestamp)$/i;
27
+ function getBooleanExpressionSuggestion(actual, positive, family, sourceCode, node, assertObject = 'assert', extraArguments = '') {
28
+ if (actual.type === 'BinaryExpression') {
29
+ return getBinaryExpressionSuggestion(actual, positive, family, sourceCode, node, assertObject, extraArguments);
30
+ }
31
+ return getIncludesSuggestion(actual, positive, family, sourceCode, node, assertObject, extraArguments);
32
+ }
33
+ function chaiShouldReceiver(source, node) {
34
+ return isSafeChaiShouldReceiver(node) ? source : `(${source})`;
35
+ }
36
+ const SAFE_CHAI_SHOULD_RECEIVER_TYPES = new Set([
37
+ 'Identifier',
38
+ 'MemberExpression',
39
+ 'CallExpression',
40
+ 'ThisExpression',
41
+ ]);
42
+ function isSafeChaiShouldReceiver(node) {
43
+ return SAFE_CHAI_SHOULD_RECEIVER_TYPES.has(node.type);
44
+ }
45
+ function getBinaryExpressionSuggestion(actual, positive, family, sourceCode, node, assertObject, extraArguments) {
46
+ const left = sourceCode.getText(actual.left);
47
+ const right = sourceCode.getText(actual.right);
48
+ const suggestionContext = { family, sourceCode, node, assertObject, extraArguments };
49
+ if (STRICT_EQUALITY_OPERATORS.has(actual.operator)) {
50
+ const same = actual.operator === '===' ? positive : !positive;
51
+ const specificSuggestion = buildSpecificEqualitySuggestion(actual, same, suggestionContext);
52
+ if (specificSuggestion !== undefined) {
53
+ return specificSuggestion;
54
+ }
55
+ return buildEqualitySuggestion(actual.left, right, same, suggestionContext);
56
+ }
57
+ if (actual.operator === 'instanceof') {
58
+ return buildInstanceofSuggestion(left, actual.left, right, positive, suggestionContext);
59
+ }
60
+ const comparison = isNumericComparison(actual)
61
+ ? getNumericComparison(actual.operator, positive)
62
+ : null;
63
+ if (comparison) {
64
+ return buildNumericComparisonSuggestion(left, actual.left, right, comparison, suggestionContext);
65
+ }
66
+ return null;
67
+ }
68
+ function buildSpecificEqualitySuggestion(actual, same, context) {
69
+ const leftNullish = getNullishKind(actual.left);
70
+ if (leftNullish) {
71
+ return buildNullishEqualitySuggestion(actual.right, leftNullish, same, context);
72
+ }
73
+ const rightNullish = getNullishKind(actual.right);
74
+ if (rightNullish) {
75
+ return buildNullishEqualitySuggestion(actual.left, rightNullish, same, context);
76
+ }
77
+ if ((0, assertion_utils_js_1.isLengthAccess)(actual.left)) {
78
+ return buildLengthEqualitySuggestion(actual.left.object, context.sourceCode.getText(actual.right), same, context);
79
+ }
80
+ if ((0, assertion_utils_js_1.isLengthAccess)(actual.right)) {
81
+ return buildLengthEqualitySuggestion(actual.right.object, context.sourceCode.getText(actual.left), same, context);
82
+ }
83
+ return undefined;
84
+ }
85
+ function getNullishKind(node) {
86
+ if ((0, assertion_utils_js_1.isNullLiteral)(node)) {
87
+ return 'null';
88
+ }
89
+ if ((0, assertion_utils_js_1.isUndefinedExpression)(node)) {
90
+ return 'undefined';
91
+ }
92
+ return null;
93
+ }
94
+ function buildNullishEqualitySuggestion(actualNode, nullish, same, context) {
95
+ const { family, sourceCode, node, assertObject, extraArguments } = context;
96
+ const actual = sourceCode.getText(actualNode);
97
+ if (family === 'jest' || family === 'jasmine') {
98
+ if (nullish === 'null') {
99
+ return (0, assertion_utils_js_1.replacement)(`expect(${actual})${negation(same)}.toBeNull()`, node);
100
+ }
101
+ return (0, assertion_utils_js_1.replacement)(same ? `expect(${actual}).toBeUndefined()` : `expect(${actual}).toBeDefined()`, node);
102
+ }
103
+ if (family === 'assert') {
104
+ const method = getAssertNullishMethod(nullish, same);
105
+ return (0, assertion_utils_js_1.replacement)(`${assertObject}.${method}(${actual}${extraArguments})`, node);
106
+ }
107
+ if (family === 'chai-should') {
108
+ return (0, assertion_utils_js_1.replacement)(`${chaiShouldReceiver(actual, actualNode)}.should${negation(same)}.be.${nullish}`, node);
109
+ }
110
+ return (0, assertion_utils_js_1.replacement)(`expect(${actual}${extraArguments}).to${negation(same)}.be.${nullish}`, node);
111
+ }
112
+ function getAssertNullishMethod(nullish, same) {
113
+ if (nullish === 'null') {
114
+ return same ? 'isNull' : 'isNotNull';
115
+ }
116
+ return same ? 'isUndefined' : 'isDefined';
117
+ }
118
+ function buildLengthEqualitySuggestion(actualNode, expected, same, context) {
119
+ const { family, sourceCode, node, assertObject, extraArguments } = context;
120
+ const actual = sourceCode.getText(actualNode);
121
+ if (family === 'jest' || family === 'jasmine') {
122
+ const matcher = family === 'jasmine' ? 'toHaveSize' : 'toHaveLength';
123
+ return (0, assertion_utils_js_1.replacement)(`expect(${actual})${negation(same)}.${matcher}(${expected})`, node);
124
+ }
125
+ if (family === 'assert') {
126
+ return same
127
+ ? (0, assertion_utils_js_1.replacement)(`${assertObject}.lengthOf(${actual}, ${expected}${extraArguments})`, node)
128
+ : null;
129
+ }
130
+ if (family === 'chai-should') {
131
+ return (0, assertion_utils_js_1.replacement)(`${chaiShouldReceiver(actual, actualNode)}.should${negation(same)}.have.lengthOf(${expected})`, node);
132
+ }
133
+ return (0, assertion_utils_js_1.replacement)(`expect(${actual}${extraArguments}).to${negation(same)}.have.lengthOf(${expected})`, node);
134
+ }
135
+ function buildEqualitySuggestion(leftNode, right, same, context) {
136
+ const { family, sourceCode, node, assertObject, extraArguments } = context;
137
+ const left = sourceCode.getText(leftNode);
138
+ if (family === 'jest' || family === 'jasmine') {
139
+ return (0, assertion_utils_js_1.replacement)(`expect(${left})${negation(same)}.toBe(${right})`, node);
140
+ }
141
+ if (family === 'assert') {
142
+ return (0, assertion_utils_js_1.replacement)(`${assertObject}.${same ? 'strictEqual' : 'notStrictEqual'}(${left}, ${right}${extraArguments})`, node);
143
+ }
144
+ if (family === 'chai-should') {
145
+ return (0, assertion_utils_js_1.replacement)(`${chaiShouldReceiver(left, leftNode)}.should${negation(same)}.equal(${right})`, node);
146
+ }
147
+ return (0, assertion_utils_js_1.replacement)(`expect(${left}${extraArguments}).to${negation(same)}.equal(${right})`, node);
148
+ }
149
+ function buildInstanceofSuggestion(left, leftNode, right, positive, context) {
150
+ const { family, node, assertObject, extraArguments } = context;
151
+ if (family === 'jest' || family === 'jasmine') {
152
+ return (0, assertion_utils_js_1.replacement)(`expect(${left})${negation(positive)}.toBeInstanceOf(${right})`, node);
153
+ }
154
+ if (family === 'assert') {
155
+ return (0, assertion_utils_js_1.replacement)(`${assertObject}.${positive ? 'instanceOf' : 'notInstanceOf'}(${left}, ${right}${extraArguments})`, node);
156
+ }
157
+ if (family === 'chai-should') {
158
+ return (0, assertion_utils_js_1.replacement)(`${chaiShouldReceiver(left, leftNode)}.should${negation(positive)}.be.instanceOf(${right})`, node);
159
+ }
160
+ return (0, assertion_utils_js_1.replacement)(`expect(${left}${extraArguments}).to${negation(positive)}.be.instanceOf(${right})`, node);
161
+ }
162
+ function buildNumericComparisonSuggestion(left, leftNode, right, comparison, context) {
163
+ const { family, node, assertObject, extraArguments } = context;
164
+ if (family === 'jest' || family === 'jasmine') {
165
+ return (0, assertion_utils_js_1.replacement)(`expect(${left}).${comparison.jest}(${right})`, node);
166
+ }
167
+ if (family === 'assert') {
168
+ return (0, assertion_utils_js_1.replacement)(`${assertObject}.${comparison.assert}(${left}, ${right}${extraArguments})`, node);
169
+ }
170
+ if (family === 'chai-should') {
171
+ return (0, assertion_utils_js_1.replacement)(`${chaiShouldReceiver(left, leftNode)}.should.be.${comparison.chai}(${right})`, node);
172
+ }
173
+ return (0, assertion_utils_js_1.replacement)(`expect(${left}${extraArguments}).to.be.${comparison.chai}(${right})`, node);
174
+ }
175
+ function getIncludesSuggestion(actual, positive, family, sourceCode, node, assertObject, extraArguments) {
176
+ if (actual.type !== 'CallExpression' ||
177
+ !(0, ast_js_1.isMethodCall)(actual) ||
178
+ !(0, ast_js_1.isIdentifier)(actual.callee.property, 'includes') ||
179
+ actual.arguments.length !== 1 ||
180
+ !isTrustedStringReceiver(actual.callee.object)) {
181
+ return null;
182
+ }
183
+ const receiver = sourceCode.getText(actual.callee.object);
184
+ const needle = sourceCode.getText(actual.arguments[0]);
185
+ if (family === 'jest' || family === 'jasmine') {
186
+ return (0, assertion_utils_js_1.replacement)(`expect(${receiver})${negation(positive)}.toContain(${needle})`, node);
187
+ }
188
+ if (family === 'assert') {
189
+ return (0, assertion_utils_js_1.replacement)(`${assertObject}.${positive ? 'include' : 'notInclude'}(${receiver}, ${needle}${extraArguments})`, node);
190
+ }
191
+ if (family === 'chai-should') {
192
+ return (0, assertion_utils_js_1.replacement)(`${chaiShouldReceiver(receiver, actual.callee.object)}.should${negation(positive)}.include(${needle})`, node);
193
+ }
194
+ return (0, assertion_utils_js_1.replacement)(`expect(${receiver}${extraArguments}).to${negation(positive)}.include(${needle})`, node);
195
+ }
196
+ function negation(positive) {
197
+ return positive ? '' : '.not';
198
+ }
199
+ function isTrustedStringReceiver(node) {
200
+ if (node.type === 'Literal') {
201
+ return typeof node.value === 'string';
202
+ }
203
+ if (node.type === 'TemplateLiteral') {
204
+ return node.expressions.length === 0;
205
+ }
206
+ return (0, ast_js_1.isIdentifier)(node) && STRING_LIKE_IDENTIFIER.test(node.name);
207
+ }
208
+ function isNumericComparison(node) {
209
+ return (isKnownNumericOperand(node.left) &&
210
+ isKnownNumericOperand(node.right) &&
211
+ !isKnownNonNumericOperand(node.left) &&
212
+ !isKnownNonNumericOperand(node.right));
213
+ }
214
+ function isKnownNumericOperand(node) {
215
+ if (node.type === 'Literal') {
216
+ return typeof node.value === 'number' || typeof node.value === 'bigint';
217
+ }
218
+ if (node.type === 'UnaryExpression' && ['+', '-'].includes(node.operator)) {
219
+ return isKnownNumericOperand(node.argument);
220
+ }
221
+ if ((0, ast_js_1.isIdentifier)(node)) {
222
+ return NUMERIC_IDENTIFIER.test(node.name);
223
+ }
224
+ if (node.type === 'MemberExpression' && !node.computed && (0, ast_js_1.isIdentifier)(node.property)) {
225
+ return NUMERIC_IDENTIFIER.test(node.property.name);
226
+ }
227
+ return false;
228
+ }
229
+ function isKnownNonNumericOperand(node) {
230
+ if (node.type === 'Literal') {
231
+ return typeof node.value === 'string';
232
+ }
233
+ if (node.type === 'TemplateLiteral') {
234
+ return node.expressions.length === 0;
235
+ }
236
+ if (node.type === 'NewExpression' && (0, ast_js_1.isIdentifier)(node.callee, 'Date')) {
237
+ return true;
238
+ }
239
+ if (node.type === 'CallExpression' && (0, ast_js_1.isIdentifier)(node.callee, 'Date')) {
240
+ return true;
241
+ }
242
+ if ((0, ast_js_1.isIdentifier)(node)) {
243
+ return STRING_LIKE_IDENTIFIER.test(node.name) || DATE_LIKE_IDENTIFIER.test(node.name);
244
+ }
245
+ if (node.type === 'MemberExpression' && !node.computed && (0, ast_js_1.isIdentifier)(node.property)) {
246
+ return (STRING_LIKE_IDENTIFIER.test(node.property.name) ||
247
+ DATE_LIKE_IDENTIFIER.test(node.property.name));
248
+ }
249
+ return false;
250
+ }
251
+ function getNumericComparison(operator, positive) {
252
+ const effective = positive ? operator : invertComparison(operator);
253
+ switch (effective) {
254
+ case '>':
255
+ return { jest: 'toBeGreaterThan', chai: 'above', assert: 'isAbove' };
256
+ case '>=':
257
+ return { jest: 'toBeGreaterThanOrEqual', chai: 'at.least', assert: 'isAtLeast' };
258
+ case '<':
259
+ return { jest: 'toBeLessThan', chai: 'below', assert: 'isBelow' };
260
+ case '<=':
261
+ return { jest: 'toBeLessThanOrEqual', chai: 'at.most', assert: 'isAtMost' };
262
+ default:
263
+ return null;
264
+ }
265
+ }
266
+ function invertComparison(operator) {
267
+ switch (operator) {
268
+ case '>':
269
+ return '<=';
270
+ case '>=':
271
+ return '<';
272
+ case '<':
273
+ return '>=';
274
+ case '<=':
275
+ return '>';
276
+ default:
277
+ return null;
278
+ }
279
+ }
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ /*
3
+ * SonarQube JavaScript Plugin
4
+ * Copyright (C) SonarSource Sàrl
5
+ * mailto:info AT sonarsource DOT com
6
+ *
7
+ * You can redistribute and/or modify this program under the terms of
8
+ * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ * See the Sonar Source-Available License for more details.
14
+ *
15
+ * You should have received a copy of the Sonar Source-Available License
16
+ * along with this program; if not, see https://sonarsource.com/license/ssal/
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.isPlaywrightLocatorExpression = isPlaywrightLocatorExpression;
20
+ exports.trackPlaywrightLocators = trackPlaywrightLocators;
21
+ exports.isLengthAccess = isLengthAccess;
22
+ exports.isNullLiteral = isNullLiteral;
23
+ exports.isUndefinedExpression = isUndefinedExpression;
24
+ exports.isNaNExpression = isNaNExpression;
25
+ exports.getBooleanValue = getBooleanValue;
26
+ exports.replacement = replacement;
27
+ const ast_js_1 = require("../helpers/ast.js");
28
+ const PLAYWRIGHT_LOCATOR_FACTORIES = new Set([
29
+ 'getByRole',
30
+ 'getByText',
31
+ 'getByLabel',
32
+ 'getByPlaceholder',
33
+ 'getByAltText',
34
+ 'getByTitle',
35
+ 'getByTestId',
36
+ 'locator',
37
+ 'frameLocator',
38
+ ]);
39
+ function isPlaywrightLocatorExpression(context, node, locatorVariables) {
40
+ if ((0, ast_js_1.isIdentifier)(node)) {
41
+ const variable = (0, ast_js_1.getVariableFromName)(context, node.name, node);
42
+ return variable !== undefined && locatorVariables.has(variable);
43
+ }
44
+ if (node.type !== 'CallExpression' || !(0, ast_js_1.isMethodCall)(node)) {
45
+ return false;
46
+ }
47
+ const property = node.callee.property;
48
+ return ((0, ast_js_1.isIdentifier)(property) &&
49
+ PLAYWRIGHT_LOCATOR_FACTORIES.has(property.name) &&
50
+ isPlaywrightLocatorRoot(context, node.callee.object, locatorVariables));
51
+ }
52
+ function isPlaywrightLocatorRoot(context, node, locatorVariables) {
53
+ if ((0, ast_js_1.isIdentifier)(node)) {
54
+ if (node.name === 'page') {
55
+ return true;
56
+ }
57
+ const variable = (0, ast_js_1.getVariableFromName)(context, node.name, node);
58
+ return variable !== undefined && locatorVariables.has(variable);
59
+ }
60
+ return isPlaywrightLocatorExpression(context, node, locatorVariables);
61
+ }
62
+ // As soon as a third rule consumes this, promote it out of S5906/ into a
63
+ // shared module under helpers/ (e.g. helpers/playwright-locators.ts) so it no
64
+ // longer lives under a specific rule's directory.
65
+ function trackPlaywrightLocators(context, locators) {
66
+ return {
67
+ VariableDeclarator(node) {
68
+ if (node.type !== 'VariableDeclarator' || !(0, ast_js_1.isIdentifier)(node.id)) {
69
+ return;
70
+ }
71
+ if (node.init && isPlaywrightLocatorExpression(context, node.init, locators)) {
72
+ const variable = context.sourceCode.getDeclaredVariables(node)[0];
73
+ if (variable) {
74
+ locators.add(variable);
75
+ }
76
+ }
77
+ },
78
+ };
79
+ }
80
+ function isLengthAccess(node) {
81
+ return (node.type === 'MemberExpression' && !node.computed && (0, ast_js_1.isIdentifier)(node.property, 'length'));
82
+ }
83
+ function isNullLiteral(node) {
84
+ return node.type === 'Literal' && node.value === null;
85
+ }
86
+ function isUndefinedExpression(node) {
87
+ return (0, ast_js_1.isIdentifier)(node, 'undefined');
88
+ }
89
+ function isNaNExpression(node) {
90
+ return ((0, ast_js_1.isIdentifier)(node, 'NaN') ||
91
+ (node.type === 'MemberExpression' &&
92
+ (0, ast_js_1.isIdentifier)(node.object, 'Number') &&
93
+ (0, ast_js_1.isIdentifier)(node.property, 'NaN')));
94
+ }
95
+ function getBooleanValue(node) {
96
+ return node.type === 'Literal' && typeof node.value === 'boolean' ? node.value : undefined;
97
+ }
98
+ function replacement(replacementText, _node, _sourceCode) {
99
+ return {
100
+ assertion: replacementText,
101
+ replacement: replacementText,
102
+ };
103
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ /*
3
+ * SonarQube JavaScript Plugin
4
+ * Copyright (C) SonarSource Sàrl
5
+ * mailto:info AT sonarsource DOT com
6
+ *
7
+ * You can redistribute and/or modify this program under the terms of
8
+ * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ * See the Sonar Source-Available License for more details.
14
+ *
15
+ * You should have received a copy of the Sonar Source-Available License
16
+ * along with this program; if not, see https://sonarsource.com/license/ssal/
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.getCypressSuggestion = getCypressSuggestion;
20
+ const ast_js_1 = require("../helpers/ast.js");
21
+ const assertion_utils_js_1 = require("./assertion-utils.js");
22
+ function getCypressSuggestion(node, sourceCode) {
23
+ if (!(0, ast_js_1.isMethodCall)(node) ||
24
+ !['should', 'and'].includes(node.callee.property.name) ||
25
+ node.arguments.length !== 2) {
26
+ return null;
27
+ }
28
+ if (!hasCyWrapCall(node.callee.object) || node.arguments[0].type !== 'Literal') {
29
+ return null;
30
+ }
31
+ const chainer = node.arguments[0].value;
32
+ const expected = node.arguments[1];
33
+ const property = node.callee.property.name;
34
+ const subject = sourceCode.getText(node.callee.object);
35
+ if ((0, assertion_utils_js_1.isNullLiteral)(expected)) {
36
+ return getCypressNullishSuggestion(node, sourceCode, chainer, subject, property, 'null');
37
+ }
38
+ if ((0, assertion_utils_js_1.isUndefinedExpression)(expected)) {
39
+ return getCypressNullishSuggestion(node, sourceCode, chainer, subject, property, 'undefined');
40
+ }
41
+ return null;
42
+ }
43
+ function getCypressNullishSuggestion(node, sourceCode, chainer, subject, property, nullish) {
44
+ if (chainer !== 'equal' &&
45
+ chainer !== 'not.equal' &&
46
+ chainer !== 'deep.equal' &&
47
+ chainer !== 'not.deep.equal') {
48
+ return null;
49
+ }
50
+ const negation = chainer === 'not.equal' || chainer === 'not.deep.equal' ? 'not.' : '';
51
+ return (0, assertion_utils_js_1.replacement)(`${subject}.${property}('${negation}be.${nullish}')`, node, sourceCode);
52
+ }
53
+ function hasCyWrapCall(node) {
54
+ if (node.type === 'CallExpression' && (0, ast_js_1.isMethodCall)(node)) {
55
+ return (((0, ast_js_1.isIdentifier)(node.callee.property, 'wrap') && (0, ast_js_1.isIdentifier)(node.callee.object, 'cy')) ||
56
+ hasCyWrapCall(node.callee.object));
57
+ }
58
+ if (node.type === 'MemberExpression' && !node.computed) {
59
+ return hasCyWrapCall(node.object);
60
+ }
61
+ return false;
62
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getExpectChain = getExpectChain;
4
+ const ast_js_1 = require("../helpers/ast.js");
5
+ function getExpectChain(node) {
6
+ if (node.type === 'MemberExpression' && !node.computed && (0, ast_js_1.isIdentifier)(node.property, 'not')) {
7
+ const chain = getExpectChain(node.object);
8
+ return chain ? { ...chain, negated: !chain.negated } : null;
9
+ }
10
+ if (node.type !== 'CallExpression' ||
11
+ !(0, ast_js_1.isIdentifier)(node.callee, 'expect') ||
12
+ node.arguments.length !== 1) {
13
+ return null;
14
+ }
15
+ return { actual: node.arguments[0], negated: false };
16
+ }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /*
3
+ * SonarQube JavaScript Plugin
4
+ * Copyright (C) SonarSource Sàrl
5
+ * mailto:info AT sonarsource DOT com
6
+ *
7
+ * You can redistribute and/or modify this program under the terms of
8
+ * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ * See the Sonar Source-Available License for more details.
14
+ *
15
+ * You should have received a copy of the Sonar Source-Available License
16
+ * along with this program; if not, see https://sonarsource.com/license/ssal/
17
+ */
18
+ // https://sonarsource.github.io/rspec/#/rspec/S5906/javascript
19
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ var desc = Object.getOwnPropertyDescriptor(m, k);
22
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
23
+ desc = { enumerable: true, get: function() { return m[k]; } };
24
+ }
25
+ Object.defineProperty(o, k2, desc);
26
+ }) : (function(o, m, k, k2) {
27
+ if (k2 === undefined) k2 = k;
28
+ o[k2] = m[k];
29
+ }));
30
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
31
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
32
+ };
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.skipOnGeneratedSource = exports.requiredDependency = exports.languages = exports.scope = exports.sonarKey = exports.meta = void 0;
35
+ __exportStar(require("./meta.js"), exports);
36
+ exports.meta = {
37
+ type: 'suggestion',
38
+ docs: {
39
+ description: 'The most specific assertion should be used',
40
+ recommended: true,
41
+ url: 'https://sonarsource.github.io/rspec/#/rspec/S5906/javascript',
42
+ requiresTypeChecking: false,
43
+ },
44
+ fixable: 'code',
45
+ deprecated: false,
46
+ defaultOptions: [],
47
+ };
48
+ exports.sonarKey = 'S5906';
49
+ exports.scope = 'Tests';
50
+ exports.languages = ['js', 'ts'];
51
+ exports.requiredDependency = [];
52
+ exports.skipOnGeneratedSource = false;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.eslintId = exports.implementation = void 0;
4
+ /*
5
+ * SonarQube JavaScript Plugin
6
+ * Copyright (C) SonarSource Sàrl
7
+ * mailto:info AT sonarsource DOT com
8
+ *
9
+ * You can redistribute and/or modify this program under the terms of
10
+ * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15
+ * See the Sonar Source-Available License for more details.
16
+ *
17
+ * You should have received a copy of the Sonar Source-Available License
18
+ * along with this program; if not, see https://sonarsource.com/license/ssal/
19
+ */
20
+ exports.implementation = 'original';
21
+ exports.eslintId = 'prefer-specific-assertions';
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ /*
3
+ * SonarQube JavaScript Plugin
4
+ * Copyright (C) SonarSource Sàrl
5
+ * mailto:info AT sonarsource DOT com
6
+ *
7
+ * You can redistribute and/or modify this program under the terms of
8
+ * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ * See the Sonar Source-Available License for more details.
14
+ *
15
+ * You should have received a copy of the Sonar Source-Available License
16
+ * along with this program; if not, see https://sonarsource.com/license/ssal/
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.getPlaywrightLocatorSuggestion = getPlaywrightLocatorSuggestion;
20
+ const ast_js_1 = require("../helpers/ast.js");
21
+ const module_js_1 = require("../helpers/module.js");
22
+ const assertion_utils_js_1 = require("./assertion-utils.js");
23
+ const expect_chain_js_1 = require("./expect-chain.js");
24
+ const PLAYWRIGHT_BOOLEAN_GETTERS = new Map([
25
+ ['isVisible', { truthy: 'toBeVisible', falsy: 'toBeHidden' }],
26
+ ['isHidden', { truthy: 'toBeHidden', falsy: 'toBeVisible' }],
27
+ ['isEnabled', { truthy: 'toBeEnabled', falsy: 'toBeDisabled' }],
28
+ ['isDisabled', { truthy: 'toBeDisabled', falsy: 'toBeEnabled' }],
29
+ ['isChecked', { truthy: 'toBeChecked', falsy: 'not.toBeChecked' }],
30
+ ]);
31
+ const PLAYWRIGHT_VALUE_GETTERS = new Map([
32
+ ['count', 'toHaveCount'],
33
+ ['inputValue', 'toHaveValue'],
34
+ ]);
35
+ function getPlaywrightLocatorSuggestion(context, node, sourceCode, locatorVariables) {
36
+ const chain = getPlaywrightAssertionChain(context, node);
37
+ if (!chain) {
38
+ return null;
39
+ }
40
+ const { getter, locator, negated } = chain;
41
+ if (!(0, assertion_utils_js_1.isPlaywrightLocatorExpression)(context, locator, locatorVariables)) {
42
+ return null;
43
+ }
44
+ return (getBooleanGetterSuggestion(getter, locator, node.arguments[0], negated, sourceCode) ??
45
+ getValueGetterSuggestion(getter, locator, node.arguments[0], negated, sourceCode));
46
+ }
47
+ function getPlaywrightAssertionChain(context, node) {
48
+ if (!(0, ast_js_1.isMethodCall)(node) ||
49
+ !['toBe', 'toEqual', 'toStrictEqual'].includes(node.callee.property.name) ||
50
+ node.arguments.length !== 1) {
51
+ return null;
52
+ }
53
+ if (!isPlaywrightExpect(context, node.callee.object)) {
54
+ return null;
55
+ }
56
+ const chain = (0, expect_chain_js_1.getExpectChain)(node.callee.object);
57
+ const awaited = chain?.actual.type === 'AwaitExpression' ? chain.actual.argument : undefined;
58
+ if (!chain || awaited?.type !== 'CallExpression' || !(0, ast_js_1.isMethodCall)(awaited)) {
59
+ return null;
60
+ }
61
+ if (awaited.arguments.length !== 0) {
62
+ return null;
63
+ }
64
+ return { getter: awaited, locator: awaited.callee.object, negated: chain.negated };
65
+ }
66
+ function isPlaywrightExpect(context, node) {
67
+ const expectCall = getExpectCall(node);
68
+ return (expectCall !== null &&
69
+ (0, module_js_1.getFullyQualifiedName)(context, expectCall.callee) === '@playwright.test.expect');
70
+ }
71
+ function getExpectCall(node) {
72
+ if (node.type === 'MemberExpression' && !node.computed && (0, ast_js_1.isIdentifier)(node.property, 'not')) {
73
+ return getExpectCall(node.object);
74
+ }
75
+ if (node.type === 'CallExpression' && (0, ast_js_1.isIdentifier)(node.callee, 'expect')) {
76
+ return node;
77
+ }
78
+ return null;
79
+ }
80
+ function getBooleanGetterSuggestion(getter, locator, expected, negated, sourceCode) {
81
+ if (!(0, ast_js_1.isMethodCall)(getter)) {
82
+ return null;
83
+ }
84
+ const matcher = PLAYWRIGHT_BOOLEAN_GETTERS.get(getter.callee.property.name);
85
+ const expectedBoolean = (0, assertion_utils_js_1.getBooleanValue)(expected);
86
+ if (!matcher || expectedBoolean === undefined) {
87
+ return null;
88
+ }
89
+ const method = expectedBoolean === negated ? matcher.falsy : matcher.truthy;
90
+ return { assertion: `await expect(${sourceCode.getText(locator)}).${method}()` };
91
+ }
92
+ function getValueGetterSuggestion(getter, locator, expected, negated, sourceCode) {
93
+ if (!(0, ast_js_1.isMethodCall)(getter)) {
94
+ return null;
95
+ }
96
+ const matcher = PLAYWRIGHT_VALUE_GETTERS.get(getter.callee.property.name);
97
+ if (!matcher) {
98
+ return null;
99
+ }
100
+ return {
101
+ assertion: `await expect(${sourceCode.getText(locator)}).${negated ? 'not.' : ''}${matcher}(${sourceCode.getText(expected)})`,
102
+ };
103
+ }