eslint-plugin-sonarjs 4.0.1 → 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 +1 -1
- 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 +2 -2
- 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/rule.js +11 -7
- package/cjs/S1515/rule.js +10 -8
- package/cjs/S1523/rule.js +5 -5
- package/cjs/S1526/rule.js +5 -4
- package/cjs/S1527/rule.js +2 -2
- package/cjs/S1528/rule.js +2 -2
- 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/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 +8 -5
- package/cjs/S2208/rule.js +2 -2
- package/cjs/S2234/rule.js +15 -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 +14 -11
- 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/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 +16 -11
- 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/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/rule.js +8 -5
- package/cjs/S7639/rule.js +5 -4
- package/cjs/S7790/rule.js +7 -5
- 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/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/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/docs/file-permissions.md +1 -1
- package/package.json +39 -1
- package/types/helpers/ancestor.d.ts +1 -1
- package/types/helpers/aws/s3.d.ts +1 -1
- package/types/helpers/chai.d.ts +3 -5
- package/types/helpers/entropy.d.ts +1 -0
- package/types/helpers/express.d.ts +38 -43
- package/types/helpers/mocha.d.ts +19 -21
- package/types/helpers/regex/ast.d.ts +1 -1
- package/types/helpers/regex/rule-template.d.ts +1 -1
- package/types/helpers/sinon.d.ts +3 -5
- package/types/helpers/supertest.d.ts +3 -5
- package/types/helpers/type.d.ts +1 -1
- package/types/helpers/vitest.d.ts +3 -5
- package/cjs/helpers/aws/index.js +0 -35
- 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/S2699/rule.js
CHANGED
|
@@ -37,8 +37,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.rule = void 0;
|
|
40
|
-
const
|
|
41
|
-
const
|
|
40
|
+
const Chai = __importStar(require("../helpers/chai.js"));
|
|
41
|
+
const ancestor_js_1 = require("../helpers/ancestor.js");
|
|
42
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
43
|
+
const module_js_1 = require("../helpers/module.js");
|
|
44
|
+
const module_ts_js_1 = require("../helpers/module-ts.js");
|
|
45
|
+
const ast_js_1 = require("../helpers/ast.js");
|
|
46
|
+
const parser_services_js_1 = require("../helpers/parser-services.js");
|
|
47
|
+
const Mocha = __importStar(require("../helpers/mocha.js"));
|
|
48
|
+
const Sinon = __importStar(require("../helpers/sinon.js"));
|
|
49
|
+
const Vitest = __importStar(require("../helpers/vitest.js"));
|
|
50
|
+
const Supertest = __importStar(require("../helpers/supertest.js"));
|
|
42
51
|
const meta = __importStar(require("./generated-meta.js"));
|
|
43
52
|
const typescript_1 = __importDefault(require("typescript"));
|
|
44
53
|
/**
|
|
@@ -47,19 +56,19 @@ const typescript_1 = __importDefault(require("typescript"));
|
|
|
47
56
|
* libX and the imported library was libY.
|
|
48
57
|
*/
|
|
49
58
|
exports.rule = {
|
|
50
|
-
meta: (0,
|
|
59
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta),
|
|
51
60
|
create(context) {
|
|
52
|
-
if (!(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
61
|
+
if (!(Chai.isImported(context) ||
|
|
62
|
+
Sinon.isImported(context) ||
|
|
63
|
+
Vitest.isImported(context) ||
|
|
64
|
+
Supertest.isImported(context))) {
|
|
56
65
|
return {};
|
|
57
66
|
}
|
|
58
67
|
const visitedNodes = new Map();
|
|
59
68
|
const visitedTSNodes = new Map();
|
|
60
69
|
return {
|
|
61
70
|
'CallExpression:exit': (node) => {
|
|
62
|
-
const testCase =
|
|
71
|
+
const testCase = Mocha.extractTestCase(node);
|
|
63
72
|
if (testCase !== null) {
|
|
64
73
|
checkAssertions(testCase, context, visitedNodes, visitedTSNodes);
|
|
65
74
|
}
|
|
@@ -90,7 +99,7 @@ function hasDoneCallbackAssertion(callback, context) {
|
|
|
90
99
|
return false;
|
|
91
100
|
}
|
|
92
101
|
const firstParam = callback.params[0];
|
|
93
|
-
if (!(0,
|
|
102
|
+
if (!(0, ast_js_1.isIdentifier)(firstParam)) {
|
|
94
103
|
return false;
|
|
95
104
|
}
|
|
96
105
|
const doneParamName = firstParam.name;
|
|
@@ -106,27 +115,27 @@ function isValidDoneMethodCallPattern(node, doneParamName, context) {
|
|
|
106
115
|
// Pattern 2: .catch(done) - done receives rejection error
|
|
107
116
|
if (methodName === 'catch' &&
|
|
108
117
|
node.arguments.length === 1 &&
|
|
109
|
-
(0,
|
|
118
|
+
(0, ast_js_1.isIdentifier)(node.arguments[0], doneParamName)) {
|
|
110
119
|
return true;
|
|
111
120
|
}
|
|
112
121
|
// Pattern 3: .then(_, done) - done as second argument
|
|
113
122
|
if (methodName === 'then' &&
|
|
114
123
|
node.arguments.length >= 2 &&
|
|
115
|
-
(0,
|
|
124
|
+
(0, ast_js_1.isIdentifier)(node.arguments[1], doneParamName)) {
|
|
116
125
|
return true;
|
|
117
126
|
}
|
|
118
127
|
// Pattern 4: .subscribe(_, done) - done as second argument (error position)
|
|
119
128
|
if (methodName === 'subscribe' &&
|
|
120
129
|
node.arguments.length >= 2 &&
|
|
121
|
-
(0,
|
|
130
|
+
(0, ast_js_1.isIdentifier)(node.arguments[1], doneParamName)) {
|
|
122
131
|
return true;
|
|
123
132
|
}
|
|
124
133
|
// Pattern 5: .subscribe({ error: done }) - done in error property
|
|
125
134
|
if (methodName === 'subscribe' &&
|
|
126
135
|
node.arguments.length === 1 &&
|
|
127
136
|
node.arguments[0].type === 'ObjectExpression') {
|
|
128
|
-
const errorProp = (0,
|
|
129
|
-
return errorProp != null && (0,
|
|
137
|
+
const errorProp = (0, ast_js_1.getProperty)(node.arguments[0], 'error', context);
|
|
138
|
+
return errorProp != null && (0, ast_js_1.isIdentifier)(errorProp.value, doneParamName);
|
|
130
139
|
}
|
|
131
140
|
return false;
|
|
132
141
|
}
|
|
@@ -136,16 +145,16 @@ function isValidDoneMethodCallPattern(node, doneParamName, context) {
|
|
|
136
145
|
function containsValidDoneAssertion(node, doneParamName, visitorKeys, context) {
|
|
137
146
|
if (node.type === 'CallExpression') {
|
|
138
147
|
// Pattern 1: done(arg) - direct call with at least one argument
|
|
139
|
-
if ((0,
|
|
148
|
+
if ((0, ast_js_1.isIdentifier)(node.callee, doneParamName) && node.arguments.length > 0) {
|
|
140
149
|
return true;
|
|
141
150
|
}
|
|
142
151
|
// Check method call patterns
|
|
143
|
-
if ((0,
|
|
152
|
+
if ((0, ast_js_1.isMethodCall)(node) && isValidDoneMethodCallPattern(node, doneParamName, context)) {
|
|
144
153
|
return true;
|
|
145
154
|
}
|
|
146
155
|
}
|
|
147
156
|
// Recurse through children
|
|
148
|
-
for (const child of (0,
|
|
157
|
+
for (const child of (0, ancestor_js_1.childrenOf)(node, visitorKeys)) {
|
|
149
158
|
if (containsValidDoneAssertion(child, doneParamName, visitorKeys, context)) {
|
|
150
159
|
return true;
|
|
151
160
|
}
|
|
@@ -161,7 +170,7 @@ function checkAssertions(testCase, context, visitedNodes, visitedTSNodes) {
|
|
|
161
170
|
const visitor = new TestCaseAssertionVisitor(context);
|
|
162
171
|
const parserServices = context.sourceCode.parserServices;
|
|
163
172
|
let hasAssertions = false;
|
|
164
|
-
if ((0,
|
|
173
|
+
if ((0, parser_services_js_1.isRequiredParserServices)(parserServices)) {
|
|
165
174
|
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(callback);
|
|
166
175
|
hasAssertions = visitor.visitTSNode(parserServices, tsNode, visitedTSNodes);
|
|
167
176
|
}
|
|
@@ -183,10 +192,10 @@ class TestCaseAssertionVisitor {
|
|
|
183
192
|
}
|
|
184
193
|
visitedTSNodes.set(node, false);
|
|
185
194
|
if (isGlobalTSAssertion(services, node) ||
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
195
|
+
Chai.isTSAssertion(services, node) ||
|
|
196
|
+
Sinon.isTSAssertion(services, node) ||
|
|
197
|
+
Supertest.isTSAssertion(services, node) ||
|
|
198
|
+
Vitest.isTSAssertion(services, node)) {
|
|
190
199
|
visitedTSNodes.set(node, true);
|
|
191
200
|
return true;
|
|
192
201
|
}
|
|
@@ -210,23 +219,23 @@ class TestCaseAssertionVisitor {
|
|
|
210
219
|
return visitedNodes.get(node);
|
|
211
220
|
}
|
|
212
221
|
visitedNodes.set(node, false);
|
|
213
|
-
if (
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
222
|
+
if (Chai.isAssertion(context, node) ||
|
|
223
|
+
Sinon.isAssertion(context, node) ||
|
|
224
|
+
Vitest.isAssertion(context, node) ||
|
|
225
|
+
Supertest.isAssertion(context, node) ||
|
|
217
226
|
isGlobalAssertion(context, node)) {
|
|
218
227
|
visitedNodes.set(node, true);
|
|
219
228
|
return true;
|
|
220
229
|
}
|
|
221
230
|
let nodeHasAssertions = false;
|
|
222
|
-
if ((0,
|
|
231
|
+
if ((0, ast_js_1.isFunctionCall)(node)) {
|
|
223
232
|
const { callee } = node;
|
|
224
|
-
const functionDef = (0,
|
|
233
|
+
const functionDef = (0, ast_js_1.resolveFunction)(this.context, callee);
|
|
225
234
|
if (functionDef) {
|
|
226
235
|
nodeHasAssertions ||= this.visit(context, functionDef.body, visitedNodes);
|
|
227
236
|
}
|
|
228
237
|
}
|
|
229
|
-
for (const child of (0,
|
|
238
|
+
for (const child of (0, ancestor_js_1.childrenOf)(node, this.visitorKeys)) {
|
|
230
239
|
nodeHasAssertions ||= this.visit(context, child, visitedNodes);
|
|
231
240
|
}
|
|
232
241
|
visitedNodes.set(node, nodeHasAssertions);
|
|
@@ -263,7 +272,7 @@ function isGlobalExpectExpression(node) {
|
|
|
263
272
|
innerCallExpression.expression.text.startsWith('expect'));
|
|
264
273
|
}
|
|
265
274
|
function isFunctionCallFromNodeAssertTS(services, node) {
|
|
266
|
-
const fqn = (0,
|
|
275
|
+
const fqn = (0, module_ts_js_1.getFullyQualifiedNameTS)(services, node);
|
|
267
276
|
return fqn ? fqn?.startsWith('assert') : false;
|
|
268
277
|
}
|
|
269
278
|
function isGlobalAssertion(context, node) {
|
|
@@ -301,6 +310,6 @@ function isGlobalExpectExpressionJS(node) {
|
|
|
301
310
|
return innerCall.callee.type === 'Identifier' && innerCall.callee.name.startsWith('expect');
|
|
302
311
|
}
|
|
303
312
|
function isFunctionCallFromNodeAssert(context, node) {
|
|
304
|
-
const fullyQualifiedName = (0,
|
|
313
|
+
const fullyQualifiedName = (0, module_js_1.getFullyQualifiedName)(context, node);
|
|
305
314
|
return fullyQualifiedName?.split('.')[0] === 'assert';
|
|
306
315
|
}
|
package/cjs/S2703/rule.js
CHANGED
|
@@ -55,11 +55,11 @@ 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 excludedNames = new Set(Object.values(globals_1.default).flatMap(env => Object.keys(env)));
|
|
61
61
|
exports.rule = {
|
|
62
|
-
meta: (0,
|
|
62
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, {
|
|
63
63
|
messages: {
|
|
64
64
|
explicitModifier: 'Add the "let", "const" or "var" keyword to this declaration of "{{variable}}" to make it explicit.',
|
|
65
65
|
},
|
package/cjs/S2737/rule.js
CHANGED
|
@@ -51,10 +51,12 @@ 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 ast_js_1 = require("../helpers/ast.js");
|
|
55
57
|
const meta = __importStar(require("./generated-meta.js"));
|
|
56
58
|
exports.rule = {
|
|
57
|
-
meta: (0,
|
|
59
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, {
|
|
58
60
|
messages: {
|
|
59
61
|
uselessCatch: 'Add logic to this catch clause or eliminate it and rethrow the exception automatically.',
|
|
60
62
|
},
|
|
@@ -78,8 +80,8 @@ function visitCatchClause(catchClause, context) {
|
|
|
78
80
|
}
|
|
79
81
|
}
|
|
80
82
|
function onlyRethrows(statement, catchParam, sourceCode) {
|
|
81
|
-
return ((0,
|
|
83
|
+
return ((0, ast_js_1.isThrowStatement)(statement) &&
|
|
82
84
|
catchParam !== null &&
|
|
83
85
|
statement.argument !== null &&
|
|
84
|
-
(0,
|
|
86
|
+
(0, equivalence_js_1.areEquivalent)(catchParam, statement.argument, sourceCode));
|
|
85
87
|
}
|
package/cjs/S2755/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 generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
55
|
+
const module_js_1 = require("../helpers/module.js");
|
|
56
|
+
const ast_js_1 = require("../helpers/ast.js");
|
|
57
|
+
const location_js_1 = require("../helpers/location.js");
|
|
55
58
|
const meta = __importStar(require("./generated-meta.js"));
|
|
56
59
|
const TARGET_XML_FQNS = new Set([
|
|
57
60
|
'libxmljs.parseXml',
|
|
@@ -60,22 +63,22 @@ const TARGET_XML_FQNS = new Set([
|
|
|
60
63
|
'libxmljs2.parseXmlString',
|
|
61
64
|
]);
|
|
62
65
|
exports.rule = {
|
|
63
|
-
meta: (0,
|
|
66
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta),
|
|
64
67
|
create(context) {
|
|
65
68
|
function isXmlParserCall(call) {
|
|
66
|
-
const fqn = (0,
|
|
69
|
+
const fqn = (0, module_js_1.getFullyQualifiedName)(context, call) || '';
|
|
67
70
|
return TARGET_XML_FQNS.has(fqn);
|
|
68
71
|
}
|
|
69
72
|
return {
|
|
70
73
|
CallExpression: (node) => {
|
|
71
74
|
const call = node;
|
|
72
75
|
if (isXmlParserCall(call)) {
|
|
73
|
-
const noent = (0,
|
|
76
|
+
const noent = (0, ast_js_1.getProperty)(call.arguments[1], 'noent', context);
|
|
74
77
|
if (noent && isNoEntSet(noent)) {
|
|
75
|
-
(0,
|
|
78
|
+
(0, location_js_1.report)(context, {
|
|
76
79
|
message: 'Disable access to external entities in XML parsing.',
|
|
77
80
|
node: noent,
|
|
78
|
-
}, [(0,
|
|
81
|
+
}, [(0, location_js_1.toSecondaryLocation)(call.callee)]);
|
|
79
82
|
}
|
|
80
83
|
}
|
|
81
84
|
},
|
package/cjs/S2757/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
|
useExistingOperator: 'Was "{{operator}}=" meant instead?',
|
|
60
60
|
suggestExistingOperator: 'Replace with "{{operator}}" operator',
|
package/cjs/S2817/rule.js
CHANGED
|
@@ -51,35 +51,38 @@ 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 type_js_1 = require("../helpers/type.js");
|
|
56
|
+
const ast_js_1 = require("../helpers/ast.js");
|
|
57
|
+
const parser_services_js_1 = require("../helpers/parser-services.js");
|
|
55
58
|
const meta = __importStar(require("./generated-meta.js"));
|
|
56
59
|
const OPEN_DATABASE = 'openDatabase';
|
|
57
60
|
exports.rule = {
|
|
58
|
-
meta: (0,
|
|
61
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, {
|
|
59
62
|
messages: {
|
|
60
63
|
convertWebSQLUse: 'Convert this use of a Web SQL database to another technology.',
|
|
61
64
|
},
|
|
62
65
|
}),
|
|
63
66
|
create(context) {
|
|
64
67
|
const services = context.sourceCode.parserServices;
|
|
65
|
-
if (!(0,
|
|
68
|
+
if (!(0, parser_services_js_1.isRequiredParserServices)(services)) {
|
|
66
69
|
return {};
|
|
67
70
|
}
|
|
68
71
|
return {
|
|
69
72
|
CallExpression: (node) => {
|
|
70
73
|
const callExpression = node;
|
|
71
74
|
const { callee } = callExpression;
|
|
72
|
-
const symbol = (0,
|
|
75
|
+
const symbol = (0, type_js_1.getSymbolAtLocation)(callee, services);
|
|
73
76
|
if (!!symbol) {
|
|
74
77
|
return;
|
|
75
78
|
}
|
|
76
|
-
if ((0,
|
|
79
|
+
if ((0, ast_js_1.isIdentifier)(callee, OPEN_DATABASE)) {
|
|
77
80
|
context.report({ node: callee, messageId: 'convertWebSQLUse' });
|
|
78
81
|
}
|
|
79
|
-
if (callee.type !== 'MemberExpression' || !(0,
|
|
82
|
+
if (callee.type !== 'MemberExpression' || !(0, ast_js_1.isIdentifier)(callee.property, OPEN_DATABASE)) {
|
|
80
83
|
return;
|
|
81
84
|
}
|
|
82
|
-
const typeName = (0,
|
|
85
|
+
const typeName = (0, type_js_1.getTypeAsString)(callee.object, services);
|
|
83
86
|
if (/window/i.test(typeName) || /globalThis/i.test(typeName)) {
|
|
84
87
|
context.report({ node: callee, messageId: 'convertWebSQLUse' });
|
|
85
88
|
}
|
package/cjs/S2819/rule.js
CHANGED
|
@@ -51,12 +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 ancestor_js_1 = require("../helpers/ancestor.js");
|
|
55
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
56
|
+
const type_js_1 = require("../helpers/type.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 POST_MESSAGE = 'postMessage';
|
|
57
61
|
const ADD_EVENT_LISTENER = 'addEventListener';
|
|
58
62
|
exports.rule = {
|
|
59
|
-
meta: (0,
|
|
63
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, {
|
|
60
64
|
messages: {
|
|
61
65
|
specifyTarget: `Specify a target origin for this message.`,
|
|
62
66
|
verifyOrigin: `Verify the origin of the received message.`,
|
|
@@ -64,7 +68,7 @@ exports.rule = {
|
|
|
64
68
|
}),
|
|
65
69
|
create(context) {
|
|
66
70
|
const services = context.sourceCode.parserServices;
|
|
67
|
-
if (!(0,
|
|
71
|
+
if (!(0, parser_services_js_1.isRequiredParserServices)(services)) {
|
|
68
72
|
return {};
|
|
69
73
|
}
|
|
70
74
|
return {
|
|
@@ -78,7 +82,7 @@ exports.rule = {
|
|
|
78
82
|
},
|
|
79
83
|
};
|
|
80
84
|
function isWindowObject(node, context) {
|
|
81
|
-
const type = (0,
|
|
85
|
+
const type = (0, type_js_1.getTypeAsString)(node, context.sourceCode.parserServices);
|
|
82
86
|
const hasWindowName = WindowNameVisitor.containsWindowName(node, context);
|
|
83
87
|
return type.match(/window/i) || type.match(/globalThis/i) || hasWindowName;
|
|
84
88
|
}
|
|
@@ -86,7 +90,7 @@ function checkPostMessageCall(callExpr, context) {
|
|
|
86
90
|
const { callee } = callExpr;
|
|
87
91
|
// Window.postMessage() can take 2 or 3 arguments
|
|
88
92
|
if (![2, 3].includes(callExpr.arguments.length) ||
|
|
89
|
-
(0,
|
|
93
|
+
(0, ast_js_1.getValueOfExpression)(context, callExpr.arguments[1], 'Literal')?.value !== '*') {
|
|
90
94
|
return;
|
|
91
95
|
}
|
|
92
96
|
if (callee.type === 'Identifier') {
|
|
@@ -112,9 +116,9 @@ function checkAddEventListenerCall(callExpr, context) {
|
|
|
112
116
|
!isMessageTypeEvent(args[0], context)) {
|
|
113
117
|
return;
|
|
114
118
|
}
|
|
115
|
-
let listener = (0,
|
|
119
|
+
let listener = (0, ast_js_1.resolveFunction)(context, args[1]);
|
|
116
120
|
if (listener?.body.type === 'CallExpression') {
|
|
117
|
-
listener = (0,
|
|
121
|
+
listener = (0, ast_js_1.resolveFunction)(context, listener.body);
|
|
118
122
|
}
|
|
119
123
|
if (!listener || listener.params.length === 0) {
|
|
120
124
|
return;
|
|
@@ -295,7 +299,7 @@ function findEventOrigin(event) {
|
|
|
295
299
|
* Checks if node has a property 'origin'
|
|
296
300
|
*/
|
|
297
301
|
function isPropertyOrigin(node) {
|
|
298
|
-
return (0,
|
|
302
|
+
return (0, ast_js_1.isIdentifier)(node.property, 'origin');
|
|
299
303
|
}
|
|
300
304
|
/**
|
|
301
305
|
* Returns event.originalEvent MemberExpression, if exists
|
|
@@ -307,7 +311,7 @@ function findEventOriginalEvent(event) {
|
|
|
307
311
|
}
|
|
308
312
|
const { object: eventCandidate, property: originalEventIdentifierCandidate } = memberExpr;
|
|
309
313
|
if (eventCandidate === event &&
|
|
310
|
-
(0,
|
|
314
|
+
(0, ast_js_1.isIdentifier)(originalEventIdentifierCandidate, 'originalEvent')) {
|
|
311
315
|
return memberExpr;
|
|
312
316
|
}
|
|
313
317
|
return null;
|
|
@@ -320,10 +324,10 @@ function isInIfStatement(node) {
|
|
|
320
324
|
if (node == null) {
|
|
321
325
|
return false;
|
|
322
326
|
}
|
|
323
|
-
return (0,
|
|
327
|
+
return (0, ancestor_js_1.findFirstMatchingLocalAncestor)(node, ast_js_1.isIfStatement) != null;
|
|
324
328
|
}
|
|
325
329
|
function isMessageTypeEvent(eventNode, context) {
|
|
326
|
-
const eventValue = (0,
|
|
330
|
+
const eventValue = (0, ast_js_1.getValueOfExpression)(context, eventNode, 'Literal');
|
|
327
331
|
return typeof eventValue?.value === 'string' && eventValue.value.toLowerCase() === 'message';
|
|
328
332
|
}
|
|
329
333
|
class WindowNameVisitor {
|
|
@@ -340,7 +344,7 @@ class WindowNameVisitor {
|
|
|
340
344
|
if (node.type === 'Identifier' && /window/i.test(node.name)) {
|
|
341
345
|
this.hasWindowName = true;
|
|
342
346
|
}
|
|
343
|
-
for (const childNode of (0,
|
|
347
|
+
for (const childNode of (0, ancestor_js_1.childrenOf)(node, context.sourceCode.visitorKeys)) {
|
|
344
348
|
visitNode(childNode);
|
|
345
349
|
}
|
|
346
350
|
};
|
package/cjs/S2870/rule.js
CHANGED
|
@@ -51,23 +51,26 @@ 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 ancestor_js_1 = require("../helpers/ancestor.js");
|
|
56
|
+
const type_js_1 = require("../helpers/type.js");
|
|
57
|
+
const parser_services_js_1 = require("../helpers/parser-services.js");
|
|
55
58
|
const meta = __importStar(require("./generated-meta.js"));
|
|
56
59
|
const ArrayDeleteExpression = "UnaryExpression[operator='delete'] > MemberExpression[computed=true]";
|
|
57
60
|
exports.rule = {
|
|
58
|
-
meta: (0,
|
|
61
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, {
|
|
59
62
|
messages: {
|
|
60
63
|
removeDelete: 'Remove this use of "delete".',
|
|
61
64
|
},
|
|
62
65
|
}),
|
|
63
66
|
create(context) {
|
|
64
67
|
const services = context.sourceCode.parserServices;
|
|
65
|
-
if ((0,
|
|
68
|
+
if ((0, parser_services_js_1.isRequiredParserServices)(services)) {
|
|
66
69
|
return {
|
|
67
70
|
[ArrayDeleteExpression]: (node) => {
|
|
68
71
|
const member = node;
|
|
69
72
|
const object = member.object;
|
|
70
|
-
if ((0,
|
|
73
|
+
if ((0, type_js_1.isArray)(object, services)) {
|
|
71
74
|
raiseIssue(context, node);
|
|
72
75
|
}
|
|
73
76
|
},
|
|
@@ -77,7 +80,7 @@ exports.rule = {
|
|
|
77
80
|
},
|
|
78
81
|
};
|
|
79
82
|
function raiseIssue(context, node) {
|
|
80
|
-
const deleteKeyword = context.sourceCode.getFirstToken((0,
|
|
83
|
+
const deleteKeyword = context.sourceCode.getFirstToken((0, ancestor_js_1.getParent)(context, node));
|
|
81
84
|
context.report({
|
|
82
85
|
messageId: 'removeDelete',
|
|
83
86
|
loc: deleteKeyword.loc,
|
package/cjs/S2871/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 collection_js_1 = require("../helpers/collection.js");
|
|
55
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
56
|
+
const type_js_1 = require("../helpers/type.js");
|
|
57
|
+
const parser_services_js_1 = require("../helpers/parser-services.js");
|
|
55
58
|
const meta = __importStar(require("./generated-meta.js"));
|
|
56
59
|
const compareNumberFunctionPlaceholder = '(a, b) => (a - b)';
|
|
57
60
|
const compareBigIntFunctionPlaceholder = [
|
|
@@ -67,7 +70,7 @@ const compareBigIntFunctionPlaceholder = [
|
|
|
67
70
|
];
|
|
68
71
|
const languageSensitiveOrderPlaceholder = '(a, b) => a.localeCompare(b)';
|
|
69
72
|
exports.rule = {
|
|
70
|
-
meta: (0,
|
|
73
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta, {
|
|
71
74
|
hasSuggestions: true,
|
|
72
75
|
messages: {
|
|
73
76
|
provideCompareFunction: 'Provide a compare function to avoid sorting elements alphabetically.',
|
|
@@ -79,15 +82,15 @@ exports.rule = {
|
|
|
79
82
|
create(context) {
|
|
80
83
|
const sourceCode = context.sourceCode;
|
|
81
84
|
const services = context.sourceCode.parserServices;
|
|
82
|
-
if (!(0,
|
|
85
|
+
if (!(0, parser_services_js_1.isRequiredParserServices)(services)) {
|
|
83
86
|
return {};
|
|
84
87
|
}
|
|
85
88
|
return {
|
|
86
89
|
'CallExpression[arguments.length=0][callee.type="MemberExpression"]': (call) => {
|
|
87
90
|
const { object, property: node } = call.callee;
|
|
88
91
|
const text = sourceCode.getText(node);
|
|
89
|
-
const type = (0,
|
|
90
|
-
if ([...
|
|
92
|
+
const type = (0, type_js_1.getTypeFromTreeNode)(object, services);
|
|
93
|
+
if ([...collection_js_1.sortLike, ...collection_js_1.copyingSortLike].includes(text) && (0, type_js_1.isArrayLikeType)(type, services)) {
|
|
91
94
|
const suggest = getSuggestions(call, type);
|
|
92
95
|
const messageId = getMessageId(type);
|
|
93
96
|
context.report({ node, suggest, messageId });
|
|
@@ -96,19 +99,19 @@ exports.rule = {
|
|
|
96
99
|
};
|
|
97
100
|
function getSuggestions(call, type) {
|
|
98
101
|
const suggestions = [];
|
|
99
|
-
if ((0,
|
|
102
|
+
if ((0, type_js_1.isNumberArray)(type, services)) {
|
|
100
103
|
suggestions.push({
|
|
101
104
|
messageId: 'suggestNumericOrder',
|
|
102
105
|
fix: fixer(call, compareNumberFunctionPlaceholder),
|
|
103
106
|
});
|
|
104
107
|
}
|
|
105
|
-
else if ((0,
|
|
108
|
+
else if ((0, type_js_1.isBigIntArray)(type, services)) {
|
|
106
109
|
suggestions.push({
|
|
107
110
|
messageId: 'suggestNumericOrder',
|
|
108
111
|
fix: fixer(call, ...compareBigIntFunctionPlaceholder),
|
|
109
112
|
});
|
|
110
113
|
}
|
|
111
|
-
else if ((0,
|
|
114
|
+
else if ((0, type_js_1.isStringArray)(type, services)) {
|
|
112
115
|
suggestions.push({
|
|
113
116
|
messageId: 'suggestLanguageSensitiveOrder',
|
|
114
117
|
fix: fixer(call, languageSensitiveOrderPlaceholder),
|
|
@@ -117,7 +120,7 @@ exports.rule = {
|
|
|
117
120
|
return suggestions;
|
|
118
121
|
}
|
|
119
122
|
function getMessageId(type) {
|
|
120
|
-
if ((0,
|
|
123
|
+
if ((0, type_js_1.isStringArray)(type, services)) {
|
|
121
124
|
return 'provideCompareFunctionForArrayOfStrings';
|
|
122
125
|
}
|
|
123
126
|
return 'provideCompareFunction';
|
package/cjs/S2970/rule.js
CHANGED
|
@@ -51,7 +51,8 @@ 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
|
const assertionFunctions = [
|
|
57
58
|
'a',
|
|
@@ -137,7 +138,7 @@ const gettersOrModifiers = [
|
|
|
137
138
|
'should',
|
|
138
139
|
];
|
|
139
140
|
exports.rule = {
|
|
140
|
-
meta: (0,
|
|
141
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta),
|
|
141
142
|
create(context) {
|
|
142
143
|
return {
|
|
143
144
|
ExpressionStatement(node) {
|
|
@@ -145,13 +146,13 @@ exports.rule = {
|
|
|
145
146
|
if (exprStatement.expression.type === 'MemberExpression') {
|
|
146
147
|
const { property } = exprStatement.expression;
|
|
147
148
|
if (isTestAssertion(exprStatement.expression)) {
|
|
148
|
-
if ((0,
|
|
149
|
+
if ((0, ast_js_1.isIdentifier)(property, ...assertionFunctions)) {
|
|
149
150
|
context.report({
|
|
150
151
|
node: property,
|
|
151
152
|
message: `Call this '${property.name}' assertion.`,
|
|
152
153
|
});
|
|
153
154
|
}
|
|
154
|
-
if ((0,
|
|
155
|
+
if ((0, ast_js_1.isIdentifier)(property, ...gettersOrModifiers)) {
|
|
155
156
|
context.report({
|
|
156
157
|
node: property,
|
|
157
158
|
message: `Complete this assertion; '${property.name}' doesn't assert anything by itself.`,
|
|
@@ -173,10 +174,10 @@ exports.rule = {
|
|
|
173
174
|
function isTestAssertion(node) {
|
|
174
175
|
const { object, property } = node;
|
|
175
176
|
// Chai's BDD style where 'should' extends Object.prototype https://www.chaijs.com/guide/styles/
|
|
176
|
-
if ((0,
|
|
177
|
+
if ((0, ast_js_1.isIdentifier)(object) && (0, ast_js_1.isIdentifier)(property, 'should')) {
|
|
177
178
|
return true;
|
|
178
179
|
}
|
|
179
|
-
if (isExpectCall(object) || (0,
|
|
180
|
+
if (isExpectCall(object) || (0, ast_js_1.isIdentifier)(object, 'assert', 'expect', 'should')) {
|
|
180
181
|
return true;
|
|
181
182
|
}
|
|
182
183
|
else if (object.type === 'MemberExpression') {
|
|
@@ -189,6 +190,6 @@ function isTestAssertion(node) {
|
|
|
189
190
|
}
|
|
190
191
|
function isExpectCall(node) {
|
|
191
192
|
return (node.type === 'CallExpression' &&
|
|
192
|
-
(0,
|
|
193
|
-
!(0,
|
|
193
|
+
(0, ast_js_1.isIdentifier)(node.callee, 'expect') &&
|
|
194
|
+
!(0, ast_js_1.isNumberLiteral)(node.arguments[0]));
|
|
194
195
|
}
|
package/cjs/S2990/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
|
hasSuggestions: true,
|
|
59
59
|
messages: {
|
|
60
60
|
removeThis: `Remove the use of "this".`,
|
package/cjs/S2999/rule.js
CHANGED
|
@@ -55,30 +55,33 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
55
55
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
56
56
|
exports.rule = void 0;
|
|
57
57
|
const typescript_1 = __importDefault(require("typescript"));
|
|
58
|
-
const
|
|
58
|
+
const generate_meta_js_1 = require("../helpers/generate-meta.js");
|
|
59
|
+
const type_js_1 = require("../helpers/type.js");
|
|
60
|
+
const parser_services_js_1 = require("../helpers/parser-services.js");
|
|
61
|
+
const location_js_1 = require("../helpers/location.js");
|
|
59
62
|
const meta = __importStar(require("./generated-meta.js"));
|
|
60
63
|
exports.rule = {
|
|
61
|
-
meta: (0,
|
|
64
|
+
meta: (0, generate_meta_js_1.generateMeta)(meta),
|
|
62
65
|
create(context) {
|
|
63
66
|
const considerJSDoc = !!context.options[0]?.considerJSDoc;
|
|
64
67
|
const services = context.sourceCode.parserServices;
|
|
65
|
-
if (!(0,
|
|
68
|
+
if (!(0, parser_services_js_1.isRequiredParserServices)(services)) {
|
|
66
69
|
return {};
|
|
67
70
|
}
|
|
68
71
|
return {
|
|
69
72
|
'NewExpression[callee.type!="ThisExpression"]': (node) => {
|
|
70
73
|
const { callee } = node;
|
|
71
|
-
const type = (0,
|
|
72
|
-
const signature = (0,
|
|
74
|
+
const type = (0, type_js_1.getTypeFromTreeNode)(callee, services);
|
|
75
|
+
const signature = (0, type_js_1.getSignatureFromCallee)(node, services);
|
|
73
76
|
if (!isInstantiable(type, signature, considerJSDoc) && !isAny(type)) {
|
|
74
77
|
const functionToken = context.sourceCode.getFirstToken(node, token => token.type === 'Keyword' && token.value === 'function');
|
|
75
78
|
const newToken = context.sourceCode.getFirstToken(node, token => token.type === 'Keyword' && token.value === 'new');
|
|
76
79
|
const text = isFunction(type) ? 'this function' : context.sourceCode.getText(callee);
|
|
77
80
|
const loc = callee.type === 'FunctionExpression' ? functionToken.loc : callee.loc;
|
|
78
|
-
(0,
|
|
81
|
+
(0, location_js_1.report)(context, {
|
|
79
82
|
message: `Replace ${text} with a constructor function.`,
|
|
80
83
|
loc,
|
|
81
|
-
}, [(0,
|
|
84
|
+
}, [(0, location_js_1.toSecondaryLocation)(newToken)]);
|
|
82
85
|
}
|
|
83
86
|
},
|
|
84
87
|
};
|