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.
- package/README.md +52 -56
- package/cjs/S100/generated-meta.js +2 -1
- package/cjs/S101/generated-meta.js +2 -1
- package/cjs/S104/generated-meta.js +2 -1
- package/cjs/S105/generated-meta.js +2 -1
- package/cjs/S1066/generated-meta.js +2 -1
- package/cjs/S1067/generated-meta.js +2 -1
- package/cjs/S1110/generated-meta.js +2 -1
- package/cjs/S1119/generated-meta.js +2 -1
- package/cjs/S1121/generated-meta.js +2 -1
- package/cjs/S1125/generated-meta.js +2 -1
- package/cjs/S1126/generated-meta.js +2 -1
- package/cjs/S1128/generated-meta.js +2 -1
- package/cjs/S1134/generated-meta.js +2 -1
- package/cjs/S1135/generated-meta.js +2 -1
- package/cjs/S1154/generated-meta.js +2 -1
- package/cjs/S1154/rule.js +21 -2
- package/cjs/S117/generated-meta.js +2 -1
- package/cjs/S1172/generated-meta.js +2 -1
- package/cjs/S1192/generated-meta.js +2 -1
- package/cjs/S1219/generated-meta.js +2 -1
- package/cjs/S1226/generated-meta.js +2 -1
- package/cjs/S124/generated-meta.js +2 -1
- package/cjs/{S2255 → S1244}/generated-meta.js +8 -7
- package/cjs/S1244/meta.js +21 -0
- package/cjs/S1244/rule.js +265 -0
- package/cjs/S125/generated-meta.js +3 -2
- package/cjs/S126/generated-meta.js +2 -1
- package/cjs/S1264/generated-meta.js +2 -1
- package/cjs/S128/generated-meta.js +2 -1
- package/cjs/S1291/generated-meta.js +2 -1
- package/cjs/S1301/generated-meta.js +3 -2
- package/cjs/S1313/generated-meta.js +2 -1
- package/cjs/S134/generated-meta.js +2 -1
- package/cjs/S135/generated-meta.js +2 -1
- package/cjs/S138/generated-meta.js +2 -1
- package/cjs/S1439/generated-meta.js +2 -1
- package/cjs/S1444/generated-meta.js +2 -1
- package/cjs/S1451/generated-meta.js +2 -1
- package/cjs/S1472/generated-meta.js +2 -1
- package/cjs/S1479/generated-meta.js +2 -1
- package/cjs/S1481/generated-meta.js +2 -1
- package/cjs/S1488/generated-meta.js +2 -1
- package/cjs/S1515/generated-meta.js +2 -1
- package/cjs/S1523/generated-meta.js +3 -2
- package/cjs/S1526/generated-meta.js +2 -1
- package/cjs/S1527/generated-meta.js +2 -1
- package/cjs/S1528/generated-meta.js +2 -1
- package/cjs/S1529/generated-meta.js +2 -1
- package/cjs/S1530/generated-meta.js +2 -1
- package/cjs/S1533/generated-meta.js +2 -1
- package/cjs/S1535/generated-meta.js +2 -1
- package/cjs/S1541/generated-meta.js +2 -1
- package/cjs/S1607/generated-meta.js +2 -1
- package/cjs/S1607/rule.js +72 -7
- package/cjs/S1764/generated-meta.js +2 -1
- package/cjs/S1821/generated-meta.js +2 -1
- package/cjs/S1848/generated-meta.js +2 -1
- package/cjs/S1854/generated-meta.js +2 -1
- package/cjs/S1862/generated-meta.js +2 -1
- package/cjs/S1871/generated-meta.js +2 -1
- package/cjs/S1874/generated-meta.js +2 -1
- package/cjs/S1940/generated-meta.js +2 -1
- package/cjs/S1994/generated-meta.js +2 -1
- package/cjs/S2004/generated-meta.js +2 -1
- package/cjs/S2068/generated-meta.js +2 -1
- package/cjs/S2068/rule.js +0 -14
- package/cjs/S2077/generated-meta.js +3 -2
- package/cjs/S2092/generated-meta.js +2 -1
- package/cjs/S2123/generated-meta.js +2 -1
- package/cjs/S2137/generated-meta.js +2 -1
- package/cjs/S2138/generated-meta.js +2 -1
- package/cjs/S2187/generated-meta.js +2 -1
- package/cjs/S2187/rule.js +50 -13
- package/cjs/S2201/generated-meta.js +2 -1
- package/cjs/S2208/generated-meta.js +2 -1
- package/cjs/S2234/generated-meta.js +2 -1
- package/cjs/S2245/generated-meta.js +3 -2
- package/cjs/S2251/generated-meta.js +2 -1
- package/cjs/S2259/generated-meta.js +2 -1
- package/cjs/S2301/generated-meta.js +2 -1
- package/cjs/S2310/generated-meta.js +2 -1
- package/cjs/S2392/generated-meta.js +2 -1
- package/cjs/S2424/generated-meta.js +2 -1
- package/cjs/S2428/generated-meta.js +2 -1
- package/cjs/S2486/generated-meta.js +2 -1
- package/cjs/S2589/generated-meta.js +2 -1
- package/cjs/S2598/generated-meta.js +2 -1
- package/cjs/S2612/generated-meta.js +2 -1
- package/cjs/S2639/generated-meta.js +2 -1
- package/cjs/S2681/generated-meta.js +2 -1
- package/cjs/S2692/generated-meta.js +2 -1
- package/cjs/S2699/generated-meta.js +2 -1
- package/cjs/S2699/rule.js +19 -5
- package/cjs/S2703/generated-meta.js +2 -1
- package/cjs/S2737/generated-meta.js +2 -1
- package/cjs/S2755/generated-meta.js +2 -1
- package/cjs/S2757/generated-meta.js +2 -1
- package/cjs/S2817/generated-meta.js +2 -1
- package/cjs/S2819/generated-meta.js +2 -1
- package/cjs/S2870/generated-meta.js +2 -1
- package/cjs/S2871/generated-meta.js +2 -1
- package/cjs/S2871/rule.js +85 -1
- package/cjs/S2970/generated-meta.js +2 -1
- package/cjs/S2990/generated-meta.js +2 -1
- package/cjs/S2999/generated-meta.js +2 -1
- package/cjs/S3001/generated-meta.js +2 -1
- package/cjs/S3003/generated-meta.js +2 -1
- package/cjs/S3317/generated-meta.js +2 -1
- package/cjs/S3330/generated-meta.js +3 -2
- package/cjs/S3358/generated-meta.js +2 -1
- package/cjs/S3402/generated-meta.js +2 -1
- package/cjs/S3403/generated-meta.js +2 -1
- package/cjs/S3403/rule.js +21 -1
- package/cjs/S3415/generated-meta.js +2 -1
- package/cjs/S3499/generated-meta.js +2 -1
- package/cjs/S3500/generated-meta.js +2 -1
- package/cjs/S3513/generated-meta.js +2 -1
- package/cjs/S3514/generated-meta.js +2 -1
- package/cjs/S3516/generated-meta.js +2 -1
- package/cjs/S3524/generated-meta.js +2 -1
- package/cjs/S3525/generated-meta.js +2 -1
- package/cjs/S3531/generated-meta.js +2 -1
- package/cjs/S3533/generated-meta.js +2 -1
- package/cjs/S3579/generated-meta.js +2 -1
- package/cjs/S3616/generated-meta.js +2 -1
- package/cjs/S3626/generated-meta.js +2 -1
- package/cjs/S3626/rule.js +1 -1
- package/cjs/S3686/generated-meta.js +2 -1
- package/cjs/S3699/generated-meta.js +2 -1
- package/cjs/S3735/generated-meta.js +2 -1
- package/cjs/S3757/generated-meta.js +2 -1
- package/cjs/S3757/rule.js +3 -1
- package/cjs/S3758/generated-meta.js +2 -1
- package/cjs/S3760/generated-meta.js +2 -1
- package/cjs/S3776/generated-meta.js +2 -1
- package/cjs/S3782/generated-meta.js +2 -1
- package/cjs/S3785/generated-meta.js +2 -1
- package/cjs/S3796/generated-meta.js +2 -1
- package/cjs/S3798/generated-meta.js +2 -1
- package/cjs/S3798/rule.js +57 -17
- package/cjs/S3800/generated-meta.js +2 -1
- package/cjs/S3801/generated-meta.js +2 -1
- package/cjs/S3827/generated-meta.js +2 -1
- package/cjs/S3923/generated-meta.js +2 -1
- package/cjs/S3972/generated-meta.js +2 -1
- package/cjs/S3973/generated-meta.js +2 -1
- package/cjs/S3981/generated-meta.js +2 -1
- package/cjs/S3984/generated-meta.js +2 -1
- package/cjs/S4030/generated-meta.js +2 -1
- package/cjs/S4036/generated-meta.js +3 -2
- package/cjs/S4043/generated-meta.js +2 -1
- package/cjs/S4139/generated-meta.js +2 -1
- package/cjs/S4143/generated-meta.js +2 -1
- package/cjs/S4144/generated-meta.js +2 -1
- package/cjs/S4158/generated-meta.js +2 -1
- package/cjs/S4165/generated-meta.js +2 -1
- package/cjs/S4322/generated-meta.js +2 -1
- package/cjs/S4323/generated-meta.js +2 -1
- package/cjs/S4324/generated-meta.js +2 -1
- package/cjs/S4328/generated-meta.js +2 -1
- package/cjs/S4328/rule.js +7 -2
- package/cjs/S4335/generated-meta.js +2 -1
- package/cjs/S4423/generated-meta.js +2 -1
- package/cjs/S4426/generated-meta.js +2 -1
- package/cjs/S4502/generated-meta.js +3 -2
- package/cjs/S4507/generated-meta.js +3 -2
- package/cjs/S4524/generated-meta.js +2 -1
- package/cjs/S4619/generated-meta.js +2 -1
- package/cjs/S4621/generated-meta.js +2 -1
- package/cjs/S4622/generated-meta.js +2 -1
- package/cjs/S4623/generated-meta.js +2 -1
- package/cjs/S4624/generated-meta.js +2 -1
- package/cjs/S4624/rule.js +2 -7
- package/cjs/S4634/generated-meta.js +2 -1
- package/cjs/S4721/generated-meta.js +5 -4
- package/cjs/S4782/generated-meta.js +2 -1
- package/cjs/S4782/rule.js +96 -14
- package/cjs/S4790/generated-meta.js +3 -2
- package/cjs/S4790/rule.js +217 -2
- package/cjs/S4798/generated-meta.js +2 -1
- package/cjs/S4822/generated-meta.js +2 -1
- package/cjs/S4830/generated-meta.js +2 -1
- package/cjs/S5042/generated-meta.js +2 -1
- package/cjs/S5122/generated-meta.js +2 -1
- package/cjs/S5148/generated-meta.js +2 -1
- package/cjs/S5247/generated-meta.js +3 -2
- package/cjs/S5256/generated-meta.js +2 -1
- package/cjs/S5257/generated-meta.js +2 -1
- package/cjs/S5260/generated-meta.js +2 -1
- package/cjs/S5264/generated-meta.js +2 -1
- package/cjs/S5332/generated-meta.js +3 -2
- package/cjs/S5332/rule.lib.js +54 -46
- package/cjs/S5443/generated-meta.js +2 -1
- package/cjs/S5527/generated-meta.js +2 -1
- package/cjs/S5542/generated-meta.js +2 -1
- package/cjs/S5547/generated-meta.js +2 -1
- package/cjs/S5604/generated-meta.js +5 -4
- package/cjs/S5659/generated-meta.js +2 -1
- package/cjs/S5689/generated-meta.js +2 -1
- package/cjs/S5691/generated-meta.js +5 -4
- package/cjs/S5693/generated-meta.js +2 -1
- package/cjs/S5693/rule.js +45 -1
- package/cjs/S5725/generated-meta.js +3 -2
- package/cjs/S5725/rule.js +75 -12
- package/cjs/S5728/generated-meta.js +3 -2
- package/cjs/S5730/generated-meta.js +5 -4
- package/cjs/S5732/generated-meta.js +5 -4
- package/cjs/S5734/generated-meta.js +3 -2
- package/cjs/S5736/generated-meta.js +3 -2
- package/cjs/S5739/generated-meta.js +3 -2
- package/cjs/S5757/generated-meta.js +5 -4
- package/cjs/S5759/generated-meta.js +5 -4
- package/cjs/S5842/generated-meta.js +2 -1
- package/cjs/S5843/generated-meta.js +2 -1
- package/cjs/S5845/generated-meta.js +52 -0
- package/cjs/S5845/meta.js +21 -0
- package/cjs/S5845/rule.js +296 -0
- package/cjs/S5850/generated-meta.js +2 -1
- package/cjs/S5852/generated-meta.js +3 -2
- package/cjs/S5852/rule.js +11 -3
- package/cjs/S5856/generated-meta.js +2 -1
- package/cjs/S5860/generated-meta.js +2 -1
- package/cjs/S5863/generated-meta.js +2 -1
- package/cjs/S5867/generated-meta.js +2 -1
- package/cjs/S5868/generated-meta.js +2 -1
- package/cjs/S5868/rule.js +54 -25
- package/cjs/S5869/generated-meta.js +2 -1
- package/cjs/S5876/generated-meta.js +2 -1
- package/cjs/S5906/assertion-suggestions.js +279 -0
- package/cjs/S5906/assertion-utils.js +103 -0
- package/cjs/S5906/cypress-suggestions.js +62 -0
- package/cjs/S5906/expect-chain.js +16 -0
- package/cjs/S5906/generated-meta.js +52 -0
- package/cjs/S5906/meta.js +21 -0
- package/cjs/S5906/playwright-suggestions.js +103 -0
- package/cjs/S5906/rule.js +365 -0
- package/cjs/S5914/generated-meta.js +52 -0
- package/cjs/{S4817 → S5914}/meta.js +1 -1
- package/cjs/S5914/rule.js +213 -0
- package/cjs/S5958/generated-meta.js +2 -1
- package/cjs/S5973/generated-meta.js +2 -1
- package/cjs/S5973/rule.js +1 -1
- package/cjs/S6019/generated-meta.js +2 -1
- package/cjs/S6035/generated-meta.js +2 -1
- package/cjs/S6079/generated-meta.js +2 -1
- package/cjs/S6080/generated-meta.js +2 -1
- package/cjs/S6092/generated-meta.js +2 -1
- package/cjs/S6249/generated-meta.js +3 -2
- package/cjs/S6252/generated-meta.js +3 -2
- package/cjs/S6265/generated-meta.js +2 -1
- package/cjs/S6268/generated-meta.js +3 -2
- package/cjs/S6270/generated-meta.js +2 -1
- package/cjs/S6275/generated-meta.js +2 -1
- package/cjs/S6281/generated-meta.js +3 -2
- package/cjs/S6281/rule.js +7 -20
- package/cjs/S6302/generated-meta.js +2 -1
- package/cjs/S6303/generated-meta.js +2 -1
- package/cjs/S6304/generated-meta.js +3 -2
- package/cjs/S6308/generated-meta.js +2 -1
- package/cjs/S6317/generated-meta.js +2 -1
- package/cjs/S6319/generated-meta.js +3 -2
- package/cjs/S6321/generated-meta.js +2 -1
- package/cjs/S6323/generated-meta.js +2 -1
- package/cjs/S6324/generated-meta.js +2 -1
- package/cjs/S6324/rule.js +5 -5
- package/cjs/S6326/generated-meta.js +2 -1
- package/cjs/S6327/generated-meta.js +3 -2
- package/cjs/S6328/generated-meta.js +2 -1
- package/cjs/S6329/generated-meta.js +3 -2
- package/cjs/S6330/generated-meta.js +2 -1
- package/cjs/S6331/generated-meta.js +2 -1
- package/cjs/S6332/generated-meta.js +3 -2
- package/cjs/S6333/generated-meta.js +3 -2
- package/cjs/S6351/generated-meta.js +2 -1
- package/cjs/S6353/generated-meta.js +2 -1
- package/cjs/S6397/generated-meta.js +2 -1
- package/cjs/S6418/generated-meta.js +2 -1
- package/cjs/S6426/generated-meta.js +2 -1
- package/cjs/S6426/rule.js +6 -1
- package/cjs/S6437/generated-meta.js +2 -1
- package/cjs/S6437/rule.js +4 -2
- package/cjs/S6439/generated-meta.js +2 -1
- package/cjs/S6442/generated-meta.js +2 -1
- package/cjs/S6443/generated-meta.js +2 -1
- package/cjs/S6486/generated-meta.js +2 -1
- package/cjs/S6486/rule.js +4 -4
- package/cjs/S6564/generated-meta.js +2 -1
- package/cjs/S6594/generated-meta.js +2 -1
- package/cjs/S6627/generated-meta.js +2 -1
- package/cjs/S6759/generated-meta.js +2 -1
- package/cjs/S6759/rule.js +31 -1
- package/cjs/S6958/generated-meta.js +2 -1
- package/cjs/S6959/generated-meta.js +2 -1
- package/cjs/S7059/generated-meta.js +2 -1
- package/cjs/S7639/generated-meta.js +2 -1
- package/cjs/S7790/generated-meta.js +2 -1
- package/cjs/S8441/generated-meta.js +2 -1
- package/cjs/S8479/generated-meta.js +3 -2
- package/cjs/{S4817 → S8754}/generated-meta.js +10 -9
- package/cjs/{S5743 → S8754}/meta.js +1 -1
- package/cjs/S8754/rule.js +289 -0
- package/cjs/{S4784 → S8780}/generated-meta.js +9 -8
- package/cjs/{S2255 → S8780}/meta.js +1 -1
- package/cjs/S8780/rule.js +321 -0
- package/cjs/S8781/generated-meta.js +52 -0
- package/cjs/{S4787 → S8781}/meta.js +1 -1
- package/cjs/{S4784 → S8781}/rule.js +38 -46
- package/cjs/S8782/generated-meta.js +52 -0
- package/cjs/{S4784 → S8782}/meta.js +1 -1
- package/cjs/S8782/rule.js +148 -0
- package/cjs/S8783/generated-meta.js +52 -0
- package/cjs/S8783/meta.js +21 -0
- package/cjs/S8783/rule.js +167 -0
- package/cjs/{S4787 → S8786}/generated-meta.js +9 -8
- package/cjs/S8786/meta.js +22 -0
- package/cjs/{S4818 → S8786}/rule.js +24 -20
- package/cjs/S881/generated-meta.js +2 -1
- package/cjs/S888/generated-meta.js +2 -1
- package/cjs/S930/generated-meta.js +2 -1
- package/cjs/helpers/assertions-chai-common.js +29 -0
- package/cjs/helpers/assertions-chai.js +331 -0
- package/cjs/helpers/assertions-cypress.js +95 -0
- package/cjs/helpers/assertions.js +285 -0
- package/cjs/helpers/ast.js +30 -0
- package/cjs/helpers/chai.js +1 -1
- package/cjs/helpers/configs.js +37 -1
- package/cjs/helpers/cypress.js +73 -0
- package/cjs/helpers/dependency-manifests/all-in-parent-dirs.js +92 -0
- package/cjs/helpers/{package-jsons → dependency-manifests}/closest.js +17 -9
- package/cjs/helpers/dependency-manifests/dependencies.js +255 -0
- package/cjs/helpers/dependency-manifests/index.js +78 -0
- package/cjs/helpers/dependency-manifests/parse.js +51 -0
- package/cjs/helpers/dependency-manifests/parsed-dependency-files.js +80 -0
- package/cjs/helpers/dependency-manifests/resolvers/deno.js +79 -0
- package/cjs/helpers/dependency-manifests/resolvers/helpers.js +41 -0
- package/cjs/helpers/dependency-manifests/resolvers/package-json.js +167 -0
- package/cjs/helpers/dependency-manifests/resolvers/types.js +4 -0
- package/cjs/helpers/files.js +29 -0
- package/cjs/helpers/find-up/all-in-parent-dirs.js +1 -0
- package/cjs/helpers/find-up/closest.js +1 -0
- package/cjs/helpers/find-up/find-minimatch.js +2 -2
- package/cjs/helpers/generate-meta.js +1 -1
- package/cjs/helpers/mocha-style-test-frameworks.js +132 -0
- package/cjs/helpers/mocha.js +17 -7
- package/cjs/helpers/module.js +116 -23
- package/cjs/helpers/numbers.js +62 -0
- package/cjs/helpers/playwright.js +13 -0
- package/cjs/helpers/regex/extract.js +21 -9
- package/cjs/helpers/regex/flags.js +12 -5
- package/cjs/helpers/sinon.js +0 -4
- package/cjs/helpers/supertest.js +0 -4
- package/cjs/helpers/test-file-pattern.js +63 -0
- package/cjs/helpers/type-origin.js +82 -0
- package/cjs/helpers/type.js +162 -1
- package/cjs/helpers/vitest.js +0 -4
- package/cjs/plugin-rules.js +296 -298
- package/docs/async-test-assertions.md +7 -0
- package/docs/aws-apigateway-public-api.md +1 -1
- package/docs/aws-ec2-rds-dms-public.md +1 -1
- package/docs/aws-efs-unencrypted.md +1 -1
- package/docs/aws-iam-all-resources-accessible.md +1 -1
- package/docs/aws-s3-bucket-insecure-http.md +1 -1
- package/docs/aws-s3-bucket-public-access.md +1 -1
- package/docs/aws-s3-bucket-versioning.md +1 -1
- package/docs/aws-sagemaker-unencrypted-notebook.md +1 -1
- package/docs/aws-sns-unencrypted-topics.md +1 -1
- package/docs/code-eval.md +1 -1
- package/docs/confidential-information-logging.md +4 -2
- package/docs/content-security-policy.md +1 -1
- package/docs/cookie-no-httponly.md +1 -1
- package/docs/csrf.md +1 -1
- package/docs/disabled-auto-escaping.md +1 -1
- package/docs/disabled-resource-integrity.md +1 -1
- package/docs/dompurify-unsafe-config.md +2 -0
- package/docs/frame-ancestors.md +4 -2
- package/docs/hashing.md +1 -1
- package/docs/hidden-files.md +4 -2
- package/docs/hooks-before-test-cases.md +7 -0
- package/docs/no-angular-bypass-sanitization.md +1 -1
- package/docs/no-clear-text-protocols.md +1 -1
- package/docs/no-commented-code.md +1 -1
- package/docs/no-duplicate-test-title.md +7 -0
- package/docs/no-empty-test-title.md +7 -0
- package/docs/no-floating-point-equality.md +7 -0
- package/docs/no-forced-browser-interaction.md +7 -0
- package/docs/no-incompatible-assertion-types.md +9 -0
- package/docs/no-intrusive-permissions.md +4 -2
- package/docs/no-ip-forward.md +4 -2
- package/docs/no-mime-sniff.md +1 -1
- package/docs/no-mixed-content.md +4 -2
- package/docs/no-os-command-from-path.md +1 -1
- package/docs/no-referrer-policy.md +1 -1
- package/docs/no-small-switch.md +2 -0
- package/docs/no-trivial-assertions.md +7 -0
- package/docs/os-command.md +4 -2
- package/docs/prefer-specific-assertions.md +9 -0
- package/docs/production-debug.md +1 -1
- package/docs/pseudo-random.md +1 -1
- package/docs/slow-regex.md +1 -1
- package/docs/sql-queries.md +1 -1
- package/docs/strict-transport-security.md +1 -1
- package/docs/super-linear-regex.md +7 -0
- package/package.json +5 -4
- package/types/S100/generated-meta.d.ts +1 -0
- package/types/S101/generated-meta.d.ts +1 -0
- package/types/S104/generated-meta.d.ts +1 -0
- package/types/S105/generated-meta.d.ts +1 -0
- package/types/S1066/generated-meta.d.ts +1 -0
- package/types/S1067/generated-meta.d.ts +1 -0
- package/types/S1110/generated-meta.d.ts +1 -0
- package/types/S1119/generated-meta.d.ts +1 -0
- package/types/S1121/generated-meta.d.ts +1 -0
- package/types/S1125/generated-meta.d.ts +1 -0
- package/types/S1126/generated-meta.d.ts +1 -0
- package/types/S1128/generated-meta.d.ts +1 -0
- package/types/S1134/generated-meta.d.ts +1 -0
- package/types/S1135/generated-meta.d.ts +1 -0
- package/types/S1154/generated-meta.d.ts +1 -0
- package/types/S117/generated-meta.d.ts +1 -0
- package/types/S1172/generated-meta.d.ts +1 -0
- package/types/S1192/generated-meta.d.ts +1 -0
- package/types/S1219/generated-meta.d.ts +1 -0
- package/types/S1226/generated-meta.d.ts +1 -0
- package/types/S124/generated-meta.d.ts +1 -0
- package/types/{S2255 → S1244}/generated-meta.d.ts +3 -2
- package/types/S1244/meta.d.ts +2 -0
- package/types/S125/generated-meta.d.ts +1 -0
- package/types/S126/generated-meta.d.ts +1 -0
- package/types/S1264/generated-meta.d.ts +1 -0
- package/types/S128/generated-meta.d.ts +1 -0
- package/types/S1291/generated-meta.d.ts +1 -0
- package/types/S1301/generated-meta.d.ts +2 -1
- package/types/S1313/generated-meta.d.ts +1 -0
- package/types/S134/generated-meta.d.ts +1 -0
- package/types/S135/generated-meta.d.ts +1 -0
- package/types/S138/generated-meta.d.ts +1 -0
- package/types/S1439/generated-meta.d.ts +1 -0
- package/types/S1444/generated-meta.d.ts +1 -0
- package/types/S1451/generated-meta.d.ts +1 -0
- package/types/S1472/generated-meta.d.ts +1 -0
- package/types/S1479/generated-meta.d.ts +1 -0
- package/types/S1481/generated-meta.d.ts +1 -0
- package/types/S1488/generated-meta.d.ts +1 -0
- package/types/S1515/generated-meta.d.ts +1 -0
- package/types/S1523/generated-meta.d.ts +1 -0
- package/types/S1526/generated-meta.d.ts +1 -0
- package/types/S1527/generated-meta.d.ts +1 -0
- package/types/S1528/generated-meta.d.ts +1 -0
- package/types/S1529/generated-meta.d.ts +1 -0
- package/types/S1530/generated-meta.d.ts +1 -0
- package/types/S1533/generated-meta.d.ts +1 -0
- package/types/S1535/generated-meta.d.ts +1 -0
- package/types/S1541/generated-meta.d.ts +1 -0
- package/types/S1607/generated-meta.d.ts +1 -0
- package/types/S1764/generated-meta.d.ts +1 -0
- package/types/S1821/generated-meta.d.ts +1 -0
- package/types/S1848/generated-meta.d.ts +1 -0
- package/types/S1854/generated-meta.d.ts +1 -0
- package/types/S1862/generated-meta.d.ts +1 -0
- package/types/S1871/generated-meta.d.ts +1 -0
- package/types/S1874/generated-meta.d.ts +1 -0
- package/types/S1940/generated-meta.d.ts +1 -0
- package/types/S1994/generated-meta.d.ts +1 -0
- package/types/S2004/generated-meta.d.ts +1 -0
- package/types/S2068/generated-meta.d.ts +1 -0
- package/types/S2077/generated-meta.d.ts +1 -0
- package/types/S2092/generated-meta.d.ts +1 -0
- package/types/S2123/generated-meta.d.ts +1 -0
- package/types/S2137/generated-meta.d.ts +1 -0
- package/types/S2138/generated-meta.d.ts +1 -0
- package/types/S2187/generated-meta.d.ts +1 -0
- package/types/S2201/generated-meta.d.ts +1 -0
- package/types/S2208/generated-meta.d.ts +1 -0
- package/types/S2234/generated-meta.d.ts +1 -0
- package/types/S2245/generated-meta.d.ts +1 -0
- package/types/S2251/generated-meta.d.ts +1 -0
- package/types/S2259/generated-meta.d.ts +1 -0
- package/types/S2301/generated-meta.d.ts +1 -0
- package/types/S2310/generated-meta.d.ts +1 -0
- package/types/S2392/generated-meta.d.ts +1 -0
- package/types/S2424/generated-meta.d.ts +1 -0
- package/types/S2428/generated-meta.d.ts +1 -0
- package/types/S2486/generated-meta.d.ts +1 -0
- package/types/S2589/generated-meta.d.ts +1 -0
- package/types/S2598/generated-meta.d.ts +1 -0
- package/types/S2612/generated-meta.d.ts +1 -0
- package/types/S2639/generated-meta.d.ts +1 -0
- package/types/S2681/generated-meta.d.ts +1 -0
- package/types/S2692/generated-meta.d.ts +1 -0
- package/types/S2699/generated-meta.d.ts +1 -0
- package/types/S2703/generated-meta.d.ts +1 -0
- package/types/S2737/generated-meta.d.ts +1 -0
- package/types/S2755/generated-meta.d.ts +1 -0
- package/types/S2757/generated-meta.d.ts +1 -0
- package/types/S2817/generated-meta.d.ts +1 -0
- package/types/S2819/generated-meta.d.ts +1 -0
- package/types/S2870/generated-meta.d.ts +1 -0
- package/types/S2871/generated-meta.d.ts +1 -0
- package/types/S2970/generated-meta.d.ts +1 -0
- package/types/S2990/generated-meta.d.ts +1 -0
- package/types/S2999/generated-meta.d.ts +1 -0
- package/types/S3001/generated-meta.d.ts +1 -0
- package/types/S3003/generated-meta.d.ts +1 -0
- package/types/S3317/generated-meta.d.ts +1 -0
- package/types/S3330/generated-meta.d.ts +1 -0
- package/types/S3358/generated-meta.d.ts +1 -0
- package/types/S3402/generated-meta.d.ts +1 -0
- package/types/S3403/generated-meta.d.ts +1 -0
- package/types/S3415/generated-meta.d.ts +1 -0
- package/types/S3499/generated-meta.d.ts +1 -0
- package/types/S3500/generated-meta.d.ts +1 -0
- package/types/S3513/generated-meta.d.ts +1 -0
- package/types/S3514/generated-meta.d.ts +1 -0
- package/types/S3516/generated-meta.d.ts +1 -0
- package/types/S3524/generated-meta.d.ts +1 -0
- package/types/S3525/generated-meta.d.ts +1 -0
- package/types/S3531/generated-meta.d.ts +1 -0
- package/types/S3533/generated-meta.d.ts +1 -0
- package/types/S3579/generated-meta.d.ts +1 -0
- package/types/S3616/generated-meta.d.ts +1 -0
- package/types/S3626/generated-meta.d.ts +1 -0
- package/types/S3686/generated-meta.d.ts +1 -0
- package/types/S3699/generated-meta.d.ts +1 -0
- package/types/S3735/generated-meta.d.ts +1 -0
- package/types/S3757/generated-meta.d.ts +1 -0
- package/types/S3758/generated-meta.d.ts +1 -0
- package/types/S3760/generated-meta.d.ts +1 -0
- package/types/S3776/generated-meta.d.ts +1 -0
- package/types/S3782/generated-meta.d.ts +1 -0
- package/types/S3785/generated-meta.d.ts +1 -0
- package/types/S3796/generated-meta.d.ts +1 -0
- package/types/S3798/generated-meta.d.ts +1 -0
- package/types/S3800/generated-meta.d.ts +1 -0
- package/types/S3801/generated-meta.d.ts +1 -0
- package/types/S3827/generated-meta.d.ts +1 -0
- package/types/S3923/generated-meta.d.ts +1 -0
- package/types/S3972/generated-meta.d.ts +1 -0
- package/types/S3973/generated-meta.d.ts +1 -0
- package/types/S3981/generated-meta.d.ts +1 -0
- package/types/S3984/generated-meta.d.ts +1 -0
- package/types/S4030/generated-meta.d.ts +1 -0
- package/types/S4036/generated-meta.d.ts +1 -0
- package/types/S4043/generated-meta.d.ts +1 -0
- package/types/S4139/generated-meta.d.ts +1 -0
- package/types/S4143/generated-meta.d.ts +1 -0
- package/types/S4144/generated-meta.d.ts +1 -0
- package/types/S4158/generated-meta.d.ts +1 -0
- package/types/S4165/generated-meta.d.ts +1 -0
- package/types/S4322/generated-meta.d.ts +1 -0
- package/types/S4323/generated-meta.d.ts +1 -0
- package/types/S4324/generated-meta.d.ts +1 -0
- package/types/S4328/generated-meta.d.ts +1 -0
- package/types/S4335/generated-meta.d.ts +1 -0
- package/types/S4423/generated-meta.d.ts +1 -0
- package/types/S4426/generated-meta.d.ts +1 -0
- package/types/S4502/generated-meta.d.ts +1 -0
- package/types/S4507/generated-meta.d.ts +1 -0
- package/types/S4524/generated-meta.d.ts +1 -0
- package/types/S4619/generated-meta.d.ts +1 -0
- package/types/S4621/generated-meta.d.ts +1 -0
- package/types/S4622/generated-meta.d.ts +1 -0
- package/types/S4623/generated-meta.d.ts +1 -0
- package/types/S4624/generated-meta.d.ts +1 -0
- package/types/S4634/generated-meta.d.ts +1 -0
- package/types/S4721/generated-meta.d.ts +2 -1
- package/types/S4782/generated-meta.d.ts +1 -0
- package/types/S4790/generated-meta.d.ts +1 -0
- package/types/S4798/generated-meta.d.ts +1 -0
- package/types/S4822/generated-meta.d.ts +1 -0
- package/types/S4830/generated-meta.d.ts +1 -0
- package/types/S5042/generated-meta.d.ts +1 -0
- package/types/S5122/generated-meta.d.ts +1 -0
- package/types/S5148/generated-meta.d.ts +1 -0
- package/types/S5247/generated-meta.d.ts +1 -0
- package/types/S5256/generated-meta.d.ts +1 -0
- package/types/S5257/generated-meta.d.ts +1 -0
- package/types/S5260/generated-meta.d.ts +1 -0
- package/types/S5264/generated-meta.d.ts +1 -0
- package/types/S5332/generated-meta.d.ts +1 -0
- package/types/S5443/generated-meta.d.ts +1 -0
- package/types/S5527/generated-meta.d.ts +1 -0
- package/types/S5542/generated-meta.d.ts +1 -0
- package/types/S5547/generated-meta.d.ts +1 -0
- package/types/S5604/generated-meta.d.ts +2 -1
- package/types/S5659/generated-meta.d.ts +1 -0
- package/types/S5689/generated-meta.d.ts +1 -0
- package/types/S5691/generated-meta.d.ts +2 -1
- package/types/S5693/generated-meta.d.ts +1 -0
- package/types/S5725/generated-meta.d.ts +1 -0
- package/types/S5728/generated-meta.d.ts +1 -0
- package/types/S5730/generated-meta.d.ts +2 -1
- package/types/S5732/generated-meta.d.ts +2 -1
- package/types/S5734/generated-meta.d.ts +1 -0
- package/types/S5736/generated-meta.d.ts +1 -0
- package/types/S5739/generated-meta.d.ts +1 -0
- package/types/S5757/generated-meta.d.ts +2 -1
- package/types/S5759/generated-meta.d.ts +2 -1
- package/types/S5842/generated-meta.d.ts +1 -0
- package/types/S5843/generated-meta.d.ts +1 -0
- package/types/S5845/generated-meta.d.ts +18 -0
- package/types/S5845/meta.d.ts +2 -0
- package/types/S5850/generated-meta.d.ts +1 -0
- package/types/S5852/generated-meta.d.ts +1 -0
- package/types/S5856/generated-meta.d.ts +1 -0
- package/types/S5860/generated-meta.d.ts +1 -0
- package/types/S5863/generated-meta.d.ts +1 -0
- package/types/S5867/generated-meta.d.ts +1 -0
- package/types/S5868/generated-meta.d.ts +1 -0
- package/types/S5869/generated-meta.d.ts +1 -0
- package/types/S5876/generated-meta.d.ts +1 -0
- package/types/S5906/assertion-suggestions.d.ts +7 -0
- package/types/S5906/assertion-utils.d.ts +14 -0
- package/types/S5906/cypress-suggestions.d.ts +4 -0
- package/types/S5906/expect-chain.d.ts +5 -0
- package/types/S5906/generated-meta.d.ts +18 -0
- package/types/S5906/meta.d.ts +2 -0
- package/types/S5906/playwright-suggestions.d.ts +4 -0
- package/types/{S4817 → S5914}/generated-meta.d.ts +5 -4
- package/types/S5914/meta.d.ts +2 -0
- package/types/S5958/generated-meta.d.ts +1 -0
- package/types/S5973/generated-meta.d.ts +1 -0
- package/types/S6019/generated-meta.d.ts +1 -0
- package/types/S6035/generated-meta.d.ts +1 -0
- package/types/S6079/generated-meta.d.ts +1 -0
- package/types/S6080/generated-meta.d.ts +1 -0
- package/types/S6092/generated-meta.d.ts +1 -0
- package/types/S6249/generated-meta.d.ts +1 -0
- package/types/S6252/generated-meta.d.ts +1 -0
- package/types/S6265/generated-meta.d.ts +1 -0
- package/types/S6268/generated-meta.d.ts +1 -0
- package/types/S6270/generated-meta.d.ts +1 -0
- package/types/S6275/generated-meta.d.ts +1 -0
- package/types/S6281/generated-meta.d.ts +1 -0
- package/types/S6302/generated-meta.d.ts +1 -0
- package/types/S6303/generated-meta.d.ts +1 -0
- package/types/S6304/generated-meta.d.ts +1 -0
- package/types/S6308/generated-meta.d.ts +1 -0
- package/types/S6317/generated-meta.d.ts +1 -0
- package/types/S6319/generated-meta.d.ts +1 -0
- package/types/S6321/generated-meta.d.ts +1 -0
- package/types/S6323/generated-meta.d.ts +1 -0
- package/types/S6324/generated-meta.d.ts +1 -0
- package/types/S6326/generated-meta.d.ts +1 -0
- package/types/S6327/generated-meta.d.ts +1 -0
- package/types/S6328/generated-meta.d.ts +1 -0
- package/types/S6329/generated-meta.d.ts +1 -0
- package/types/S6330/generated-meta.d.ts +1 -0
- package/types/S6331/generated-meta.d.ts +1 -0
- package/types/S6332/generated-meta.d.ts +1 -0
- package/types/S6333/generated-meta.d.ts +1 -0
- package/types/S6351/generated-meta.d.ts +1 -0
- package/types/S6353/generated-meta.d.ts +1 -0
- package/types/S6397/generated-meta.d.ts +1 -0
- package/types/S6418/generated-meta.d.ts +1 -0
- package/types/S6426/generated-meta.d.ts +1 -0
- package/types/S6437/generated-meta.d.ts +1 -0
- package/types/S6439/generated-meta.d.ts +1 -0
- package/types/S6442/generated-meta.d.ts +1 -0
- package/types/S6443/generated-meta.d.ts +1 -0
- package/types/S6486/generated-meta.d.ts +1 -0
- package/types/S6564/generated-meta.d.ts +1 -0
- package/types/S6594/generated-meta.d.ts +1 -0
- package/types/S6627/generated-meta.d.ts +1 -0
- package/types/S6759/generated-meta.d.ts +1 -0
- package/types/S6958/generated-meta.d.ts +1 -0
- package/types/S6959/generated-meta.d.ts +1 -0
- package/types/S7059/generated-meta.d.ts +1 -0
- package/types/S7639/generated-meta.d.ts +1 -0
- package/types/S7790/generated-meta.d.ts +1 -0
- package/types/S8441/generated-meta.d.ts +1 -0
- package/types/S8479/generated-meta.d.ts +2 -1
- package/types/S8754/generated-meta.d.ts +18 -0
- package/types/{S5743 → S8754}/meta.d.ts +1 -1
- package/types/{S4787 → S8780}/generated-meta.d.ts +4 -3
- package/types/S8780/meta.d.ts +2 -0
- package/types/S8781/generated-meta.d.ts +18 -0
- package/types/S8781/meta.d.ts +2 -0
- package/types/S8782/generated-meta.d.ts +18 -0
- package/types/S8782/meta.d.ts +2 -0
- package/types/S8783/generated-meta.d.ts +18 -0
- package/types/S8783/meta.d.ts +2 -0
- package/types/{S4784 → S8786}/generated-meta.d.ts +4 -3
- package/types/S8786/meta.d.ts +2 -0
- package/types/S881/generated-meta.d.ts +1 -0
- package/types/S888/generated-meta.d.ts +1 -0
- package/types/S930/generated-meta.d.ts +1 -0
- package/types/helpers/assertions-chai-common.d.ts +7 -0
- package/types/helpers/assertions-chai.d.ts +4 -0
- package/types/helpers/assertions-cypress.d.ts +7 -0
- package/types/helpers/assertions.d.ts +39 -0
- package/types/helpers/ast.d.ts +10 -0
- package/types/helpers/configs.d.ts +7 -38
- package/types/helpers/cypress.d.ts +11 -0
- package/types/helpers/dependency-manifests/all-in-parent-dirs.d.ts +18 -0
- package/types/helpers/dependency-manifests/closest.d.ts +5 -0
- package/types/helpers/{package-jsons → dependency-manifests}/dependencies.d.ts +22 -17
- package/types/helpers/dependency-manifests/index.d.ts +22 -0
- package/types/helpers/dependency-manifests/parse.d.ts +12 -0
- package/types/helpers/dependency-manifests/parsed-dependency-files.d.ts +8 -0
- package/types/helpers/dependency-manifests/resolvers/deno.d.ts +12 -0
- package/types/helpers/dependency-manifests/resolvers/helpers.d.ts +12 -0
- package/types/helpers/dependency-manifests/resolvers/package-json.d.ts +2 -0
- package/types/helpers/dependency-manifests/resolvers/types.d.ts +46 -0
- package/types/helpers/files.d.ts +10 -2
- package/types/helpers/generate-meta.d.ts +5 -0
- package/types/helpers/mocha-style-test-frameworks.d.ts +19 -0
- package/types/helpers/mocha.d.ts +7 -0
- package/types/helpers/module.d.ts +14 -8
- package/types/helpers/numbers.d.ts +4 -0
- package/types/helpers/playwright.d.ts +2 -0
- package/types/helpers/regex/extract.d.ts +7 -3
- package/types/helpers/sinon.d.ts +0 -1
- package/types/helpers/supertest.d.ts +0 -1
- package/types/helpers/test-file-pattern.d.ts +17 -0
- package/types/helpers/type-origin.d.ts +31 -0
- package/types/helpers/type.d.ts +92 -1
- package/types/helpers/vitest.d.ts +0 -1
- package/types/plugin-rules.d.ts +10 -11
- package/cjs/S2255/rule.js +0 -111
- package/cjs/S4787/rule.js +0 -124
- package/cjs/S4817/rule.js +0 -103
- package/cjs/S4818/generated-meta.js +0 -51
- package/cjs/S4818/meta.js +0 -21
- package/cjs/S4823/generated-meta.js +0 -51
- package/cjs/S4823/meta.js +0 -21
- package/cjs/S4823/rule.js +0 -75
- package/cjs/S4829/generated-meta.js +0 -51
- package/cjs/S4829/meta.js +0 -21
- package/cjs/S4829/rule.js +0 -75
- package/cjs/S5742/generated-meta.js +0 -51
- package/cjs/S5742/meta.js +0 -22
- package/cjs/S5742/rule.js +0 -75
- package/cjs/S5743/generated-meta.js +0 -51
- package/cjs/S5743/rule.js +0 -78
- package/cjs/S6245/generated-meta.js +0 -51
- package/cjs/S6245/meta.js +0 -22
- package/cjs/S6245/rule.js +0 -87
- package/cjs/S6299/generated-meta.js +0 -51
- package/cjs/S6299/index.js +0 -21
- package/cjs/S6299/meta.js +0 -21
- package/cjs/S6299/rule.js +0 -93
- package/cjs/helpers/package-jsons/all-in-parent-dirs.js +0 -31
- package/cjs/helpers/package-jsons/dependencies.js +0 -221
- package/cjs/helpers/package-jsons/index.js +0 -42
- package/cjs/helpers/package-jsons/parse.js +0 -79
- package/docs/aws-s3-bucket-server-encryption.md +0 -9
- package/docs/certificate-transparency.md +0 -9
- package/docs/cookies.md +0 -9
- package/docs/dns-prefetching.md +0 -9
- package/docs/encryption.md +0 -9
- package/docs/no-vue-bypass-sanitization.md +0 -9
- package/docs/process-argv.md +0 -9
- package/docs/regular-expr.md +0 -9
- package/docs/sockets.md +0 -9
- package/docs/standard-input.md +0 -9
- package/docs/xpath.md +0 -9
- package/types/S2255/meta.d.ts +0 -2
- package/types/S4784/meta.d.ts +0 -2
- package/types/S4787/meta.d.ts +0 -2
- package/types/S4817/meta.d.ts +0 -2
- package/types/S4818/generated-meta.d.ts +0 -17
- package/types/S4818/meta.d.ts +0 -2
- package/types/S4823/generated-meta.d.ts +0 -17
- package/types/S4823/meta.d.ts +0 -2
- package/types/S4829/generated-meta.d.ts +0 -17
- package/types/S4829/meta.d.ts +0 -2
- package/types/S5742/generated-meta.d.ts +0 -17
- package/types/S5742/meta.d.ts +0 -3
- package/types/S5743/generated-meta.d.ts +0 -17
- package/types/S6245/generated-meta.d.ts +0 -17
- package/types/S6245/meta.d.ts +0 -3
- package/types/S6299/generated-meta.d.ts +0 -17
- package/types/S6299/index.d.ts +0 -1
- package/types/S6299/meta.d.ts +0 -2
- package/types/S6299/rule.d.ts +0 -2
- package/types/helpers/package-jsons/all-in-parent-dirs.d.ts +0 -10
- package/types/helpers/package-jsons/closest.d.ts +0 -2
- package/types/helpers/package-jsons/index.d.ts +0 -8
- package/types/helpers/package-jsons/parse.d.ts +0 -13
- /package/cjs/{S2255 → S1244}/index.js +0 -0
- /package/cjs/{S4784 → S5845}/index.js +0 -0
- /package/cjs/{S4787 → S5906}/index.js +0 -0
- /package/cjs/{S4817 → S5914}/index.js +0 -0
- /package/cjs/{S4818 → S8754}/index.js +0 -0
- /package/cjs/{S4823 → S8780}/index.js +0 -0
- /package/cjs/{S4829 → S8781}/index.js +0 -0
- /package/cjs/{S5742 → S8782}/index.js +0 -0
- /package/cjs/{S5743 → S8783}/index.js +0 -0
- /package/cjs/{S6245 → S8786}/index.js +0 -0
- /package/types/{S2255 → S1244}/index.d.ts +0 -0
- /package/types/{S2255 → S1244}/rule.d.ts +0 -0
- /package/types/{S4784 → S5845}/index.d.ts +0 -0
- /package/types/{S4784 → S5845}/rule.d.ts +0 -0
- /package/types/{S4787 → S5906}/index.d.ts +0 -0
- /package/types/{S4787 → S5906}/rule.d.ts +0 -0
- /package/types/{S4817 → S5914}/index.d.ts +0 -0
- /package/types/{S4817 → S5914}/rule.d.ts +0 -0
- /package/types/{S4818 → S8754}/index.d.ts +0 -0
- /package/types/{S4818 → S8754}/rule.d.ts +0 -0
- /package/types/{S4823 → S8780}/index.d.ts +0 -0
- /package/types/{S4823 → S8780}/rule.d.ts +0 -0
- /package/types/{S4829 → S8781}/index.d.ts +0 -0
- /package/types/{S4829 → S8781}/rule.d.ts +0 -0
- /package/types/{S5742 → S8782}/index.d.ts +0 -0
- /package/types/{S5742 → S8782}/rule.d.ts +0 -0
- /package/types/{S5743 → S8783}/index.d.ts +0 -0
- /package/types/{S5743 → S8783}/rule.d.ts +0 -0
- /package/types/{S6245 → S8786}/index.d.ts +0 -0
- /package/types/{S6245 → S8786}/rule.d.ts +0 -0
|
@@ -0,0 +1,365 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
31
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
32
|
+
}) : function(o, v) {
|
|
33
|
+
o["default"] = v;
|
|
34
|
+
});
|
|
35
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
36
|
+
var ownKeys = function(o) {
|
|
37
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
38
|
+
var ar = [];
|
|
39
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
40
|
+
return ar;
|
|
41
|
+
};
|
|
42
|
+
return ownKeys(o);
|
|
43
|
+
};
|
|
44
|
+
return function (mod) {
|
|
45
|
+
if (mod && mod.__esModule) return mod;
|
|
46
|
+
var result = {};
|
|
47
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
48
|
+
__setModuleDefault(result, mod);
|
|
49
|
+
return result;
|
|
50
|
+
};
|
|
51
|
+
})();
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
exports.rule = void 0;
|
|
54
|
+
const semver_1 = require("semver");
|
|
55
|
+
const assertions_js_1 = require("../helpers/assertions.js");
|
|
56
|
+
const ast_js_1 = require("../helpers/ast.js");
|
|
57
|
+
const dependencies_js_1 = require("../helpers/dependency-manifests/dependencies.js");
|
|
58
|
+
const module_js_1 = require("../helpers/module.js");
|
|
59
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
60
|
+
const assertion_suggestions_js_1 = require("./assertion-suggestions.js");
|
|
61
|
+
const assertion_utils_js_1 = require("./assertion-utils.js");
|
|
62
|
+
const cypress_suggestions_js_1 = require("./cypress-suggestions.js");
|
|
63
|
+
const expect_chain_js_1 = require("./expect-chain.js");
|
|
64
|
+
const meta = __importStar(require("./generated-meta.js"));
|
|
65
|
+
const playwright_suggestions_js_1 = require("./playwright-suggestions.js");
|
|
66
|
+
const messages = {
|
|
67
|
+
preferSpecificAssertion: 'Prefer a more specific assertion instead of this generic one, e.g. "{{assertion}}".',
|
|
68
|
+
quickfix: 'Replace with {{assertion}}.',
|
|
69
|
+
};
|
|
70
|
+
const PLAYWRIGHT_MODULES = ['@playwright/test'];
|
|
71
|
+
const MAX_ASSERT_ARGUMENTS_WITH_MESSAGE = 3;
|
|
72
|
+
const CHAI_EQUALITY_MATCHERS = new Set(['equal', 'equals', 'eq', 'eql', 'eqls']);
|
|
73
|
+
const JASMINE_SIZE_DEPENDENCIES = ['jasmine-core', 'jasmine'];
|
|
74
|
+
const JASMINE_TO_HAVE_SIZE_MIN_VERSION = '3.6.0';
|
|
75
|
+
exports.rule = {
|
|
76
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, { messages, hasSuggestions: true }),
|
|
77
|
+
create(context) {
|
|
78
|
+
const sourceCode = context.sourceCode;
|
|
79
|
+
const hasPlaywright = (0, module_js_1.importsOrDependsOnModule)(context, PLAYWRIGHT_MODULES, PLAYWRIGHT_MODULES);
|
|
80
|
+
const jasmineSupportsToHaveSize = supportsJasmineToHaveSize(context);
|
|
81
|
+
const playwrightLocators = new Set();
|
|
82
|
+
function report(node, suggestion) {
|
|
83
|
+
const replacementText = suggestion.replacement;
|
|
84
|
+
const suggest = replacementText
|
|
85
|
+
? [
|
|
86
|
+
{
|
|
87
|
+
messageId: 'quickfix',
|
|
88
|
+
data: { assertion: suggestion.assertion },
|
|
89
|
+
fix: (fixer) => fixer.replaceText(node, replacementText),
|
|
90
|
+
},
|
|
91
|
+
]
|
|
92
|
+
: undefined;
|
|
93
|
+
context.report({
|
|
94
|
+
node: node.callee,
|
|
95
|
+
messageId: 'preferSpecificAssertion',
|
|
96
|
+
data: { assertion: suggestion.assertion },
|
|
97
|
+
...(suggest ? { suggest } : {}),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
...(hasPlaywright ? (0, assertion_utils_js_1.trackPlaywrightLocators)(context, playwrightLocators) : {}),
|
|
102
|
+
CallExpression(node) {
|
|
103
|
+
if (node.type !== 'CallExpression') {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (hasPlaywright) {
|
|
107
|
+
const playwrightSuggestion = (0, playwright_suggestions_js_1.getPlaywrightLocatorSuggestion)(context, node, sourceCode, playwrightLocators);
|
|
108
|
+
if (playwrightSuggestion) {
|
|
109
|
+
report(node, playwrightSuggestion);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const assertion = (0, assertions_js_1.extractTestAssertion)(context, node);
|
|
114
|
+
if (assertion?.kind !== 'comparison') {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const suggestion = getSuggestion(context, assertion.style, node, sourceCode, jasmineSupportsToHaveSize);
|
|
118
|
+
if (suggestion) {
|
|
119
|
+
report(node, suggestion);
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
function getSuggestion(context, style, node, sourceCode, jasmineSupportsToHaveSize) {
|
|
126
|
+
switch (style) {
|
|
127
|
+
case 'jest-like':
|
|
128
|
+
case 'playwright':
|
|
129
|
+
return getExpectLikeSuggestion(node, sourceCode, 'jest');
|
|
130
|
+
case 'jasmine':
|
|
131
|
+
return getExpectLikeSuggestion(node, sourceCode, 'jasmine', jasmineSupportsToHaveSize);
|
|
132
|
+
case 'chai-bdd':
|
|
133
|
+
return getChaiBddSuggestion(node, sourceCode);
|
|
134
|
+
case 'chai-assert':
|
|
135
|
+
return getChaiAssertSuggestion(context, node, sourceCode);
|
|
136
|
+
case 'cypress':
|
|
137
|
+
return (0, cypress_suggestions_js_1.getCypressSuggestion)(node, sourceCode);
|
|
138
|
+
default:
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function getExpectLikeSuggestion(node, sourceCode, family, jasmineSupportsToHaveSize = true) {
|
|
143
|
+
if (!(0, ast_js_1.isMethodCall)(node) ||
|
|
144
|
+
!['toBe', 'toEqual', 'toStrictEqual'].includes(node.callee.property.name)) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
const chain = (0, expect_chain_js_1.getExpectChain)(node.callee.object);
|
|
148
|
+
if (!chain || node.arguments.length !== 1) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
const { actual, negated } = chain;
|
|
152
|
+
const expected = node.arguments[0];
|
|
153
|
+
const actualText = sourceCode.getText(actual);
|
|
154
|
+
const expectedText = sourceCode.getText(expected);
|
|
155
|
+
const prefix = `expect(${actualText})${negated ? '.not' : ''}`;
|
|
156
|
+
if ((0, assertion_utils_js_1.isNullLiteral)(expected)) {
|
|
157
|
+
return (0, assertion_utils_js_1.replacement)(`${prefix}.toBeNull()`, node, sourceCode);
|
|
158
|
+
}
|
|
159
|
+
if ((0, assertion_utils_js_1.isUndefinedExpression)(expected)) {
|
|
160
|
+
return (0, assertion_utils_js_1.replacement)(negated ? `expect(${actualText}).toBeDefined()` : `${prefix}.toBeUndefined()`, node, sourceCode);
|
|
161
|
+
}
|
|
162
|
+
if ((0, assertion_utils_js_1.isNaNExpression)(expected)) {
|
|
163
|
+
if (family === 'jasmine' && node.callee.property.name === 'toBe') {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
return (0, assertion_utils_js_1.replacement)(`${prefix}.toBeNaN()`, node, sourceCode);
|
|
167
|
+
}
|
|
168
|
+
if ((0, assertion_utils_js_1.isLengthAccess)(actual)) {
|
|
169
|
+
if (family === 'jasmine' && !jasmineSupportsToHaveSize) {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
const lengthMatcher = family === 'jasmine' ? 'toHaveSize' : 'toHaveLength';
|
|
173
|
+
return (0, assertion_utils_js_1.replacement)(`expect(${sourceCode.getText(actual.object)}).${negated ? 'not.' : ''}${lengthMatcher}(${expectedText})`, node, sourceCode);
|
|
174
|
+
}
|
|
175
|
+
const booleanExpected = (0, assertion_utils_js_1.getBooleanValue)(expected);
|
|
176
|
+
if (booleanExpected === undefined) {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
return (0, assertion_suggestions_js_1.getBooleanExpressionSuggestion)(actual, booleanExpected !== negated, family, sourceCode, node);
|
|
180
|
+
}
|
|
181
|
+
function supportsJasmineToHaveSize(context) {
|
|
182
|
+
const dependencies = (0, dependencies_js_1.getDependenciesSanitizePaths)(context);
|
|
183
|
+
for (const dependency of JASMINE_SIZE_DEPENDENCIES) {
|
|
184
|
+
const versionSignal = dependencies.get(dependency);
|
|
185
|
+
if (!versionSignal || versionSignal === 'latest' || versionSignal === '*') {
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
const version = (0, semver_1.minVersion)(versionSignal);
|
|
190
|
+
return version !== null && version.compare(JASMINE_TO_HAVE_SIZE_MIN_VERSION) >= 0;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
function getChaiBddSuggestion(node, sourceCode) {
|
|
199
|
+
return getChaiExpectSuggestion(node, sourceCode) ?? getChaiShouldSuggestion(node, sourceCode);
|
|
200
|
+
}
|
|
201
|
+
function getChaiExpectSuggestion(node, sourceCode) {
|
|
202
|
+
if (!(0, ast_js_1.isMethodCall)(node) ||
|
|
203
|
+
!CHAI_EQUALITY_MATCHERS.has(node.callee.property.name) ||
|
|
204
|
+
node.arguments.length !== 1) {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
const chain = getChaiExpectChain(node.callee.object, sourceCode);
|
|
208
|
+
if (!chain) {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
return getChaiValueSuggestion(chain.actual, node.arguments[0], chain.negated, node, sourceCode, chain.messageArguments);
|
|
212
|
+
}
|
|
213
|
+
function getChaiShouldSuggestion(node, sourceCode) {
|
|
214
|
+
if (!(0, ast_js_1.isMethodCall)(node) ||
|
|
215
|
+
!CHAI_EQUALITY_MATCHERS.has(node.callee.property.name) ||
|
|
216
|
+
node.arguments.length !== 1) {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
const chain = getShouldChain(node.callee.object);
|
|
220
|
+
if (!chain) {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
return getChaiShouldValueSuggestion(chain.actual, node.arguments[0], chain.negated, node, sourceCode);
|
|
224
|
+
}
|
|
225
|
+
function getChaiAssertSuggestion(context, node, sourceCode) {
|
|
226
|
+
const method = getAssertMethod(context, node);
|
|
227
|
+
if (!method ||
|
|
228
|
+
node.arguments.length < 2 ||
|
|
229
|
+
node.arguments.length > MAX_ASSERT_ARGUMENTS_WITH_MESSAGE) {
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
const [actual, expected] = node.arguments;
|
|
233
|
+
const negated = method.startsWith('not');
|
|
234
|
+
const assertObject = getAssertObject(context, node);
|
|
235
|
+
if (!assertObject) {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
const assertText = sourceCode.getText(assertObject);
|
|
239
|
+
if (!['strictEqual', 'notStrictEqual'].includes(method)) {
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
const actualText = sourceCode.getText(actual);
|
|
243
|
+
const trailingArgs = messageArgument(node, sourceCode);
|
|
244
|
+
if ((0, assertion_utils_js_1.isNullLiteral)(expected)) {
|
|
245
|
+
return (0, assertion_utils_js_1.replacement)(`${assertText}.${negated ? 'isNotNull' : 'isNull'}(${actualText}${trailingArgs})`, node, sourceCode);
|
|
246
|
+
}
|
|
247
|
+
if ((0, assertion_utils_js_1.isUndefinedExpression)(expected)) {
|
|
248
|
+
return (0, assertion_utils_js_1.replacement)(`${assertText}.${negated ? 'isDefined' : 'isUndefined'}(${actualText}${trailingArgs})`, node, sourceCode);
|
|
249
|
+
}
|
|
250
|
+
if ((0, assertion_utils_js_1.isLengthAccess)(actual) && !negated) {
|
|
251
|
+
return (0, assertion_utils_js_1.replacement)(`${assertText}.lengthOf(${sourceCode.getText(actual.object)}, ${sourceCode.getText(expected)}${trailingArgs})`, node, sourceCode);
|
|
252
|
+
}
|
|
253
|
+
const booleanExpected = (0, assertion_utils_js_1.getBooleanValue)(expected);
|
|
254
|
+
if (booleanExpected === undefined) {
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
return (0, assertion_suggestions_js_1.getBooleanExpressionSuggestion)(actual, booleanExpected !== negated, 'assert', sourceCode, node, assertText, trailingArgs);
|
|
258
|
+
}
|
|
259
|
+
function getChaiValueSuggestion(actual, expected, negated, node, sourceCode, messageArguments = '') {
|
|
260
|
+
const actualText = sourceCode.getText(actual);
|
|
261
|
+
if ((0, assertion_utils_js_1.isNullLiteral)(expected)) {
|
|
262
|
+
return (0, assertion_utils_js_1.replacement)(`expect(${actualText}${messageArguments}).to${negated ? '.not' : ''}.be.null`, node, sourceCode);
|
|
263
|
+
}
|
|
264
|
+
if ((0, assertion_utils_js_1.isUndefinedExpression)(expected)) {
|
|
265
|
+
return (0, assertion_utils_js_1.replacement)(`expect(${actualText}${messageArguments}).to${negated ? '.not' : ''}.be.undefined`, node, sourceCode);
|
|
266
|
+
}
|
|
267
|
+
if ((0, assertion_utils_js_1.isLengthAccess)(actual)) {
|
|
268
|
+
return (0, assertion_utils_js_1.replacement)(`expect(${sourceCode.getText(actual.object)}${messageArguments}).to${negated ? '.not' : ''}.have.lengthOf(${sourceCode.getText(expected)})`, node, sourceCode);
|
|
269
|
+
}
|
|
270
|
+
const booleanExpected = (0, assertion_utils_js_1.getBooleanValue)(expected);
|
|
271
|
+
if (booleanExpected === undefined) {
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
return (0, assertion_suggestions_js_1.getBooleanExpressionSuggestion)(actual, booleanExpected !== negated, 'chai', sourceCode, node, 'expect', messageArguments);
|
|
275
|
+
}
|
|
276
|
+
function getChaiShouldValueSuggestion(actual, expected, negated, node, sourceCode) {
|
|
277
|
+
const actualText = sourceCode.getText(actual);
|
|
278
|
+
if ((0, assertion_utils_js_1.isNullLiteral)(expected)) {
|
|
279
|
+
return (0, assertion_utils_js_1.replacement)(`${(0, assertion_suggestions_js_1.chaiShouldReceiver)(actualText, actual)}.should${negated ? '.not' : ''}.be.null`, node, sourceCode);
|
|
280
|
+
}
|
|
281
|
+
if ((0, assertion_utils_js_1.isUndefinedExpression)(expected)) {
|
|
282
|
+
return (0, assertion_utils_js_1.replacement)(`${(0, assertion_suggestions_js_1.chaiShouldReceiver)(actualText, actual)}.should${negated ? '.not' : ''}.be.undefined`, node, sourceCode);
|
|
283
|
+
}
|
|
284
|
+
if ((0, assertion_utils_js_1.isLengthAccess)(actual)) {
|
|
285
|
+
const receiver = (0, assertion_suggestions_js_1.chaiShouldReceiver)(sourceCode.getText(actual.object), actual.object);
|
|
286
|
+
return (0, assertion_utils_js_1.replacement)(`${receiver}.should${negated ? '.not' : ''}.have.lengthOf(${sourceCode.getText(expected)})`, node, sourceCode);
|
|
287
|
+
}
|
|
288
|
+
const booleanExpected = (0, assertion_utils_js_1.getBooleanValue)(expected);
|
|
289
|
+
if (booleanExpected === undefined) {
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
return (0, assertion_suggestions_js_1.getBooleanExpressionSuggestion)(actual, booleanExpected !== negated, 'chai-should', sourceCode, node);
|
|
293
|
+
}
|
|
294
|
+
function getChaiExpectChain(node, sourceCode) {
|
|
295
|
+
let current = node;
|
|
296
|
+
let negated = false;
|
|
297
|
+
while (current.type === 'MemberExpression' &&
|
|
298
|
+
!current.computed &&
|
|
299
|
+
current.property.type === 'Identifier') {
|
|
300
|
+
if (current.property.name === 'not') {
|
|
301
|
+
negated = !negated;
|
|
302
|
+
}
|
|
303
|
+
current = current.object;
|
|
304
|
+
}
|
|
305
|
+
const [actual, ...messageArguments] = current.type === 'CallExpression' ? current.arguments : [];
|
|
306
|
+
if (current.type !== 'CallExpression' || !(0, ast_js_1.isIdentifier)(current.callee, 'expect') || !actual) {
|
|
307
|
+
return null;
|
|
308
|
+
}
|
|
309
|
+
return {
|
|
310
|
+
actual,
|
|
311
|
+
negated,
|
|
312
|
+
messageArguments: messageArguments
|
|
313
|
+
.map(argument => `, ${sourceCode.getText(argument)}`)
|
|
314
|
+
.join(''),
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
function getShouldChain(node) {
|
|
318
|
+
let current = node;
|
|
319
|
+
let negated = false;
|
|
320
|
+
while (current.type === 'MemberExpression' &&
|
|
321
|
+
!current.computed &&
|
|
322
|
+
current.property.type === 'Identifier') {
|
|
323
|
+
if (current.property.name === 'not') {
|
|
324
|
+
negated = !negated;
|
|
325
|
+
}
|
|
326
|
+
if (current.property.name === 'should') {
|
|
327
|
+
return { actual: current.object, negated };
|
|
328
|
+
}
|
|
329
|
+
current = current.object;
|
|
330
|
+
}
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
function getAssertMethod(context, node) {
|
|
334
|
+
if (node.callee.type === 'MemberExpression' &&
|
|
335
|
+
!node.callee.computed &&
|
|
336
|
+
node.callee.property.type === 'Identifier') {
|
|
337
|
+
const object = node.callee.object;
|
|
338
|
+
if ((0, ast_js_1.isIdentifier)(object, 'assert') ||
|
|
339
|
+
(object.type === 'MemberExpression' && (0, ast_js_1.isIdentifier)(object.property, 'assert'))) {
|
|
340
|
+
return node.callee.property.name;
|
|
341
|
+
}
|
|
342
|
+
const fqn = (0, module_js_1.getFullyQualifiedName)(context, node.callee);
|
|
343
|
+
if (fqn?.startsWith('chai.assert.')) {
|
|
344
|
+
return node.callee.property.name;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return null;
|
|
348
|
+
}
|
|
349
|
+
function getAssertObject(context, node) {
|
|
350
|
+
if (node.callee.type !== 'MemberExpression' ||
|
|
351
|
+
node.callee.computed ||
|
|
352
|
+
node.callee.property.type !== 'Identifier') {
|
|
353
|
+
return null;
|
|
354
|
+
}
|
|
355
|
+
const object = node.callee.object;
|
|
356
|
+
if ((0, ast_js_1.isIdentifier)(object, 'assert') ||
|
|
357
|
+
(object.type === 'MemberExpression' && (0, ast_js_1.isIdentifier)(object.property, 'assert')) ||
|
|
358
|
+
(0, module_js_1.getFullyQualifiedName)(context, node.callee)?.startsWith('chai.assert.')) {
|
|
359
|
+
return object;
|
|
360
|
+
}
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
function messageArgument(node, sourceCode) {
|
|
364
|
+
return node.arguments[2] ? `, ${sourceCode.getText(node.arguments[2])}` : '';
|
|
365
|
+
}
|
|
@@ -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/S5914/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: 'Assertions should not fail or succeed unconditionally',
|
|
40
|
+
recommended: true,
|
|
41
|
+
url: 'https://sonarsource.github.io/rspec/#/rspec/S5914/javascript',
|
|
42
|
+
requiresTypeChecking: false,
|
|
43
|
+
},
|
|
44
|
+
fixable: undefined,
|
|
45
|
+
deprecated: false,
|
|
46
|
+
defaultOptions: [],
|
|
47
|
+
};
|
|
48
|
+
exports.sonarKey = 'S5914';
|
|
49
|
+
exports.scope = 'Tests';
|
|
50
|
+
exports.languages = ['js', 'ts'];
|
|
51
|
+
exports.requiredDependency = [];
|
|
52
|
+
exports.skipOnGeneratedSource = false;
|
|
@@ -0,0 +1,213 @@
|
|
|
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/S5914/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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
31
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
32
|
+
}) : function(o, v) {
|
|
33
|
+
o["default"] = v;
|
|
34
|
+
});
|
|
35
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
36
|
+
var ownKeys = function(o) {
|
|
37
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
38
|
+
var ar = [];
|
|
39
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
40
|
+
return ar;
|
|
41
|
+
};
|
|
42
|
+
return ownKeys(o);
|
|
43
|
+
};
|
|
44
|
+
return function (mod) {
|
|
45
|
+
if (mod && mod.__esModule) return mod;
|
|
46
|
+
var result = {};
|
|
47
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
48
|
+
__setModuleDefault(result, mod);
|
|
49
|
+
return result;
|
|
50
|
+
};
|
|
51
|
+
})();
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
exports.rule = void 0;
|
|
54
|
+
const assertions_js_1 = require("../helpers/assertions.js");
|
|
55
|
+
const ast_js_1 = require("../helpers/ast.js");
|
|
56
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
57
|
+
const meta = __importStar(require("./generated-meta.js"));
|
|
58
|
+
const messages = {
|
|
59
|
+
issue: 'Replace this assertion; it always succeeds or fails.',
|
|
60
|
+
// hint targeted at identity comparisons against a freshly-created value: a deep equality matcher is almost always what was meant
|
|
61
|
+
freshIdentity: 'Use a deep equality matcher; freshly-created values are never identical to other values.',
|
|
62
|
+
// hint for predicate assertions on a freshly-created value, where the truthiness/nullishness is statically known
|
|
63
|
+
freshPredicate: 'Replace this assertion; the value is freshly created here, so the result is independent of the code under test.',
|
|
64
|
+
};
|
|
65
|
+
exports.rule = {
|
|
66
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, { messages }),
|
|
67
|
+
create(context) {
|
|
68
|
+
function checkAssertion(node) {
|
|
69
|
+
const assertion = (0, assertions_js_1.extractTestAssertion)(context, node);
|
|
70
|
+
const trivial = assertion ? getTrivialAssertion(context, assertion) : null;
|
|
71
|
+
if (trivial) {
|
|
72
|
+
context.report({ node: trivial.reportNode, messageId: trivial.messageId });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
CallExpression(node) {
|
|
77
|
+
checkAssertion(node);
|
|
78
|
+
},
|
|
79
|
+
MemberExpression(node) {
|
|
80
|
+
checkAssertion(node);
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Classifies the assertion as trivial (always succeeds or always fails) and picks the most
|
|
87
|
+
* informative message for the underlying cause.
|
|
88
|
+
* @returns the node to report and the corresponding message id, or null if the assertion is not trivial.
|
|
89
|
+
*/
|
|
90
|
+
function getTrivialAssertion(context, assertion) {
|
|
91
|
+
switch (assertion.kind) {
|
|
92
|
+
case 'predicate':
|
|
93
|
+
if (isConstantPrimitiveValue(context, assertion.actual)) {
|
|
94
|
+
return { reportNode: assertion.actual, messageId: 'issue' };
|
|
95
|
+
}
|
|
96
|
+
if (isFreshReferenceExpression(assertion.actual)) {
|
|
97
|
+
return { reportNode: assertion.actual, messageId: 'freshPredicate' };
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
case 'comparison':
|
|
101
|
+
if (assertion.comparison === 'strict') {
|
|
102
|
+
// a freshly-created value on either side makes strict equality trivially fail
|
|
103
|
+
// (or trivially succeed when negated). Loose equality is excluded because object-to-primitive
|
|
104
|
+
// coercion can make comparisons like `[] == false` pass.
|
|
105
|
+
if (isFreshReferenceExpression(assertion.actual)) {
|
|
106
|
+
return { reportNode: assertion.actual, messageId: 'freshIdentity' };
|
|
107
|
+
}
|
|
108
|
+
if (isFreshReferenceExpression(assertion.expected)) {
|
|
109
|
+
return { reportNode: assertion.expected, messageId: 'freshIdentity' };
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// both sides are constant (syntactically or via a resolved binding): for strict or loose
|
|
113
|
+
// equality the comparison result is statically determined. Deep equality is intentionally
|
|
114
|
+
// skipped via an explicit whitelist to avoid widening this rule when assertion helper
|
|
115
|
+
// comparison kinds evolve.
|
|
116
|
+
if ((assertion.comparison === 'strict' || assertion.comparison === 'loose') &&
|
|
117
|
+
isConstantPrimitiveValue(context, assertion.actual) &&
|
|
118
|
+
isConstantPrimitiveValue(context, assertion.expected)) {
|
|
119
|
+
return { reportNode: assertion.actual, messageId: 'issue' };
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
default:
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const UNARY_OPERATORS_PRESERVING_CONSTNESS = new Set([
|
|
127
|
+
'!',
|
|
128
|
+
'+',
|
|
129
|
+
'-',
|
|
130
|
+
'typeof',
|
|
131
|
+
]);
|
|
132
|
+
function isConstantPrimitiveValue(context, node, visited) {
|
|
133
|
+
// resolve `const` bindings through their initializer so that identifiers bound to a constant
|
|
134
|
+
// primitive are treated as constants too. `visited` guards against mutually-recursive const
|
|
135
|
+
// references like `const a = b; const b = a;` (TDZ at runtime).
|
|
136
|
+
if (node.type === 'Identifier' && node.name !== 'undefined') {
|
|
137
|
+
visited ??= new Set();
|
|
138
|
+
const resolved = resolveConstBinding(context, node, visited);
|
|
139
|
+
if (resolved) {
|
|
140
|
+
return isConstantPrimitiveValue(context, resolved, visited);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
switch (node.type) {
|
|
144
|
+
case 'Literal':
|
|
145
|
+
return (node.value === null ||
|
|
146
|
+
typeof node.value === 'boolean' ||
|
|
147
|
+
typeof node.value === 'string' ||
|
|
148
|
+
typeof node.value === 'number' ||
|
|
149
|
+
('bigint' in node && typeof node.bigint === 'string'));
|
|
150
|
+
case 'Identifier':
|
|
151
|
+
if (node.name === 'undefined') {
|
|
152
|
+
const variable = (0, ast_js_1.getVariableFromName)(context, 'undefined', node);
|
|
153
|
+
// global `undefined` has no user definitions; a shadowed binding does
|
|
154
|
+
return !variable || variable.defs.length === 0;
|
|
155
|
+
}
|
|
156
|
+
return false;
|
|
157
|
+
case 'TemplateLiteral':
|
|
158
|
+
return node.expressions.length === 0;
|
|
159
|
+
case 'UnaryExpression':
|
|
160
|
+
// `void X` is always undefined regardless of X; the other operators preserve constness
|
|
161
|
+
return (node.operator === 'void' ||
|
|
162
|
+
(UNARY_OPERATORS_PRESERVING_CONSTNESS.has(node.operator) &&
|
|
163
|
+
isConstantPrimitiveValue(context, node.argument, visited)));
|
|
164
|
+
case 'BinaryExpression':
|
|
165
|
+
case 'LogicalExpression':
|
|
166
|
+
return (isConstantPrimitiveValue(context, node.left, visited) &&
|
|
167
|
+
isConstantPrimitiveValue(context, node.right, visited));
|
|
168
|
+
default:
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Returns the initializer of `node` if it refers to a `const` binding declared with a plain identifier
|
|
174
|
+
* pattern (no destructuring) and that binding has not been visited already, otherwise undefined.
|
|
175
|
+
* Restricting to `const` ensures the binding's value is statically equal to the initializer at every read.
|
|
176
|
+
* The variable is added to `visited` so mutually-recursive references cannot loop forever.
|
|
177
|
+
*/
|
|
178
|
+
function resolveConstBinding(context, node, visited) {
|
|
179
|
+
const variable = (0, ast_js_1.getVariableFromName)(context, node.name, node);
|
|
180
|
+
if (!variable || visited.has(variable) || variable.defs.length !== 1) {
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
const def = variable.defs[0];
|
|
184
|
+
if (def.type !== 'Variable' || def.parent?.type !== 'VariableDeclaration') {
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
if (def.parent.kind !== 'const' || def.node.id.type !== 'Identifier') {
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
visited.add(variable);
|
|
191
|
+
return def.node.init;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* These expression types create a new reference on each evaluation, so they are always different from any other value
|
|
195
|
+
*/
|
|
196
|
+
const FRESH_REFERENCE_EXPRESSIONS = new Set([
|
|
197
|
+
'ArrayExpression',
|
|
198
|
+
'ObjectExpression',
|
|
199
|
+
'FunctionExpression',
|
|
200
|
+
'ArrowFunctionExpression',
|
|
201
|
+
'ClassExpression',
|
|
202
|
+
'NewExpression',
|
|
203
|
+
]);
|
|
204
|
+
/**
|
|
205
|
+
* Checks if the given node is an expression that creates a new reference on each evaluation, and thus is always different from any other value.
|
|
206
|
+
*/
|
|
207
|
+
function isFreshReferenceExpression(node) {
|
|
208
|
+
// regex literals create a fresh RegExp object on each evaluation
|
|
209
|
+
if (node.type === 'Literal' && 'regex' in node) {
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
return FRESH_REFERENCE_EXPRESSIONS.has(node.type);
|
|
213
|
+
}
|
|
@@ -31,7 +31,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
31
31
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
32
32
|
};
|
|
33
33
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
-
exports.requiredDependency = exports.languages = exports.scope = exports.sonarKey = exports.meta = void 0;
|
|
34
|
+
exports.skipOnGeneratedSource = exports.requiredDependency = exports.languages = exports.scope = exports.sonarKey = exports.meta = void 0;
|
|
35
35
|
__exportStar(require("./meta.js"), exports);
|
|
36
36
|
exports.meta = {
|
|
37
37
|
type: 'suggestion',
|
|
@@ -49,3 +49,4 @@ exports.sonarKey = 'S5958';
|
|
|
49
49
|
exports.scope = 'Tests';
|
|
50
50
|
exports.languages = ['js', 'ts'];
|
|
51
51
|
exports.requiredDependency = [];
|
|
52
|
+
exports.skipOnGeneratedSource = true;
|
|
@@ -31,7 +31,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
31
31
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
32
32
|
};
|
|
33
33
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
-
exports.requiredDependency = exports.languages = exports.scope = exports.sonarKey = exports.meta = void 0;
|
|
34
|
+
exports.skipOnGeneratedSource = exports.requiredDependency = exports.languages = exports.scope = exports.sonarKey = exports.meta = void 0;
|
|
35
35
|
__exportStar(require("./meta.js"), exports);
|
|
36
36
|
exports.meta = {
|
|
37
37
|
type: 'suggestion',
|
|
@@ -49,3 +49,4 @@ exports.sonarKey = 'S5973';
|
|
|
49
49
|
exports.scope = 'Tests';
|
|
50
50
|
exports.languages = ['js', 'ts'];
|
|
51
51
|
exports.requiredDependency = [];
|
|
52
|
+
exports.skipOnGeneratedSource = true;
|
package/cjs/S5973/rule.js
CHANGED
|
@@ -56,7 +56,7 @@ const module_js_1 = require("../helpers/module.js");
|
|
|
56
56
|
const ast_js_1 = require("../helpers/ast.js");
|
|
57
57
|
const mocha_js_1 = require("../helpers/mocha.js");
|
|
58
58
|
const meta = __importStar(require("./generated-meta.js"));
|
|
59
|
-
const dependencies_js_1 = require("../helpers/
|
|
59
|
+
const dependencies_js_1 = require("../helpers/dependency-manifests/dependencies.js");
|
|
60
60
|
exports.rule = {
|
|
61
61
|
meta: (0, generate_meta_js_1.generateMeta)(meta, {
|
|
62
62
|
messages: {
|