eslint-plugin-sonarjs 4.0.0 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +269 -268
- package/cjs/S100/rule.js +7 -5
- package/cjs/S101/rule.js +2 -2
- package/cjs/S104/rule.js +2 -2
- package/cjs/S105/rule.js +2 -2
- package/cjs/S1066/rule.js +5 -4
- package/cjs/S1067/rule.js +8 -6
- package/cjs/S1110/rule.js +7 -5
- package/cjs/S1119/rule.js +85 -7
- package/cjs/S1121/rule.js +4 -3
- package/cjs/S1125/rule.js +9 -8
- package/cjs/S1126/rule.js +2 -2
- package/cjs/S1128/rule.js +8 -5
- package/cjs/S1134/rule.js +2 -2
- package/cjs/S1135/rule.js +2 -2
- package/cjs/S1154/rule.js +6 -4
- package/cjs/S117/rule.js +6 -5
- package/cjs/S1172/rule.js +2 -2
- package/cjs/S1192/rule.js +5 -4
- package/cjs/S1219/rule.js +4 -3
- package/cjs/S1226/rule.js +6 -4
- package/cjs/S124/rule.js +2 -2
- package/cjs/S125/rule.js +9 -7
- package/cjs/S126/rule.js +2 -2
- package/cjs/S1264/rule.js +2 -2
- package/cjs/S128/rule.js +4 -3
- package/cjs/S1291/rule.js +2 -2
- package/cjs/S1301/rule.js +2 -2
- package/cjs/S1313/rule.js +2 -2
- package/cjs/S134/rule.js +7 -5
- package/cjs/S135/rule.js +5 -4
- package/cjs/S138/rule.js +9 -6
- package/cjs/S1439/rule.js +2 -2
- package/cjs/S1444/rule.js +2 -2
- package/cjs/S1451/rule.js +2 -2
- package/cjs/S1472/rule.js +2 -2
- package/cjs/S1479/rule.js +2 -2
- package/cjs/S1481/rule.js +2 -2
- package/cjs/S1488/generated-meta.js +1 -1
- package/cjs/S1488/rule.js +11 -7
- package/cjs/S1515/rule.js +10 -8
- package/cjs/{helpers/aws/index.js → S1523/generated-meta.js} +34 -18
- package/cjs/S1523/index.js +21 -0
- package/cjs/S1523/meta.js +21 -0
- package/cjs/S1523/rule.js +143 -0
- package/cjs/S1526/rule.js +5 -4
- package/cjs/S1527/rule.js +2 -2
- package/cjs/S1528/rule.js +2 -2
- package/cjs/S1529/generated-meta.js +1 -1
- package/cjs/S1529/rule.js +4 -3
- package/cjs/S1530/rule.js +5 -3
- package/cjs/S1533/rule.js +2 -2
- package/cjs/S1535/rule.js +2 -2
- package/cjs/S1541/rule.js +10 -7
- package/cjs/S1607/rule.js +22 -20
- package/cjs/S1764/rule.js +10 -7
- package/cjs/S1821/rule.js +2 -2
- package/cjs/S1848/rule.js +10 -7
- package/cjs/S1854/rule.js +18 -14
- package/cjs/S1862/rule.js +10 -8
- package/cjs/S1871/rule.js +21 -16
- package/cjs/S1874/rule.js +4 -3
- package/cjs/S1940/rule.js +2 -2
- package/cjs/S1994/rule.js +10 -7
- package/cjs/S2004/rule.js +9 -7
- package/cjs/S2068/rule.js +75 -12
- package/cjs/S2077/generated-meta.js +1 -1
- package/cjs/S2077/rule.js +10 -6
- package/cjs/S2092/rule.js +2 -2
- package/cjs/S2123/rule.js +2 -2
- package/cjs/S2137/rule.js +2 -2
- package/cjs/S2138/rule.js +4 -3
- package/cjs/S2187/rule.js +2 -2
- package/cjs/S2201/rule.js +47 -5
- package/cjs/S2208/rule.js +2 -2
- package/cjs/S2234/rule.js +58 -11
- package/cjs/S2245/rule.js +4 -3
- package/cjs/S2251/rule.js +5 -4
- package/cjs/S2255/rule.js +6 -5
- package/cjs/S2259/rule.js +14 -9
- package/cjs/S2301/rule.js +14 -9
- package/cjs/S2310/rule.js +80 -9
- package/cjs/S2392/rule.js +7 -5
- package/cjs/S2424/rule.js +2 -2
- package/cjs/S2428/rule.js +8 -6
- package/cjs/S2486/rule.js +4 -3
- package/cjs/S2589/rule.js +12 -10
- package/cjs/S2598/rule.js +17 -14
- package/cjs/S2612/generated-meta.js +1 -1
- package/cjs/S2612/rule.js +8 -6
- package/cjs/S2639/rule.js +2 -2
- package/cjs/S2681/rule.js +2 -2
- package/cjs/S2692/rule.js +6 -4
- package/cjs/S2699/generated-meta.js +1 -1
- package/cjs/S2699/rule.js +40 -31
- package/cjs/S2703/rule.js +2 -2
- package/cjs/S2737/rule.js +6 -4
- package/cjs/S2755/rule.js +9 -6
- package/cjs/S2757/rule.js +2 -2
- package/cjs/S2817/rule.js +10 -7
- package/cjs/S2819/rule.js +16 -12
- package/cjs/S2870/rule.js +8 -5
- package/cjs/S2871/rule.js +12 -9
- package/cjs/S2970/rule.js +9 -8
- package/cjs/S2990/rule.js +2 -2
- package/cjs/S2999/rule.js +10 -7
- package/cjs/S3001/rule.js +2 -2
- package/cjs/S3003/rule.js +10 -7
- package/cjs/S3317/rule.js +4 -3
- package/cjs/S3330/rule.js +2 -2
- package/cjs/S3358/rule.js +2 -2
- package/cjs/S3402/rule.js +14 -10
- package/cjs/S3403/rule.js +10 -7
- package/cjs/S3415/rule.js +16 -13
- package/cjs/S3499/rule.js +5 -4
- package/cjs/S3500/rule.js +5 -4
- package/cjs/S3513/rule.js +5 -4
- package/cjs/S3514/rule.js +10 -7
- package/cjs/S3516/rule.js +10 -7
- package/cjs/S3524/rule.js +2 -2
- package/cjs/S3525/rule.js +6 -4
- package/cjs/S3531/rule.js +5 -3
- package/cjs/S3533/rule.js +8 -7
- package/cjs/S3579/rule.js +6 -4
- package/cjs/S3616/rule.js +6 -4
- package/cjs/S3626/rule.js +4 -3
- package/cjs/S3686/rule.js +7 -5
- package/cjs/S3699/rule.js +4 -3
- package/cjs/S3735/rule.js +8 -5
- package/cjs/S3757/rule.js +8 -6
- package/cjs/S3758/rule.js +9 -7
- package/cjs/S3760/rule.js +24 -21
- package/cjs/S3776/rule.js +26 -22
- package/cjs/S3782/rule.js +6 -4
- package/cjs/S3785/rule.js +9 -6
- package/cjs/S3796/rule.js +12 -8
- package/cjs/S3798/rule.js +4 -3
- package/cjs/S3800/rule.js +22 -11
- package/cjs/S3801/generated-meta.js +1 -1
- package/cjs/S3801/rule.js +15 -11
- package/cjs/S3827/rule.js +9 -6
- package/cjs/S3923/rule.js +9 -6
- package/cjs/S3972/rule.js +5 -4
- package/cjs/S3973/rule.js +7 -5
- package/cjs/S3981/rule.js +4 -3
- package/cjs/S3984/rule.js +4 -3
- package/cjs/S4030/rule.js +10 -7
- package/cjs/S4036/rule.js +7 -5
- package/cjs/S4043/rule.js +12 -8
- package/cjs/S4139/rule.js +7 -5
- package/cjs/S4143/rule.js +12 -9
- package/cjs/S4144/rule.js +12 -9
- package/cjs/S4158/rule.js +11 -8
- package/cjs/S4165/rule.js +14 -12
- package/cjs/S4322/rule.js +8 -5
- package/cjs/S4323/rule.js +4 -3
- package/cjs/S4324/rule.js +7 -5
- package/cjs/S4328/rule.js +2 -2
- package/cjs/S4335/rule.js +6 -4
- package/cjs/S4423/rule.js +4 -3
- package/cjs/S4423/rule.lib.js +8 -7
- package/cjs/S4426/rule.js +11 -10
- package/cjs/S4502/rule.js +16 -13
- package/cjs/S4507/rule.js +8 -6
- package/cjs/S4524/rule.js +2 -2
- package/cjs/S4619/rule.js +6 -4
- package/cjs/S4621/rule.js +5 -4
- package/cjs/S4622/rule.js +5 -3
- package/cjs/S4623/rule.js +8 -5
- package/cjs/S4624/rule.js +6 -4
- package/cjs/S4634/rule.js +4 -3
- package/cjs/S4721/rule.js +7 -5
- package/cjs/S4782/rule.js +7 -5
- package/cjs/S4784/rule.js +5 -4
- package/cjs/S4787/rule.js +9 -7
- package/cjs/S4790/rule.js +7 -5
- package/cjs/S4798/rule.js +2 -2
- package/cjs/S4817/rule.js +10 -8
- package/cjs/S4818/rule.js +4 -3
- package/cjs/S4822/rule.js +13 -9
- package/cjs/S4823/rule.js +4 -3
- package/cjs/S4829/rule.js +4 -3
- package/cjs/S4830/rule.js +11 -8
- package/cjs/S5042/rule.js +9 -7
- package/cjs/S5122/rule.js +40 -36
- package/cjs/S5148/rule.js +9 -8
- package/cjs/S5247/rule.js +22 -18
- package/cjs/S5256/rule.js +5 -4
- package/cjs/S5257/rule.js +4 -3
- package/cjs/S5260/rule.js +4 -3
- package/cjs/S5264/rule.js +4 -3
- package/cjs/S5332/rule.js +4 -3
- package/cjs/S5332/rule.lib.js +19 -17
- package/cjs/S5443/rule.js +2 -2
- package/cjs/S5527/rule.js +18 -14
- package/cjs/S5542/rule.js +6 -4
- package/cjs/S5547/rule.js +6 -4
- package/cjs/S5604/rule.js +15 -14
- package/cjs/S5659/rule.js +15 -12
- package/cjs/S5689/rule.js +11 -8
- package/cjs/S5691/rule.js +7 -5
- package/cjs/S5693/rule.js +14 -12
- package/cjs/S5725/rule.js +9 -6
- package/cjs/S5728/rule.js +7 -4
- package/cjs/S5730/rule.js +9 -6
- package/cjs/S5732/rule.js +8 -5
- package/cjs/S5734/rule.js +7 -4
- package/cjs/S5736/rule.js +8 -5
- package/cjs/S5739/rule.js +11 -8
- package/cjs/S5742/rule.js +7 -4
- package/cjs/S5743/rule.js +8 -6
- package/cjs/S5757/rule.js +13 -10
- package/cjs/S5759/rule.js +10 -7
- package/cjs/S5842/rule.js +2 -2
- package/cjs/S5843/rule.js +22 -19
- package/cjs/S5850/rule.js +4 -3
- package/cjs/S5852/rule.js +2 -2
- package/cjs/S5856/rule.js +10 -7
- package/cjs/S5860/rule.js +30 -26
- package/cjs/S5863/rule.js +15 -11
- package/cjs/S5867/rule.js +8 -7
- package/cjs/S5868/rule.js +7 -5
- package/cjs/S5869/rule.js +6 -5
- package/cjs/S5876/rule.js +12 -8
- package/cjs/S5958/rule.js +12 -9
- package/cjs/S5973/rule.js +10 -7
- package/cjs/S6019/rule.js +4 -3
- package/cjs/S6035/rule.js +2 -2
- package/cjs/S6079/rule.js +9 -6
- package/cjs/S6080/rule.js +13 -10
- package/cjs/S6092/rule.js +9 -7
- package/cjs/S6245/rule.js +14 -9
- package/cjs/S6249/rule.js +7 -5
- package/cjs/S6252/rule.js +12 -8
- package/cjs/S6265/rule.js +27 -20
- package/cjs/S6268/rule.js +5 -4
- package/cjs/S6270/rule.js +12 -9
- package/cjs/S6275/rule.js +2 -2
- package/cjs/S6281/rule.js +22 -17
- package/cjs/S6299/rule.js +2 -2
- package/cjs/S6302/rule.js +6 -5
- package/cjs/S6303/rule.js +12 -10
- package/cjs/S6304/rule.js +6 -5
- package/cjs/S6308/rule.js +7 -5
- package/cjs/S6317/rule.js +5 -4
- package/cjs/S6319/rule.js +2 -2
- package/cjs/S6321/rule.js +25 -23
- package/cjs/S6323/rule.js +4 -3
- package/cjs/S6324/rule.js +2 -2
- package/cjs/S6326/rule.js +2 -2
- package/cjs/S6327/rule.js +2 -2
- package/cjs/S6328/rule.js +4 -3
- package/cjs/S6329/rule.js +7 -5
- package/cjs/S6330/rule.js +2 -2
- package/cjs/S6332/rule.js +2 -2
- package/cjs/S6333/rule.js +8 -6
- package/cjs/S6351/rule.js +22 -19
- package/cjs/S6353/rule.js +2 -2
- package/cjs/S6397/rule.js +2 -2
- package/cjs/S6418/config.js +1 -1
- package/cjs/S6418/rule.js +9 -24
- package/cjs/S6426/rule.js +5 -4
- package/cjs/S6437/rule.js +10 -7
- package/cjs/S6439/rule.js +9 -7
- package/cjs/S6442/rule.js +11 -8
- package/cjs/S6443/rule.js +9 -7
- package/cjs/S6486/rule.js +5 -4
- package/cjs/S6564/rule.js +4 -3
- package/cjs/S6594/rule.js +12 -8
- package/cjs/S6627/rule.js +6 -4
- package/cjs/S6759/rule.js +10 -6
- package/cjs/S6958/rule.js +2 -2
- package/cjs/S6959/rule.js +9 -6
- package/cjs/S7059/generated-meta.js +1 -1
- package/cjs/S7059/rule.js +8 -5
- package/cjs/S7639/generated-meta.js +1 -1
- package/cjs/S7639/rule.js +5 -4
- package/cjs/S7790/generated-meta.js +1 -1
- package/cjs/S7790/rule.js +7 -5
- package/cjs/S8441/generated-meta.js +1 -1
- package/cjs/S8441/rule.js +13 -9
- package/cjs/S881/rule.js +2 -2
- package/cjs/S888/rule.js +4 -3
- package/cjs/S930/rule.js +14 -12
- package/cjs/helpers/ast.js +11 -8
- package/cjs/helpers/aws/s3.js +9 -6
- package/cjs/helpers/chai.js +41 -43
- package/cjs/helpers/configs.js +92 -0
- package/cjs/helpers/cookie-flag-check.js +19 -17
- package/cjs/helpers/{decorators/index.js → entropy.js} +16 -17
- package/cjs/helpers/express.js +127 -128
- package/cjs/helpers/find-up/all-in-parent-dirs.js +0 -16
- package/cjs/helpers/mocha.js +50 -54
- package/cjs/helpers/regex/ast.js +7 -6
- package/cjs/helpers/regex/extract.js +11 -11
- package/cjs/helpers/regex/group.js +2 -2
- package/cjs/helpers/regex/location.js +2 -2
- package/cjs/helpers/regex/range.js +5 -4
- package/cjs/helpers/regex/rule-template.js +4 -3
- package/cjs/helpers/sinon.js +33 -36
- package/cjs/helpers/supertest.js +34 -37
- package/cjs/helpers/vitest.js +29 -32
- package/cjs/plugin-rules.js +452 -450
- package/docs/assertions-in-tests.md +2 -0
- package/docs/bitwise-operators.md +2 -0
- package/docs/code-eval.md +7 -0
- package/docs/file-permissions.md +1 -1
- package/docs/no-async-constructor.md +2 -0
- package/docs/no-inconsistent-returns.md +2 -0
- package/docs/prefer-immediate-return.md +2 -0
- package/docs/sql-queries.md +2 -0
- package/package.json +39 -1
- package/types/S1067/rule.d.ts +1 -1
- package/types/S1110/rule.d.ts +1 -1
- package/types/S1128/rule.d.ts +1 -1
- package/types/S1172/rule.d.ts +1 -1
- package/types/S1226/rule.d.ts +1 -1
- package/types/S134/rule.d.ts +1 -1
- package/types/S1472/rule.d.ts +1 -1
- package/types/S1481/rule.d.ts +1 -1
- package/types/S1488/generated-meta.d.ts +1 -1
- package/types/S1515/rule.d.ts +1 -1
- package/types/S1523/generated-meta.d.ts +17 -0
- package/types/S1523/index.d.ts +1 -0
- package/types/S1523/meta.d.ts +2 -0
- package/types/S1523/rule.d.ts +2 -0
- package/types/S1527/rule.d.ts +1 -1
- package/types/S1529/generated-meta.d.ts +1 -1
- package/types/S1541/rule.d.ts +1 -1
- package/types/S1862/rule.d.ts +1 -1
- package/types/S2077/generated-meta.d.ts +1 -1
- package/types/S2123/rule.d.ts +1 -1
- package/types/S2259/rule.d.ts +1 -1
- package/types/S2428/rule.d.ts +1 -1
- package/types/S2589/rule.d.ts +1 -1
- package/types/S2598/rule.d.ts +1 -1
- package/types/S2699/generated-meta.d.ts +1 -1
- package/types/S2699/rule.d.ts +1 -1
- package/types/S2737/rule.d.ts +1 -1
- package/types/S2757/rule.d.ts +1 -1
- package/types/S2819/rule.d.ts +1 -1
- package/types/S3001/rule.d.ts +1 -1
- package/types/S3317/rule.d.ts +1 -1
- package/types/S3500/rule.d.ts +1 -1
- package/types/S3513/rule.d.ts +1 -1
- package/types/S3686/rule.d.ts +1 -1
- package/types/S3801/generated-meta.d.ts +1 -1
- package/types/S3972/rule.d.ts +1 -1
- package/types/S3973/rule.d.ts +1 -1
- package/types/S4030/rule.d.ts +1 -1
- package/types/S4143/rule.d.ts +1 -1
- package/types/S4158/rule.d.ts +1 -1
- package/types/S4621/rule.d.ts +1 -1
- package/types/S4782/rule.d.ts +1 -1
- package/types/S5693/rule.d.ts +1 -1
- package/types/S5725/rule.d.ts +1 -1
- package/types/S5860/rule.d.ts +1 -1
- package/types/S5868/rule.d.ts +1 -1
- package/types/S5869/rule.d.ts +1 -1
- package/types/S6079/rule.d.ts +1 -1
- package/types/S6326/rule.d.ts +1 -1
- package/types/S6351/rule.d.ts +1 -1
- package/types/S6418/config.d.ts +1 -1
- package/types/S6443/rule.d.ts +1 -1
- package/types/S7059/generated-meta.d.ts +1 -1
- package/types/S7639/generated-meta.d.ts +1 -1
- package/types/S7790/generated-meta.d.ts +1 -1
- package/types/S8441/generated-meta.d.ts +1 -1
- package/types/S930/rule.d.ts +1 -1
- package/types/helpers/ancestor.d.ts +3 -3
- package/types/helpers/ast.d.ts +1 -1
- package/types/helpers/aws/iam.d.ts +2 -2
- package/types/helpers/aws/s3.d.ts +1 -1
- package/types/helpers/chai.d.ts +3 -5
- package/types/helpers/configs.d.ts +39 -1
- package/types/helpers/entropy.d.ts +1 -0
- package/types/helpers/equivalence.d.ts +1 -1
- package/types/helpers/express.d.ts +38 -43
- package/types/helpers/find-up/all-in-parent-dirs.d.ts +1 -1
- package/types/helpers/find-up/closest.d.ts +1 -1
- package/types/helpers/find-up/find-minimatch.d.ts +1 -1
- package/types/helpers/generate-meta.d.ts +1 -1
- package/types/helpers/mocha.d.ts +19 -21
- package/types/helpers/module.d.ts +1 -1
- package/types/helpers/package-jsons/all-in-parent-dirs.d.ts +1 -1
- package/types/helpers/package-jsons/dependencies.d.ts +1 -1
- package/types/helpers/recognizers/CodeRecognizer.d.ts +1 -1
- package/types/helpers/recognizers/JavaScriptFootPrint.d.ts +2 -2
- package/types/helpers/recognizers/LanguageFootprint.d.ts +1 -1
- package/types/helpers/regex/alternation.d.ts +1 -1
- package/types/helpers/regex/ast.d.ts +1 -1
- package/types/helpers/regex/location.d.ts +2 -2
- package/types/helpers/regex/range.d.ts +2 -2
- package/types/helpers/regex/rule-template.d.ts +1 -1
- package/types/helpers/result.d.ts +1 -1
- package/types/helpers/sinon.d.ts +4 -6
- package/types/helpers/sonar-runtime.d.ts +1 -1
- package/types/helpers/supertest.d.ts +4 -6
- package/types/helpers/type.d.ts +1 -1
- package/types/helpers/vitest.d.ts +4 -6
- package/types/plugin-rules.d.ts +1 -0
- package/cjs/helpers/decorators/interceptor.js +0 -88
- package/cjs/helpers/index.js +0 -60
- package/cjs/helpers/recognizers/index.js +0 -37
- package/cjs/helpers/rule-detect-react.js +0 -29
- package/cjs/helpers/validate-version.js +0 -94
- package/types/helpers/aws/index.d.ts +0 -3
- package/types/helpers/decorators/index.d.ts +0 -2
- package/types/helpers/decorators/interceptor.d.ts +0 -16
- package/types/helpers/index.d.ts +0 -28
- package/types/helpers/recognizers/index.d.ts +0 -2
- package/types/helpers/rule-detect-react.d.ts +0 -2
- package/types/helpers/validate-version.d.ts +0 -13
package/cjs/S1854/rule.js
CHANGED
|
@@ -51,10 +51,14 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
51
51
|
})();
|
|
52
52
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
53
|
exports.rule = void 0;
|
|
54
|
-
const
|
|
54
|
+
const lva_js_1 = require("../helpers/lva.js");
|
|
55
|
+
const ancestor_js_1 = require("../helpers/ancestor.js");
|
|
56
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
57
|
+
const ast_js_1 = require("../helpers/ast.js");
|
|
58
|
+
const collection_js_1 = require("../helpers/collection.js");
|
|
55
59
|
const meta = __importStar(require("./generated-meta.js"));
|
|
56
60
|
exports.rule = {
|
|
57
|
-
meta: (0,
|
|
61
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, {
|
|
58
62
|
messages: {
|
|
59
63
|
removeAssignment: 'Remove this useless assignment to variable "{{variable}}".',
|
|
60
64
|
},
|
|
@@ -92,14 +96,14 @@ exports.rule = {
|
|
|
92
96
|
destructuringStack.push(new DestructuringContext());
|
|
93
97
|
},
|
|
94
98
|
'ObjectPattern > Property > Identifier': (node) => {
|
|
95
|
-
const destructuring = (0,
|
|
99
|
+
const destructuring = (0, collection_js_1.last)(destructuringStack);
|
|
96
100
|
const { ref } = resolveReference(node);
|
|
97
101
|
if (ref) {
|
|
98
102
|
destructuring.references.push(ref);
|
|
99
103
|
}
|
|
100
104
|
},
|
|
101
105
|
'ObjectPattern > :matches(RestElement, ExperimentalRestProperty)': () => {
|
|
102
|
-
(0,
|
|
106
|
+
(0, collection_js_1.last)(destructuringStack).hasRest = true;
|
|
103
107
|
},
|
|
104
108
|
'ObjectPattern:exit': () => {
|
|
105
109
|
const destructuring = destructuringStack.pop();
|
|
@@ -114,7 +118,7 @@ exports.rule = {
|
|
|
114
118
|
collectVariablesReadInCatchOrFinally(tryStmt, context);
|
|
115
119
|
},
|
|
116
120
|
'Program:exit': () => {
|
|
117
|
-
(0,
|
|
121
|
+
(0, lva_js_1.lva)(liveVariablesMap);
|
|
118
122
|
for (const lva of liveVariablesMap.values()) {
|
|
119
123
|
checkSegment(lva);
|
|
120
124
|
reportNeverReadVariables(lva);
|
|
@@ -122,7 +126,7 @@ exports.rule = {
|
|
|
122
126
|
},
|
|
123
127
|
// CodePath events
|
|
124
128
|
onCodePathSegmentStart: (segment) => {
|
|
125
|
-
liveVariablesMap.set(segment.id, new
|
|
129
|
+
liveVariablesMap.set(segment.id, new lva_js_1.LiveVariables(segment));
|
|
126
130
|
currentCodePathSegments.push(segment);
|
|
127
131
|
},
|
|
128
132
|
onCodePathStart: codePath => {
|
|
@@ -139,10 +143,10 @@ exports.rule = {
|
|
|
139
143
|
},
|
|
140
144
|
};
|
|
141
145
|
function pushAssignmentContext(node) {
|
|
142
|
-
(0,
|
|
146
|
+
(0, collection_js_1.last)(codePathStack).assignmentStack.push(new AssignmentContext(node));
|
|
143
147
|
}
|
|
144
148
|
function popAssignmentContext() {
|
|
145
|
-
const assignment = (0,
|
|
149
|
+
const assignment = (0, collection_js_1.last)(codePathStack).assignmentStack.pop();
|
|
146
150
|
for (const r of assignment.rhs) {
|
|
147
151
|
processReference(r);
|
|
148
152
|
}
|
|
@@ -201,7 +205,7 @@ exports.rule = {
|
|
|
201
205
|
}
|
|
202
206
|
function isNullAssignment(ref) {
|
|
203
207
|
const parent = ref.identifier.parent;
|
|
204
|
-
return parent?.type === 'AssignmentExpression' && (0,
|
|
208
|
+
return parent?.type === 'AssignmentExpression' && (0, ast_js_1.isNullLiteral)(parent.right);
|
|
205
209
|
}
|
|
206
210
|
function isEnumConstant(node) {
|
|
207
211
|
return context.sourceCode.getAncestors(node).some(n => n.type === 'TSEnumDeclaration');
|
|
@@ -254,9 +258,9 @@ exports.rule = {
|
|
|
254
258
|
return { ref: jsxReference, variable: jsxReference.resolved };
|
|
255
259
|
}
|
|
256
260
|
function processReference(ref) {
|
|
257
|
-
const assignmentStack = (0,
|
|
261
|
+
const assignmentStack = (0, collection_js_1.last)(codePathStack).assignmentStack;
|
|
258
262
|
if (assignmentStack.length > 0) {
|
|
259
|
-
const assignment = (0,
|
|
263
|
+
const assignment = (0, collection_js_1.last)(assignmentStack);
|
|
260
264
|
assignment.add(ref);
|
|
261
265
|
}
|
|
262
266
|
else {
|
|
@@ -271,7 +275,7 @@ exports.rule = {
|
|
|
271
275
|
lva = liveVariablesMap.get(segment.id);
|
|
272
276
|
}
|
|
273
277
|
else {
|
|
274
|
-
lva = new
|
|
278
|
+
lva = new lva_js_1.LiveVariables(segment);
|
|
275
279
|
liveVariablesMap.set(segment.id, lva);
|
|
276
280
|
}
|
|
277
281
|
return lva;
|
|
@@ -283,7 +287,7 @@ exports.rule = {
|
|
|
283
287
|
}
|
|
284
288
|
}
|
|
285
289
|
function updateVariableUsages(variable) {
|
|
286
|
-
const codePathId = (0,
|
|
290
|
+
const codePathId = (0, collection_js_1.last)(codePathStack).codePath.id;
|
|
287
291
|
if (variableUsages.has(variable)) {
|
|
288
292
|
variableUsages.get(variable).add(codePathId);
|
|
289
293
|
}
|
|
@@ -352,7 +356,7 @@ exports.rule = {
|
|
|
352
356
|
callback(node);
|
|
353
357
|
return;
|
|
354
358
|
}
|
|
355
|
-
for (const child of (0,
|
|
359
|
+
for (const child of (0, ancestor_js_1.childrenOf)(node, context.sourceCode.visitorKeys)) {
|
|
356
360
|
visitIdentifiers(child, callback, visited);
|
|
357
361
|
}
|
|
358
362
|
}
|
package/cjs/S1862/rule.js
CHANGED
|
@@ -51,12 +51,14 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
51
51
|
})();
|
|
52
52
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
53
|
exports.rule = void 0;
|
|
54
|
-
const
|
|
54
|
+
const equivalence_js_1 = require("../helpers/equivalence.js");
|
|
55
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
56
|
+
const location_js_1 = require("../helpers/location.js");
|
|
55
57
|
const meta = __importStar(require("./generated-meta.js"));
|
|
56
58
|
const duplicatedConditionMessage = 'This condition is covered by the one on line {{line}}';
|
|
57
59
|
const duplicatedCaseMessage = 'This case duplicates the one on line {{line}}';
|
|
58
60
|
exports.rule = {
|
|
59
|
-
meta: (0,
|
|
61
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, {
|
|
60
62
|
messages: {
|
|
61
63
|
duplicatedCondition: duplicatedConditionMessage,
|
|
62
64
|
duplicatedCase: duplicatedCaseMessage,
|
|
@@ -77,12 +79,12 @@ exports.rule = {
|
|
|
77
79
|
const currentOrOperands = splitByOr(current.test).map(splitByAnd);
|
|
78
80
|
operandsToCheck = operandsToCheck.map(orOperands => orOperands.filter(orOperand => !currentOrOperands.some(currentOrOperand => isSubset(currentOrOperand, orOperand, sourceCode))));
|
|
79
81
|
if (operandsToCheck.some(orOperands => orOperands.length === 0)) {
|
|
80
|
-
(0,
|
|
82
|
+
(0, location_js_1.report)(context, {
|
|
81
83
|
message: duplicatedConditionMessage,
|
|
82
84
|
messageId: 'duplicatedCondition',
|
|
83
85
|
data: { line: current.test.loc.start.line },
|
|
84
86
|
node: test,
|
|
85
|
-
}, [(0,
|
|
87
|
+
}, [(0, location_js_1.toSecondaryLocation)({ loc: current.test.loc }, 'Covering')]);
|
|
86
88
|
break;
|
|
87
89
|
}
|
|
88
90
|
}
|
|
@@ -92,16 +94,16 @@ exports.rule = {
|
|
|
92
94
|
for (const switchCase of switchStmt.cases) {
|
|
93
95
|
if (switchCase.test) {
|
|
94
96
|
const { test } = switchCase;
|
|
95
|
-
const duplicateTest = previousTests.find(previousTest => (0,
|
|
97
|
+
const duplicateTest = previousTests.find(previousTest => (0, equivalence_js_1.areEquivalent)(test, previousTest, sourceCode));
|
|
96
98
|
if (duplicateTest) {
|
|
97
|
-
(0,
|
|
99
|
+
(0, location_js_1.report)(context, {
|
|
98
100
|
messageId: 'duplicatedCase',
|
|
99
101
|
message: duplicatedCaseMessage,
|
|
100
102
|
data: {
|
|
101
103
|
line: duplicateTest.loc.start.line,
|
|
102
104
|
},
|
|
103
105
|
node: test,
|
|
104
|
-
}, [(0,
|
|
106
|
+
}, [(0, location_js_1.toSecondaryLocation)({ loc: duplicateTest.loc }, 'Original')]);
|
|
105
107
|
}
|
|
106
108
|
else {
|
|
107
109
|
previousTests.push(test);
|
|
@@ -139,6 +141,6 @@ function isSubset(first, second, sourceCode) {
|
|
|
139
141
|
isSubsetOf(first.right, second1.left, sourceCode)));
|
|
140
142
|
}
|
|
141
143
|
}
|
|
142
|
-
return (0,
|
|
144
|
+
return (0, equivalence_js_1.areEquivalent)(first, second, sourceCode);
|
|
143
145
|
}
|
|
144
146
|
}
|
package/cjs/S1871/rule.js
CHANGED
|
@@ -51,11 +51,16 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
51
51
|
})();
|
|
52
52
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
53
|
exports.rule = void 0;
|
|
54
|
-
const
|
|
54
|
+
const equivalence_js_1 = require("../helpers/equivalence.js");
|
|
55
|
+
const conditions_js_1 = require("../helpers/conditions.js");
|
|
56
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
57
|
+
const ast_js_1 = require("../helpers/ast.js");
|
|
58
|
+
const collection_js_1 = require("../helpers/collection.js");
|
|
59
|
+
const location_js_1 = require("../helpers/location.js");
|
|
55
60
|
const meta = __importStar(require("./generated-meta.js"));
|
|
56
61
|
const message = "This {{type}}'s code block is the same as the block for the {{type}} on line {{line}}.";
|
|
57
62
|
exports.rule = {
|
|
58
|
-
meta: (0,
|
|
63
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, {
|
|
59
64
|
messages: {
|
|
60
65
|
sameConditionalBlock: message,
|
|
61
66
|
},
|
|
@@ -70,10 +75,10 @@ exports.rule = {
|
|
|
70
75
|
},
|
|
71
76
|
};
|
|
72
77
|
function visitIfStatement(ifStmt) {
|
|
73
|
-
if ((0,
|
|
78
|
+
if ((0, ast_js_1.isIfStatement)(ifStmt.parent)) {
|
|
74
79
|
return;
|
|
75
80
|
}
|
|
76
|
-
const { branches, endsWithElse } = (0,
|
|
81
|
+
const { branches, endsWithElse } = (0, conditions_js_1.collectIfBranches)(ifStmt);
|
|
77
82
|
if (allEquivalentWithoutDefault(branches, endsWithElse)) {
|
|
78
83
|
for (const [i, branch] of branches.slice(1).entries()) {
|
|
79
84
|
reportIssue(branch, branches[i], 'branch');
|
|
@@ -92,9 +97,9 @@ exports.rule = {
|
|
|
92
97
|
}
|
|
93
98
|
function visitSwitchStatement(switchStmt) {
|
|
94
99
|
const { cases } = switchStmt;
|
|
95
|
-
const { endsWithDefault } = (0,
|
|
96
|
-
const nonEmptyCases = cases.filter(c => (0,
|
|
97
|
-
const casesWithoutBreak = nonEmptyCases.map(c => (0,
|
|
100
|
+
const { endsWithDefault } = (0, conditions_js_1.collectSwitchBranches)(switchStmt);
|
|
101
|
+
const nonEmptyCases = cases.filter(c => (0, conditions_js_1.takeWithoutBreak)(expandSingleBlockStatement(c.consequent)).length > 0);
|
|
102
|
+
const casesWithoutBreak = nonEmptyCases.map(c => (0, conditions_js_1.takeWithoutBreak)(expandSingleBlockStatement(c.consequent)));
|
|
98
103
|
if (allEquivalentWithoutDefault(casesWithoutBreak, endsWithDefault)) {
|
|
99
104
|
for (const [i, caseStmt] of nonEmptyCases.slice(1).entries()) {
|
|
100
105
|
reportIssue(caseStmt, nonEmptyCases[i], 'case');
|
|
@@ -102,11 +107,11 @@ exports.rule = {
|
|
|
102
107
|
return;
|
|
103
108
|
}
|
|
104
109
|
for (let i = 1; i < cases.length; i++) {
|
|
105
|
-
const firstClauseWithoutBreak = (0,
|
|
110
|
+
const firstClauseWithoutBreak = (0, conditions_js_1.takeWithoutBreak)(expandSingleBlockStatement(cases[i].consequent));
|
|
106
111
|
if (hasRequiredSize(firstClauseWithoutBreak)) {
|
|
107
112
|
for (let j = 0; j < i; j++) {
|
|
108
|
-
const secondClauseWithoutBreak = (0,
|
|
109
|
-
if ((0,
|
|
113
|
+
const secondClauseWithoutBreak = (0, conditions_js_1.takeWithoutBreak)(expandSingleBlockStatement(cases[j].consequent));
|
|
114
|
+
if ((0, equivalence_js_1.areEquivalent)(firstClauseWithoutBreak, secondClauseWithoutBreak, context.sourceCode)) {
|
|
110
115
|
reportIssue(cases[i], cases[j], 'case');
|
|
111
116
|
break;
|
|
112
117
|
}
|
|
@@ -118,14 +123,14 @@ exports.rule = {
|
|
|
118
123
|
if (nodes.length > 0) {
|
|
119
124
|
const tokens = [
|
|
120
125
|
...context.sourceCode.getTokens(nodes[0]),
|
|
121
|
-
...context.sourceCode.getTokens((0,
|
|
126
|
+
...context.sourceCode.getTokens((0, collection_js_1.last)(nodes)),
|
|
122
127
|
].filter(token => token.value !== '{' && token.value !== '}');
|
|
123
|
-
return tokens.length > 0 && (0,
|
|
128
|
+
return tokens.length > 0 && (0, collection_js_1.last)(tokens).loc.end.line > tokens[0].loc.start.line;
|
|
124
129
|
}
|
|
125
130
|
return false;
|
|
126
131
|
}
|
|
127
132
|
function compareIfBranches(a, b) {
|
|
128
|
-
const equivalent = (0,
|
|
133
|
+
const equivalent = (0, equivalence_js_1.areEquivalent)(a, b, context.sourceCode);
|
|
129
134
|
if (equivalent && b.loc) {
|
|
130
135
|
reportIssue(a, b, 'branch');
|
|
131
136
|
}
|
|
@@ -136,16 +141,16 @@ exports.rule = {
|
|
|
136
141
|
branches.length > 1 &&
|
|
137
142
|
branches
|
|
138
143
|
.slice(1)
|
|
139
|
-
.every((branch, index) => (0,
|
|
144
|
+
.every((branch, index) => (0, equivalence_js_1.areEquivalent)(branch, branches[index], context.sourceCode)));
|
|
140
145
|
}
|
|
141
146
|
function reportIssue(node, equivalentNode, type) {
|
|
142
147
|
const equivalentNodeLoc = equivalentNode.loc;
|
|
143
|
-
(0,
|
|
148
|
+
(0, location_js_1.report)(context, {
|
|
144
149
|
message,
|
|
145
150
|
messageId: 'sameConditionalBlock',
|
|
146
151
|
data: { type, line: String(equivalentNodeLoc.start.line) },
|
|
147
152
|
node,
|
|
148
|
-
}, [(0,
|
|
153
|
+
}, [(0, location_js_1.toSecondaryLocation)(equivalentNode, 'Original')]);
|
|
149
154
|
}
|
|
150
155
|
},
|
|
151
156
|
};
|
package/cjs/S1874/rule.js
CHANGED
|
@@ -51,17 +51,18 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
51
51
|
})();
|
|
52
52
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
53
|
exports.rule = void 0;
|
|
54
|
-
const
|
|
54
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
55
|
+
const parser_services_js_1 = require("../helpers/parser-services.js");
|
|
55
56
|
const meta = __importStar(require("./generated-meta.js"));
|
|
56
57
|
exports.rule = {
|
|
57
|
-
meta: (0,
|
|
58
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, {
|
|
58
59
|
messages: {
|
|
59
60
|
deprecation: '{{deprecation}}',
|
|
60
61
|
},
|
|
61
62
|
}),
|
|
62
63
|
create(context) {
|
|
63
64
|
const services = context.sourceCode.parserServices;
|
|
64
|
-
if (!(0,
|
|
65
|
+
if (!(0, parser_services_js_1.isRequiredParserServices)(services)) {
|
|
65
66
|
return {};
|
|
66
67
|
}
|
|
67
68
|
return {
|
package/cjs/S1940/rule.js
CHANGED
|
@@ -51,7 +51,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
51
51
|
})();
|
|
52
52
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
53
|
exports.rule = void 0;
|
|
54
|
-
const
|
|
54
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
55
55
|
const meta = __importStar(require("./generated-meta.js"));
|
|
56
56
|
const invertedOperators = {
|
|
57
57
|
'==': '!=',
|
|
@@ -64,7 +64,7 @@ const invertedOperators = {
|
|
|
64
64
|
'<=': '>',
|
|
65
65
|
};
|
|
66
66
|
exports.rule = {
|
|
67
|
-
meta: (0,
|
|
67
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, {
|
|
68
68
|
messages: {
|
|
69
69
|
useOppositeOperator: 'Use the opposite operator ({{invertedOperator}}) instead.',
|
|
70
70
|
suggestOperationInversion: 'Invert inner operation (apply if NaN is not expected)',
|
package/cjs/S1994/rule.js
CHANGED
|
@@ -51,7 +51,10 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
51
51
|
})();
|
|
52
52
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
53
|
exports.rule = void 0;
|
|
54
|
-
const
|
|
54
|
+
const equivalence_js_1 = require("../helpers/equivalence.js");
|
|
55
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
56
|
+
const ancestor_js_1 = require("../helpers/ancestor.js");
|
|
57
|
+
const collection_js_1 = require("../helpers/collection.js");
|
|
55
58
|
const meta = __importStar(require("./generated-meta.js"));
|
|
56
59
|
class ForInfo {
|
|
57
60
|
constructor(forLoop) {
|
|
@@ -61,7 +64,7 @@ class ForInfo {
|
|
|
61
64
|
}
|
|
62
65
|
}
|
|
63
66
|
exports.rule = {
|
|
64
|
-
meta: (0,
|
|
67
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, {
|
|
65
68
|
messages: {
|
|
66
69
|
misplacedCounter: `This loop's stop condition tests "{{test}}" but the incrementer updates "{{update}}".`,
|
|
67
70
|
},
|
|
@@ -90,7 +93,7 @@ exports.rule = {
|
|
|
90
93
|
return false;
|
|
91
94
|
}
|
|
92
95
|
function peekFor() {
|
|
93
|
-
return (0,
|
|
96
|
+
return (0, collection_js_1.last)(forLoopStack);
|
|
94
97
|
}
|
|
95
98
|
return {
|
|
96
99
|
ForStatement: (node) => {
|
|
@@ -101,7 +104,7 @@ exports.rule = {
|
|
|
101
104
|
if (forInfo.updatedExpressions.length === 0 || !forInfo.forLoop.test) {
|
|
102
105
|
return;
|
|
103
106
|
}
|
|
104
|
-
const hasIntersection = forInfo.testedExpressions.some(testedExpr => forInfo.updatedExpressions.some(updatedExpr => (0,
|
|
107
|
+
const hasIntersection = forInfo.testedExpressions.some(testedExpr => forInfo.updatedExpressions.some(updatedExpr => (0, equivalence_js_1.areEquivalent)(updatedExpr, testedExpr, context.sourceCode)));
|
|
105
108
|
if (!hasIntersection) {
|
|
106
109
|
context.report({
|
|
107
110
|
loc: context.sourceCode.getFirstToken(forInfo.forLoop).loc,
|
|
@@ -140,7 +143,7 @@ exports.rule = {
|
|
|
140
143
|
},
|
|
141
144
|
'ForStatement Identifier': (node) => {
|
|
142
145
|
if (isInsideTest(node)) {
|
|
143
|
-
const parent = (0,
|
|
146
|
+
const parent = (0, ancestor_js_1.getParent)(context, node);
|
|
144
147
|
if (parent.type !== 'MemberExpression' || parent.computed || parent.object === node) {
|
|
145
148
|
peekFor().testedExpressions.push(node);
|
|
146
149
|
}
|
|
@@ -148,8 +151,8 @@ exports.rule = {
|
|
|
148
151
|
},
|
|
149
152
|
'ForStatement MemberExpression': (node) => {
|
|
150
153
|
if (isInsideTest(node) &&
|
|
151
|
-
(0,
|
|
152
|
-
(0,
|
|
154
|
+
(0, ancestor_js_1.getParent)(context, node).type !== 'MemberExpression' &&
|
|
155
|
+
(0, ancestor_js_1.getParent)(context, node).type !== 'CallExpression') {
|
|
153
156
|
peekFor().testedExpressions.push(node);
|
|
154
157
|
}
|
|
155
158
|
},
|
package/cjs/S2004/rule.js
CHANGED
|
@@ -51,7 +51,9 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
51
51
|
})();
|
|
52
52
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
53
|
exports.rule = void 0;
|
|
54
|
-
const
|
|
54
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
55
|
+
const location_js_1 = require("../helpers/location.js");
|
|
56
|
+
const test_frameworks_js_1 = require("../helpers/test-frameworks.js");
|
|
55
57
|
const meta = __importStar(require("./generated-meta.js"));
|
|
56
58
|
const DEFAULT_THRESHOLD = 4;
|
|
57
59
|
/**
|
|
@@ -63,10 +65,10 @@ function isTestFrameworkCallback(node) {
|
|
|
63
65
|
if (parent?.type !== 'CallExpression') {
|
|
64
66
|
return false;
|
|
65
67
|
}
|
|
66
|
-
return (0,
|
|
68
|
+
return (0, test_frameworks_js_1.isTestFrameworkCall)(parent);
|
|
67
69
|
}
|
|
68
70
|
exports.rule = {
|
|
69
|
-
meta: (0,
|
|
71
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta),
|
|
70
72
|
create(context) {
|
|
71
73
|
const max = context.options[0]?.threshold ?? DEFAULT_THRESHOLD;
|
|
72
74
|
const nestedStack = [];
|
|
@@ -80,11 +82,11 @@ exports.rule = {
|
|
|
80
82
|
nestedStack.push(fn);
|
|
81
83
|
if (nestedStack.length === max + 1) {
|
|
82
84
|
const secondaries = nestedStack.slice(0, -1);
|
|
83
|
-
(0,
|
|
84
|
-
loc: (0,
|
|
85
|
+
(0, location_js_1.report)(context, {
|
|
86
|
+
loc: (0, location_js_1.getMainFunctionTokenLocation)(fn, fn.parent, context),
|
|
85
87
|
message: `Refactor this code to not nest functions more than ${max} levels deep.`,
|
|
86
|
-
}, secondaries.map(n => (0,
|
|
87
|
-
loc: (0,
|
|
88
|
+
}, secondaries.map(n => (0, location_js_1.toSecondaryLocation)({
|
|
89
|
+
loc: (0, location_js_1.getMainFunctionTokenLocation)(n, n.parent, context),
|
|
88
90
|
}, 'Nesting +1')));
|
|
89
91
|
}
|
|
90
92
|
},
|
package/cjs/S2068/rule.js
CHANGED
|
@@ -54,17 +54,27 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
54
54
|
};
|
|
55
55
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
56
56
|
exports.rule = void 0;
|
|
57
|
-
const
|
|
57
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
58
|
+
const ast_js_1 = require("../helpers/ast.js");
|
|
59
|
+
const entropy_js_1 = require("../helpers/entropy.js");
|
|
58
60
|
const node_path_1 = __importDefault(require("node:path"));
|
|
59
61
|
const meta = __importStar(require("./generated-meta.js"));
|
|
60
62
|
const DEFAULT_NAMES = ['password', 'pwd', 'passwd', 'passphrase'];
|
|
63
|
+
const ENTROPY_THRESHOLD = 3;
|
|
64
|
+
const MIN_PASSWORD_LENGTH = 5;
|
|
65
|
+
const NON_CREDENTIAL_CHARS = /[\s/["'\]<>]/;
|
|
66
|
+
const TEST_FILE_PATTERN = /\.(spec|test|mock)\.[jt]sx?$/;
|
|
61
67
|
const messages = {
|
|
62
68
|
reviewPassword: 'Review this potentially hard-coded password.',
|
|
63
69
|
};
|
|
64
70
|
exports.rule = {
|
|
65
|
-
meta: (0,
|
|
71
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, { messages }),
|
|
66
72
|
create(context) {
|
|
67
|
-
const
|
|
73
|
+
const filename = context.physicalFilename;
|
|
74
|
+
if (TEST_FILE_PATTERN.test(filename)) {
|
|
75
|
+
return {};
|
|
76
|
+
}
|
|
77
|
+
const dir = node_path_1.default.dirname(filename);
|
|
68
78
|
const parts = dir.split(node_path_1.default.sep).map(part => part.toLowerCase());
|
|
69
79
|
if (parts.includes('l10n')) {
|
|
70
80
|
return {};
|
|
@@ -98,21 +108,74 @@ exports.rule = {
|
|
|
98
108
|
};
|
|
99
109
|
function checkAssignment(context, patterns, variable, initializer) {
|
|
100
110
|
if (initializer &&
|
|
101
|
-
(
|
|
102
|
-
initializer
|
|
103
|
-
patterns.some(pattern => context.sourceCode.getText(variable).toLowerCase().includes(pattern))) {
|
|
111
|
+
patterns.some(pattern => context.sourceCode.getText(variable).toLowerCase().includes(pattern)) &&
|
|
112
|
+
findValueSuspect(initializer)) {
|
|
104
113
|
context.report({
|
|
105
114
|
messageId: 'reviewPassword',
|
|
106
115
|
node: initializer,
|
|
107
116
|
});
|
|
108
117
|
}
|
|
109
118
|
}
|
|
119
|
+
function findValueSuspect(node) {
|
|
120
|
+
if (!node) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
if ((0, ast_js_1.isStringLiteral)(node)) {
|
|
124
|
+
const value = node.value;
|
|
125
|
+
return (value.length >= MIN_PASSWORD_LENGTH &&
|
|
126
|
+
!NON_CREDENTIAL_CHARS.test(value) &&
|
|
127
|
+
hasHighEntropy(value));
|
|
128
|
+
}
|
|
129
|
+
if (node.type === 'ConditionalExpression') {
|
|
130
|
+
return findValueSuspect(node.consequent) || findValueSuspect(node.alternate);
|
|
131
|
+
}
|
|
132
|
+
if ((0, ast_js_1.isLogicalExpression)(node) &&
|
|
133
|
+
['??', '||'].includes(node.operator)) {
|
|
134
|
+
return findValueSuspect(node.right);
|
|
135
|
+
}
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
110
138
|
function checkLiteral(context, patterns, literal) {
|
|
111
|
-
if ((0,
|
|
112
|
-
|
|
113
|
-
context.report({
|
|
114
|
-
messageId: 'reviewPassword',
|
|
115
|
-
node: literal,
|
|
116
|
-
});
|
|
139
|
+
if (!(0, ast_js_1.isStringLiteral)(literal)) {
|
|
140
|
+
return;
|
|
117
141
|
}
|
|
142
|
+
const value = literal.value;
|
|
143
|
+
const lowerValue = value.toLowerCase();
|
|
144
|
+
for (const pattern of patterns) {
|
|
145
|
+
const match = pattern.exec(lowerValue);
|
|
146
|
+
if (!match) {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const eqIndex = value.indexOf('=', match.index);
|
|
150
|
+
if (eqIndex === -1) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
const passwordValue = extractPasswordValue(value, eqIndex);
|
|
154
|
+
if (passwordValue.length >= MIN_PASSWORD_LENGTH && hasHighEntropy(passwordValue)) {
|
|
155
|
+
context.report({
|
|
156
|
+
messageId: 'reviewPassword',
|
|
157
|
+
node: literal,
|
|
158
|
+
});
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function extractPasswordValue(value, eqIndex) {
|
|
164
|
+
const passwordPart = value.substring(eqIndex + 1);
|
|
165
|
+
const nextSep = findNextSeparator(passwordPart);
|
|
166
|
+
return nextSep === -1 ? passwordPart : passwordPart.substring(0, nextSep);
|
|
167
|
+
}
|
|
168
|
+
function findNextSeparator(str) {
|
|
169
|
+
const separators = ['&', ' ', ';'];
|
|
170
|
+
let minIndex = -1;
|
|
171
|
+
for (const sep of separators) {
|
|
172
|
+
const idx = str.indexOf(sep);
|
|
173
|
+
if (idx !== -1 && (minIndex === -1 || idx < minIndex)) {
|
|
174
|
+
minIndex = idx;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return minIndex;
|
|
178
|
+
}
|
|
179
|
+
function hasHighEntropy(value) {
|
|
180
|
+
return (0, entropy_js_1.shannonEntropy)(value) > ENTROPY_THRESHOLD;
|
|
118
181
|
}
|
|
@@ -39,7 +39,7 @@ exports.meta = {
|
|
|
39
39
|
description: 'Formatting SQL queries is security-sensitive',
|
|
40
40
|
recommended: true,
|
|
41
41
|
url: 'https://sonarsource.github.io/rspec/#/rspec/S2077/javascript',
|
|
42
|
-
requiresTypeChecking:
|
|
42
|
+
requiresTypeChecking: true,
|
|
43
43
|
},
|
|
44
44
|
fixable: undefined,
|
|
45
45
|
deprecated: false,
|
package/cjs/S2077/rule.js
CHANGED
|
@@ -51,7 +51,11 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
51
51
|
})();
|
|
52
52
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
53
|
exports.rule = void 0;
|
|
54
|
-
const
|
|
54
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
55
|
+
const module_js_1 = require("../helpers/module.js");
|
|
56
|
+
const module_ts_js_1 = require("../helpers/module-ts.js");
|
|
57
|
+
const ast_js_1 = require("../helpers/ast.js");
|
|
58
|
+
const parser_services_js_1 = require("../helpers/parser-services.js");
|
|
55
59
|
const meta = __importStar(require("./generated-meta.js"));
|
|
56
60
|
const sqlQuerySignatures = new Set([
|
|
57
61
|
'pg.Client.query',
|
|
@@ -72,23 +76,23 @@ const sqlQuerySignatures = new Set([
|
|
|
72
76
|
'better-sqlite3.prepare',
|
|
73
77
|
]);
|
|
74
78
|
exports.rule = {
|
|
75
|
-
meta: (0,
|
|
79
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, {
|
|
76
80
|
messages: {
|
|
77
81
|
safeQuery: `Make sure that executing SQL queries is safe here.`,
|
|
78
82
|
},
|
|
79
83
|
}),
|
|
80
84
|
create(context) {
|
|
81
85
|
const services = context.sourceCode.parserServices;
|
|
82
|
-
const hasTypeInformation = (0,
|
|
86
|
+
const hasTypeInformation = (0, parser_services_js_1.isRequiredParserServices)(services);
|
|
83
87
|
return {
|
|
84
88
|
CallExpression(node) {
|
|
85
89
|
let fqn = null;
|
|
86
90
|
if (hasTypeInformation) {
|
|
87
91
|
const tsNode = services.esTreeNodeToTSNodeMap.get(node);
|
|
88
|
-
fqn = (0,
|
|
92
|
+
fqn = (0, module_ts_js_1.getFullyQualifiedNameTS)(services, tsNode);
|
|
89
93
|
}
|
|
90
94
|
else {
|
|
91
|
-
fqn = (0,
|
|
95
|
+
fqn = (0, module_js_1.getFullyQualifiedName)(context, node.callee);
|
|
92
96
|
}
|
|
93
97
|
if (fqn && sqlQuerySignatures.has(fqn) && isQuestionable(node.arguments[0])) {
|
|
94
98
|
context.report({
|
|
@@ -110,7 +114,7 @@ function isQuestionable(sqlQuery) {
|
|
|
110
114
|
if (isConcatenation(sqlQuery)) {
|
|
111
115
|
return isVariableConcat(sqlQuery);
|
|
112
116
|
}
|
|
113
|
-
return (sqlQuery.type === 'CallExpression' && (0,
|
|
117
|
+
return (sqlQuery.type === 'CallExpression' && (0, ast_js_1.isMemberWithProperty)(sqlQuery.callee, 'concat', 'replace'));
|
|
114
118
|
}
|
|
115
119
|
function isVariableConcat(node) {
|
|
116
120
|
const { left, right } = node;
|
package/cjs/S2092/rule.js
CHANGED
|
@@ -52,10 +52,10 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
52
52
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
53
|
exports.rule = void 0;
|
|
54
54
|
const cookie_flag_check_js_1 = require("../helpers/cookie-flag-check.js");
|
|
55
|
-
const
|
|
55
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
56
56
|
const meta = __importStar(require("./generated-meta.js"));
|
|
57
57
|
exports.rule = {
|
|
58
|
-
meta: (0,
|
|
58
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta),
|
|
59
59
|
create(context) {
|
|
60
60
|
return {
|
|
61
61
|
CallExpression: (node) => new cookie_flag_check_js_1.CookieFlagCheck(context, 'secure').checkCookiesFromCallExpression(node),
|
package/cjs/S2123/rule.js
CHANGED
|
@@ -51,10 +51,10 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
51
51
|
})();
|
|
52
52
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
53
|
exports.rule = void 0;
|
|
54
|
-
const
|
|
54
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
55
55
|
const meta = __importStar(require("./generated-meta.js"));
|
|
56
56
|
exports.rule = {
|
|
57
|
-
meta: (0,
|
|
57
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, {
|
|
58
58
|
messages: {
|
|
59
59
|
removeIncrement: 'Remove this {{updateOperator}}rement or correct the code not to waste it.',
|
|
60
60
|
},
|
package/cjs/S2137/rule.js
CHANGED
|
@@ -55,7 +55,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
55
55
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
56
56
|
exports.rule = void 0;
|
|
57
57
|
const globals_1 = __importDefault(require("globals"));
|
|
58
|
-
const
|
|
58
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
59
59
|
const meta = __importStar(require("./generated-meta.js"));
|
|
60
60
|
const illegalNames = new Set(['arguments']);
|
|
61
61
|
const objectPrototypeProperties = new Set([
|
|
@@ -77,7 +77,7 @@ const getModificationIssue = (functionName) => ({
|
|
|
77
77
|
data: { symbol: functionName },
|
|
78
78
|
});
|
|
79
79
|
exports.rule = {
|
|
80
|
-
meta: (0,
|
|
80
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, {
|
|
81
81
|
messages: {
|
|
82
82
|
removeModification: 'Remove the modification of "{{symbol}}".',
|
|
83
83
|
forbidDeclaration: 'Do not use "{{symbol}}" to declare a {{type}} - use another name.',
|
package/cjs/S2138/rule.js
CHANGED
|
@@ -51,17 +51,18 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
51
51
|
})();
|
|
52
52
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
53
|
exports.rule = void 0;
|
|
54
|
-
const
|
|
54
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
55
|
+
const ast_js_1 = require("../helpers/ast.js");
|
|
55
56
|
const meta = __importStar(require("./generated-meta.js"));
|
|
56
57
|
exports.rule = {
|
|
57
|
-
meta: (0,
|
|
58
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, {
|
|
58
59
|
messages: {
|
|
59
60
|
useNull: 'Use null instead.',
|
|
60
61
|
},
|
|
61
62
|
}),
|
|
62
63
|
create(context) {
|
|
63
64
|
function raiseOnUndefined(node) {
|
|
64
|
-
if ((0,
|
|
65
|
+
if ((0, ast_js_1.isUndefined)(node)) {
|
|
65
66
|
context.report({
|
|
66
67
|
messageId: 'useNull',
|
|
67
68
|
node,
|