@checkdigit/eslint-plugin 6.6.0-PR.75-03e4 → 6.6.0-PR.75-c331
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/dist-cjs/index.cjs +479 -365
- package/dist-cjs/metafile.json +54 -6
- package/dist-mjs/fixture/fetch-response-body-json.mjs +61 -0
- package/dist-mjs/fixture/no-service-wrapper.mjs +9 -9
- package/dist-mjs/fixture/no-status-code.mjs +2 -3
- package/dist-mjs/index.mjs +9 -3
- package/dist-types/fixture/fetch-response-body-json.d.ts +4 -0
- package/dist-types/fixture/no-service-wrapper.d.ts +1 -1
- package/dist-types/index.d.ts +5 -1
- package/package.json +1 -1
- package/src/fixture/fetch-response-body-json.ts +73 -0
- package/src/fixture/no-service-wrapper.ts +8 -16
- package/src/fixture/no-status-code.ts +1 -2
- package/src/index.ts +6 -0
package/dist-cjs/metafile.json
CHANGED
|
@@ -12250,6 +12250,22 @@
|
|
|
12250
12250
|
],
|
|
12251
12251
|
"format": "cjs"
|
|
12252
12252
|
},
|
|
12253
|
+
"src/fixture/fetch-response-body-json.ts": {
|
|
12254
|
+
"bytes": 2433,
|
|
12255
|
+
"imports": [
|
|
12256
|
+
{
|
|
12257
|
+
"path": "node_modules/@typescript-eslint/utils/dist/index.js",
|
|
12258
|
+
"kind": "import-statement",
|
|
12259
|
+
"original": "@typescript-eslint/utils"
|
|
12260
|
+
},
|
|
12261
|
+
{
|
|
12262
|
+
"path": "src/get-documentation-url.ts",
|
|
12263
|
+
"kind": "import-statement",
|
|
12264
|
+
"original": "../get-documentation-url"
|
|
12265
|
+
}
|
|
12266
|
+
],
|
|
12267
|
+
"format": "esm"
|
|
12268
|
+
},
|
|
12253
12269
|
"src/ast/format.ts": {
|
|
12254
12270
|
"bytes": 647,
|
|
12255
12271
|
"imports": [
|
|
@@ -12407,7 +12423,7 @@
|
|
|
12407
12423
|
"format": "esm"
|
|
12408
12424
|
},
|
|
12409
12425
|
"src/fixture/no-service-wrapper.ts": {
|
|
12410
|
-
"bytes":
|
|
12426
|
+
"bytes": 9185,
|
|
12411
12427
|
"imports": [
|
|
12412
12428
|
{
|
|
12413
12429
|
"path": "node_modules/@typescript-eslint/utils/dist/index.js",
|
|
@@ -12447,6 +12463,22 @@
|
|
|
12447
12463
|
],
|
|
12448
12464
|
"format": "esm"
|
|
12449
12465
|
},
|
|
12466
|
+
"src/fixture/no-status-code.ts": {
|
|
12467
|
+
"bytes": 2353,
|
|
12468
|
+
"imports": [
|
|
12469
|
+
{
|
|
12470
|
+
"path": "node_modules/@typescript-eslint/utils/dist/index.js",
|
|
12471
|
+
"kind": "import-statement",
|
|
12472
|
+
"original": "@typescript-eslint/utils"
|
|
12473
|
+
},
|
|
12474
|
+
{
|
|
12475
|
+
"path": "src/get-documentation-url.ts",
|
|
12476
|
+
"kind": "import-statement",
|
|
12477
|
+
"original": "../get-documentation-url"
|
|
12478
|
+
}
|
|
12479
|
+
],
|
|
12480
|
+
"format": "esm"
|
|
12481
|
+
},
|
|
12450
12482
|
"src/file-path-comment.ts": {
|
|
12451
12483
|
"bytes": 2234,
|
|
12452
12484
|
"imports": [],
|
|
@@ -12493,13 +12525,18 @@
|
|
|
12493
12525
|
"format": "esm"
|
|
12494
12526
|
},
|
|
12495
12527
|
"src/index.ts": {
|
|
12496
|
-
"bytes":
|
|
12528
|
+
"bytes": 3927,
|
|
12497
12529
|
"imports": [
|
|
12498
12530
|
{
|
|
12499
12531
|
"path": "src/fixture/fetch-header-getter.ts",
|
|
12500
12532
|
"kind": "import-statement",
|
|
12501
12533
|
"original": "./fixture/fetch-header-getter"
|
|
12502
12534
|
},
|
|
12535
|
+
{
|
|
12536
|
+
"path": "src/fixture/fetch-response-body-json.ts",
|
|
12537
|
+
"kind": "import-statement",
|
|
12538
|
+
"original": "./fixture/fetch-response-body-json"
|
|
12539
|
+
},
|
|
12503
12540
|
{
|
|
12504
12541
|
"path": "src/fixture/fetch-then.ts",
|
|
12505
12542
|
"kind": "import-statement",
|
|
@@ -12525,6 +12562,11 @@
|
|
|
12525
12562
|
"kind": "import-statement",
|
|
12526
12563
|
"original": "./fixture/no-service-wrapper"
|
|
12527
12564
|
},
|
|
12565
|
+
{
|
|
12566
|
+
"path": "src/fixture/no-status-code.ts",
|
|
12567
|
+
"kind": "import-statement",
|
|
12568
|
+
"original": "./fixture/no-status-code"
|
|
12569
|
+
},
|
|
12528
12570
|
{
|
|
12529
12571
|
"path": "src/file-path-comment.ts",
|
|
12530
12572
|
"kind": "import-statement",
|
|
@@ -15359,7 +15401,7 @@
|
|
|
15359
15401
|
"bytesInOutput": 2218
|
|
15360
15402
|
},
|
|
15361
15403
|
"src/index.ts": {
|
|
15362
|
-
"bytesInOutput":
|
|
15404
|
+
"bytesInOutput": 2528
|
|
15363
15405
|
},
|
|
15364
15406
|
"src/ast/tree.ts": {
|
|
15365
15407
|
"bytesInOutput": 1648
|
|
@@ -15379,8 +15421,11 @@
|
|
|
15379
15421
|
"src/fixture/fetch-header-getter.ts": {
|
|
15380
15422
|
"bytesInOutput": 2805
|
|
15381
15423
|
},
|
|
15424
|
+
"src/fixture/fetch-response-body-json.ts": {
|
|
15425
|
+
"bytesInOutput": 2109
|
|
15426
|
+
},
|
|
15382
15427
|
"src/ast/format.ts": {
|
|
15383
|
-
"bytesInOutput":
|
|
15428
|
+
"bytesInOutput": 383
|
|
15384
15429
|
},
|
|
15385
15430
|
"src/fixture/variable.ts": {
|
|
15386
15431
|
"bytesInOutput": 118
|
|
@@ -15404,7 +15449,10 @@
|
|
|
15404
15449
|
"bytesInOutput": 1849
|
|
15405
15450
|
},
|
|
15406
15451
|
"src/fixture/no-service-wrapper.ts": {
|
|
15407
|
-
"bytesInOutput":
|
|
15452
|
+
"bytesInOutput": 8651
|
|
15453
|
+
},
|
|
15454
|
+
"src/fixture/no-status-code.ts": {
|
|
15455
|
+
"bytesInOutput": 2034
|
|
15408
15456
|
},
|
|
15409
15457
|
"src/file-path-comment.ts": {
|
|
15410
15458
|
"bytesInOutput": 1961
|
|
@@ -15434,7 +15482,7 @@
|
|
|
15434
15482
|
"bytesInOutput": 3362
|
|
15435
15483
|
}
|
|
15436
15484
|
},
|
|
15437
|
-
"bytes":
|
|
15485
|
+
"bytes": 4300402
|
|
15438
15486
|
}
|
|
15439
15487
|
}
|
|
15440
15488
|
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// src/fixture/fetch-response-body-json.ts
|
|
2
|
+
import { ESLintUtils } from "@typescript-eslint/utils";
|
|
3
|
+
import getDocumentationUrl from "../get-documentation-url.mjs";
|
|
4
|
+
var ruleId = "fetch-response-body-json";
|
|
5
|
+
var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
|
|
6
|
+
var rule = createRule({
|
|
7
|
+
name: ruleId,
|
|
8
|
+
meta: {
|
|
9
|
+
type: "suggestion",
|
|
10
|
+
docs: {
|
|
11
|
+
description: 'Replace "response.body" with "await response.json()".'
|
|
12
|
+
},
|
|
13
|
+
messages: {
|
|
14
|
+
replaceBodyWithJson: 'Replace "response.body" with "await response.json()".',
|
|
15
|
+
unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
|
|
16
|
+
},
|
|
17
|
+
fixable: "code",
|
|
18
|
+
schema: []
|
|
19
|
+
},
|
|
20
|
+
defaultOptions: [],
|
|
21
|
+
create(context) {
|
|
22
|
+
const parserServices = ESLintUtils.getParserServices(context);
|
|
23
|
+
const typeChecker = parserServices.program.getTypeChecker();
|
|
24
|
+
const sourceCode = context.sourceCode;
|
|
25
|
+
return {
|
|
26
|
+
'MemberExpression[property.name="body"]': (responseBody) => {
|
|
27
|
+
try {
|
|
28
|
+
const responseNode = parserServices.esTreeNodeToTSNodeMap.get(responseBody.object);
|
|
29
|
+
const responseType = typeChecker.getTypeAtLocation(responseNode);
|
|
30
|
+
const shouldReplace = responseType.getProperties().some((symbol) => symbol.name === "body") && responseType.getProperties().some((symbol) => symbol.name === "json");
|
|
31
|
+
if (shouldReplace) {
|
|
32
|
+
const responseText = sourceCode.getText(responseBody.object);
|
|
33
|
+
context.report({
|
|
34
|
+
messageId: "replaceBodyWithJson",
|
|
35
|
+
node: responseBody,
|
|
36
|
+
fix(fixer) {
|
|
37
|
+
return fixer.replaceText(responseBody, `(await ${responseText}.json())`);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
} catch (error) {
|
|
42
|
+
console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
|
|
43
|
+
context.report({
|
|
44
|
+
node: responseBody,
|
|
45
|
+
messageId: "unknownError",
|
|
46
|
+
data: {
|
|
47
|
+
fileName: context.filename,
|
|
48
|
+
error: error instanceof Error ? error.toString() : JSON.stringify(error)
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
var fetch_response_body_json_default = rule;
|
|
57
|
+
export {
|
|
58
|
+
fetch_response_body_json_default as default,
|
|
59
|
+
ruleId
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2ZpeHR1cmUvZmV0Y2gtcmVzcG9uc2UtYm9keS1qc29uLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFBLFNBQVMsbUJBQTZCO0FBQ3RDLE9BQU8seUJBQXlCO0FBRXpCLElBQU0sU0FBUztBQUV0QixJQUFNLGFBQWEsWUFBWSxZQUFZLENBQUMsU0FBUyxvQkFBb0IsSUFBSSxDQUFDO0FBRTlFLElBQU0sT0FBTyxXQUFXO0FBQUEsRUFDdEIsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLHFCQUFxQjtBQUFBLE1BQ3JCLGNBQWM7QUFBQSxJQUNoQjtBQUFBLElBQ0EsU0FBUztBQUFBLElBQ1QsUUFBUSxDQUFDO0FBQUEsRUFDWDtBQUFBLEVBQ0EsZ0JBQWdCLENBQUM7QUFBQSxFQUNqQixPQUFPLFNBQVM7QUFDZCxVQUFNLGlCQUFpQixZQUFZLGtCQUFrQixPQUFPO0FBQzVELFVBQU0sY0FBYyxlQUFlLFFBQVEsZUFBZTtBQUMxRCxVQUFNLGFBQWEsUUFBUTtBQUUzQixXQUFPO0FBQUEsTUFDTCwwQ0FBMEMsQ0FBQyxpQkFBNEM7QUFDckYsWUFBSTtBQUNGLGdCQUFNLGVBQWUsZUFBZSxzQkFBc0IsSUFBSSxhQUFhLE1BQU07QUFDakYsZ0JBQU0sZUFBZSxZQUFZLGtCQUFrQixZQUFZO0FBRS9ELGdCQUFNLGdCQUNKLGFBQWEsY0FBYyxFQUFFLEtBQUssQ0FBQyxXQUFXLE9BQU8sU0FBUyxNQUFNLEtBQ3BFLGFBQWEsY0FBYyxFQUFFLEtBQUssQ0FBQyxXQUFXLE9BQU8sU0FBUyxNQUFNO0FBRXRFLGNBQUksZUFBZTtBQUNqQixrQkFBTSxlQUFlLFdBQVcsUUFBUSxhQUFhLE1BQU07QUFDM0Qsb0JBQVEsT0FBTztBQUFBLGNBQ2IsV0FBVztBQUFBLGNBQ1gsTUFBTTtBQUFBLGNBQ04sSUFBSSxPQUFPO0FBQ1QsdUJBQU8sTUFBTSxZQUFZLGNBQWMsVUFBVSxZQUFZLFVBQVU7QUFBQSxjQUN6RTtBQUFBLFlBQ0YsQ0FBQztBQUFBLFVBQ0g7QUFBQSxRQUNGLFNBQVMsT0FBTztBQUVkLGtCQUFRLE1BQU0sbUJBQW1CLE1BQU0sbUJBQW1CLFFBQVEsUUFBUSxNQUFNLEtBQUs7QUFDckYsa0JBQVEsT0FBTztBQUFBLFlBQ2IsTUFBTTtBQUFBLFlBQ04sV0FBVztBQUFBLFlBQ1gsTUFBTTtBQUFBLGNBQ0osVUFBVSxRQUFRO0FBQUEsY0FDbEIsT0FBTyxpQkFBaUIsUUFBUSxNQUFNLFNBQVMsSUFBSSxLQUFLLFVBQVUsS0FBSztBQUFBLFlBQ3pFO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGLENBQUM7QUFFRCxJQUFPLG1DQUFROyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -24,7 +24,6 @@ var rule = createRule({
|
|
|
24
24
|
schema: []
|
|
25
25
|
},
|
|
26
26
|
defaultOptions: [],
|
|
27
|
-
// eslint-disable-next-line max-lines-per-function
|
|
28
27
|
create(context) {
|
|
29
28
|
const sourceCode = context.sourceCode;
|
|
30
29
|
const scopeManager = sourceCode.scopeManager;
|
|
@@ -37,13 +36,14 @@ var rule = createRule({
|
|
|
37
36
|
}
|
|
38
37
|
if (urlArgument?.type === AST_NODE_TYPES.Identifier) {
|
|
39
38
|
const foundVariable = scope.variables.find((variable) => variable.name === urlArgument.name);
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
39
|
+
if (foundVariable) {
|
|
40
|
+
const variableDefinition = foundVariable.defs.find((def) => def.type === DefinitionType.Variable);
|
|
41
|
+
assert.ok(variableDefinition, `Variable "${urlArgument.name}" not defined in scope`);
|
|
42
|
+
const variableDefinitionNode = variableDefinition.node;
|
|
43
|
+
assert.ok(variableDefinitionNode.type === AST_NODE_TYPES.VariableDeclarator);
|
|
44
|
+
assert.ok(variableDefinitionNode.init, "Variable definition node has no init property");
|
|
45
|
+
return isUrlArgumentValid(variableDefinitionNode.init, scope);
|
|
46
|
+
}
|
|
47
47
|
}
|
|
48
48
|
return false;
|
|
49
49
|
}
|
|
@@ -178,4 +178,4 @@ export {
|
|
|
178
178
|
no_service_wrapper_default as default,
|
|
179
179
|
ruleId
|
|
180
180
|
};
|
|
181
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
181
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2ZpeHR1cmUvbm8tc2VydmljZS13cmFwcGVyLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFBLFNBQVMsZ0JBQWdCLG1CQUE2QjtBQUN0RCxTQUFTLHNCQUFrQztBQUMzQyxTQUFTLGtCQUFrQixzQkFBc0IsMENBQTBDO0FBQzNGLFNBQVMsVUFBVSxjQUFjO0FBQ2pDLE9BQU8seUJBQXlCO0FBQ2hDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsc0JBQXNCO0FBRXhCLElBQU0sU0FBUztBQUV0QixJQUFNLGFBQWEsWUFBWSxZQUFZLENBQUMsU0FBUyxvQkFBb0IsSUFBSSxDQUFDO0FBRTlFLElBQU0sT0FBTyxXQUFXO0FBQUEsRUFDdEIsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLG1CQUFtQjtBQUFBLE1BQ25CLGdCQUNFO0FBQUEsTUFDRixjQUNFO0FBQUEsSUFDSjtBQUFBLElBQ0EsU0FBUztBQUFBLElBQ1QsUUFBUSxDQUFDO0FBQUEsRUFDWDtBQUFBLEVBQ0EsZ0JBQWdCLENBQUM7QUFBQSxFQUNqQixPQUFPLFNBQVM7QUFDZCxVQUFNLGFBQWEsUUFBUTtBQUMzQixVQUFNLGVBQWUsV0FBVztBQUNoQyxVQUFNLGdCQUFnQixZQUFZLGtCQUFrQixPQUFPO0FBQzNELFVBQU0sY0FBYyxjQUFjLFFBQVEsZUFBZTtBQUV6RCxhQUFTLG1CQUFtQixhQUF3QyxPQUFjO0FBQ2hGLFVBQ0csYUFBYSxTQUFTLGVBQWUsV0FBVyxPQUFPLFlBQVksVUFBVSxZQUM5RSxhQUFhLFNBQVMsZUFBZSxpQkFDckM7QUFDQSxjQUFNLFVBQVUsV0FBVyxRQUFRLFdBQVc7QUFDOUMsZUFBTyxpQkFBaUIsS0FBSyxPQUFPLEtBQUsscUJBQXFCLEtBQUssT0FBTztBQUFBLE1BQzVFO0FBRUEsVUFBSSxhQUFhLFNBQVMs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
|
|
@@ -11,14 +11,13 @@ var rule = createRule({
|
|
|
11
11
|
description: 'Access the status code property of the fetch Response using "status" instead of "statusCode".'
|
|
12
12
|
},
|
|
13
13
|
messages: {
|
|
14
|
-
replaceStatusCode: '
|
|
14
|
+
replaceStatusCode: 'Replace "statusCode" with "status".',
|
|
15
15
|
unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
|
|
16
16
|
},
|
|
17
17
|
fixable: "code",
|
|
18
18
|
schema: []
|
|
19
19
|
},
|
|
20
20
|
defaultOptions: [],
|
|
21
|
-
// eslint-disable-next-line max-lines-per-function
|
|
22
21
|
create(context) {
|
|
23
22
|
const parserServices = ESLintUtils.getParserServices(context);
|
|
24
23
|
const typeChecker = parserServices.program.getTypeChecker();
|
|
@@ -57,4 +56,4 @@ export {
|
|
|
57
56
|
no_status_code_default as default,
|
|
58
57
|
ruleId
|
|
59
58
|
};
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2ZpeHR1cmUvbm8tc3RhdHVzLWNvZGUudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBUUEsU0FBUyxtQkFBNkI7QUFDdEMsT0FBTyx5QkFBeUI7QUFFekIsSUFBTSxTQUFTO0FBRXRCLElBQU0sYUFBYSxZQUFZLFlBQVksQ0FBQyxTQUFTLG9CQUFvQixJQUFJLENBQUM7QUFFOUUsSUFBTSxPQUFPLFdBQVc7QUFBQSxFQUN0QixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsTUFDSixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IsbUJBQW1CO0FBQUEsTUFDbkIsY0FBYztBQUFBLElBQ2hCO0FBQUEsSUFDQSxTQUFTO0FBQUEsSUFDVCxRQUFRLENBQUM7QUFBQSxFQUNYO0FBQUEsRUFDQSxnQkFBZ0IsQ0FBQztBQUFBLEVBQ2pCLE9BQU8sU0FBUztBQUNkLFVBQU0saUJBQWlCLFlBQVksa0JBQWtCLE9BQU87QUFDNUQsVUFBTSxjQUFjLGVBQWUsUUFBUSxlQUFlO0FBRTFELFdBQU87QUFBQSxNQUNMLGdEQUFnRCxDQUFDLHVCQUFrRDtBQUNqRyxZQUFJO0FBQ0YsZ0JBQU0sZUFBZSxlQUFlLHNCQUFzQixJQUFJLG1CQUFtQixNQUFNO0FBQ3ZGLGdCQUFNLGVBQWUsWUFBWSxrQkFBa0IsWUFBWTtBQUUvRCxnQkFBTSxnQkFDSixhQUFhLGNBQWMsRUFBRSxLQUFLLENBQUMsV0FBVyxPQUFPLFNBQVMsUUFBUSxLQUN0RSxDQUFDLGFBQWEsY0FBYyxFQUFFLEtBQUssQ0FBQyxXQUFXLE9BQU8sU0FBUyxZQUFZO0FBRTdFLGNBQUksZUFBZTtBQUNqQixvQkFBUSxPQUFPO0FBQUEsY0FDYixXQUFXO0FBQUEsY0FDWCxNQUFNLG1CQUFtQjtBQUFBLGNBQ3pCLElBQUksT0FBTztBQUNULHVCQUFPLE1BQU0sWUFBWSxtQkFBbUIsVUFBVSxRQUFRO0FBQUEsY0FDaEU7QUFBQSxZQUNGLENBQUM7QUFBQSxVQUNIO0FBQUEsUUFDRixTQUFTLE9BQU87QUFFZCxrQkFBUSxNQUFNLG1CQUFtQixNQUFNLG1CQUFtQixRQUFRLFFBQVEsTUFBTSxLQUFLO0FBQ3JGLGtCQUFRLE9BQU87QUFBQSxZQUNiLE1BQU07QUFBQSxZQUNOLFdBQVc7QUFBQSxZQUNYLE1BQU07QUFBQSxjQUNKLFVBQVUsUUFBUTtBQUFBLGNBQ2xCLE9BQU8saUJBQWlCLFFBQVEsTUFBTSxTQUFTLElBQUksS0FBSyxVQUFVLEtBQUs7QUFBQSxZQUN6RTtBQUFBLFVBQ0YsQ0FBQztBQUFBLFFBQ0g7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRixDQUFDO0FBRUQsSUFBTyx5QkFBUTsiLAogICJuYW1lcyI6IFtdCn0K
|
package/dist-mjs/index.mjs
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import fetchHeaderGetter, { ruleId as fetchHeaderGetterRuleId } from "./fixture/fetch-header-getter.mjs";
|
|
3
|
+
import fetchResponseBodyJson, { ruleId as fetchResponseBodyJsonRuleId } from "./fixture/fetch-response-body-json.mjs";
|
|
3
4
|
import fetchThen, { ruleId as fetchThenRuleId } from "./fixture/fetch-then.mjs";
|
|
4
5
|
import invalidJsonStringify, { ruleId as invalidJsonStringifyRuleId } from "./invalid-json-stringify.mjs";
|
|
5
6
|
import noFixture, { ruleId as noFixtureRuleId } from "./fixture/no-fixture.mjs";
|
|
6
7
|
import noPromiseInstanceMethod, { ruleId as noPromiseInstanceMethodRuleId } from "./no-promise-instance-method.mjs";
|
|
7
8
|
import noServiceWrapper, { ruleId as noServiceWrapperRuleId } from "./fixture/no-service-wrapper.mjs";
|
|
9
|
+
import noStatusCode, { ruleId as noStatusCodeRuleId } from "./fixture/no-status-code.mjs";
|
|
8
10
|
import filePathComment from "./file-path-comment.mjs";
|
|
9
11
|
import noCardNumbers from "./no-card-numbers.mjs";
|
|
10
12
|
import noTestImport from "./no-test-import.mjs";
|
|
@@ -30,7 +32,9 @@ var src_default = {
|
|
|
30
32
|
[noFixtureRuleId]: noFixture,
|
|
31
33
|
[fetchHeaderGetterRuleId]: fetchHeaderGetter,
|
|
32
34
|
[fetchThenRuleId]: fetchThen,
|
|
33
|
-
[noServiceWrapperRuleId]: noServiceWrapper
|
|
35
|
+
[noServiceWrapperRuleId]: noServiceWrapper,
|
|
36
|
+
[noStatusCodeRuleId]: noStatusCode,
|
|
37
|
+
[fetchResponseBodyJsonRuleId]: fetchResponseBodyJson
|
|
34
38
|
},
|
|
35
39
|
configs: {
|
|
36
40
|
all: {
|
|
@@ -49,7 +53,9 @@ var src_default = {
|
|
|
49
53
|
[`@checkdigit/${noFixtureRuleId}`]: "error",
|
|
50
54
|
[`@checkdigit/${fetchHeaderGetterRuleId}`]: "error",
|
|
51
55
|
[`@checkdigit/${fetchThenRuleId}`]: "error",
|
|
52
|
-
[`@checkdigit/${noServiceWrapperRuleId}`]: "error"
|
|
56
|
+
[`@checkdigit/${noServiceWrapperRuleId}`]: "error",
|
|
57
|
+
[`@checkdigit/${noStatusCodeRuleId}`]: "error",
|
|
58
|
+
[`@checkdigit/${fetchResponseBodyJsonRuleId}`]: "error"
|
|
53
59
|
}
|
|
54
60
|
},
|
|
55
61
|
recommended: {
|
|
@@ -72,4 +78,4 @@ var src_default = {
|
|
|
72
78
|
export {
|
|
73
79
|
src_default as default
|
|
74
80
|
};
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,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
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { ESLintUtils } from '@typescript-eslint/utils';
|
|
2
2
|
export declare const ruleId = "no-service-wrapper";
|
|
3
|
-
declare const rule: ESLintUtils.RuleModule<"
|
|
3
|
+
declare const rule: ESLintUtils.RuleModule<"unknownError" | "preferNativeFetch" | "invalidOptions", never[], ESLintUtils.RuleListener>;
|
|
4
4
|
export default rule;
|
package/dist-types/index.d.ts
CHANGED
|
@@ -14,7 +14,9 @@ declare const _default: {
|
|
|
14
14
|
"no-fixture": import("eslint").Rule.RuleModule;
|
|
15
15
|
"fetch-header-getter": import("eslint").Rule.RuleModule;
|
|
16
16
|
"fetch-then": import("eslint").Rule.RuleModule;
|
|
17
|
-
"no-service-wrapper": import("@typescript-eslint/utils/ts-eslint").RuleModule<"
|
|
17
|
+
"no-service-wrapper": import("@typescript-eslint/utils/ts-eslint").RuleModule<"unknownError" | "preferNativeFetch" | "invalidOptions", never[], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
18
|
+
"no-status-code": import("@typescript-eslint/utils/ts-eslint").RuleModule<"unknownError" | "replaceStatusCode", never[], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
19
|
+
"fetch-response-body-json": import("@typescript-eslint/utils/ts-eslint").RuleModule<"replaceBodyWithJson" | "unknownError", never[], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
18
20
|
};
|
|
19
21
|
configs: {
|
|
20
22
|
all: {
|
|
@@ -34,6 +36,8 @@ declare const _default: {
|
|
|
34
36
|
"@checkdigit/fetch-header-getter": string;
|
|
35
37
|
"@checkdigit/fetch-then": string;
|
|
36
38
|
"@checkdigit/no-service-wrapper": string;
|
|
39
|
+
"@checkdigit/no-status-code": string;
|
|
40
|
+
"@checkdigit/fetch-response-body-json": string;
|
|
37
41
|
};
|
|
38
42
|
};
|
|
39
43
|
recommended: {
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@checkdigit/eslint-plugin","version":"6.6.0-PR.75-
|
|
1
|
+
{"name":"@checkdigit/eslint-plugin","version":"6.6.0-PR.75-c331","description":"Check Digit eslint plugins","keywords":["eslint","eslintplugin"],"homepage":"https://github.com/checkdigit/eslint-plugin#readme","bugs":{"url":"https://github.com/checkdigit/eslint-plugin/issues"},"repository":{"type":"git","url":"https://github.com/checkdigit/eslint-plugin"},"license":"MIT","author":"Check Digit, LLC","sideEffects":false,"type":"module","exports":{".":{"types":"./dist-types/index.d.ts","require":"./dist-cjs/index.cjs","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-cjs","dist-mjs","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-cjs/**/*.test.cjs","!dist-cjs/**/*.spec.cjs","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-cjs":"rimraf dist-cjs && npx builder --type=commonjs --sourceMap --entryPoint=index.ts --outDir=dist-cjs --outFile=index.cjs --external=espree && echo \"module.exports = module.exports.default;\" >> dist-cjs/index.cjs","build:dist-mjs":"rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs","build:dist-types":"rimraf dist-types && npx builder --type=types --outDir=dist-types","ci:compile":"tsc --noEmit","ci:coverage":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true","ci:lint":"npm run lint","ci:style":"npm run prettier","ci:test":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","lint":"eslint --max-warnings 0 --ignore-path .gitignore .","lint:fix":"eslint --ignore-path .gitignore . --fix","prepublishOnly":"npm run build:dist-types && npm run build:dist-cjs && npm run build:dist-mjs","prettier":"prettier --ignore-path .gitignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"},"prettier":"@checkdigit/prettier-config","jest":{"preset":"@checkdigit/jest-config"},"dependencies":{"@typescript-eslint/type-utils":"7.18.0","@typescript-eslint/utils":"7.18.0","ts-api-utils":"^1.3.0"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^5.5.0","@checkdigit/typescript-config":"6.0.0","@types/eslint":"^8.56.10","@typescript-eslint/eslint-plugin":"^7.18.0","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/rule-tester":"7.18.0","eslint-config-prettier":"^9.1.0","eslint-plugin-eslint-plugin":"^6.2.0","eslint-plugin-import":"^2.29.1","eslint-plugin-no-only-tests":"^3.1.0","eslint-plugin-no-secrets":"^1.0.2","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"0.24.0"},"peerDependencies":{"eslint":">=8 <9"},"engines":{"node":">=20.14"}}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// fixture/fetch-response-body-json.ts
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Copyright (c) 2021-2024 Check Digit, LLC
|
|
5
|
+
*
|
|
6
|
+
* This code is licensed under the MIT license (see LICENSE.txt for details).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { ESLintUtils, TSESTree } from '@typescript-eslint/utils';
|
|
10
|
+
import getDocumentationUrl from '../get-documentation-url';
|
|
11
|
+
|
|
12
|
+
export const ruleId = 'fetch-response-body-json';
|
|
13
|
+
|
|
14
|
+
const createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
|
|
15
|
+
|
|
16
|
+
const rule = createRule({
|
|
17
|
+
name: ruleId,
|
|
18
|
+
meta: {
|
|
19
|
+
type: 'suggestion',
|
|
20
|
+
docs: {
|
|
21
|
+
description: 'Replace "response.body" with "await response.json()".',
|
|
22
|
+
},
|
|
23
|
+
messages: {
|
|
24
|
+
replaceBodyWithJson: 'Replace "response.body" with "await response.json()".',
|
|
25
|
+
unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.',
|
|
26
|
+
},
|
|
27
|
+
fixable: 'code',
|
|
28
|
+
schema: [],
|
|
29
|
+
},
|
|
30
|
+
defaultOptions: [],
|
|
31
|
+
create(context) {
|
|
32
|
+
const parserServices = ESLintUtils.getParserServices(context);
|
|
33
|
+
const typeChecker = parserServices.program.getTypeChecker();
|
|
34
|
+
const sourceCode = context.sourceCode;
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
'MemberExpression[property.name="body"]': (responseBody: TSESTree.MemberExpression) => {
|
|
38
|
+
try {
|
|
39
|
+
const responseNode = parserServices.esTreeNodeToTSNodeMap.get(responseBody.object);
|
|
40
|
+
const responseType = typeChecker.getTypeAtLocation(responseNode);
|
|
41
|
+
|
|
42
|
+
const shouldReplace =
|
|
43
|
+
responseType.getProperties().some((symbol) => symbol.name === 'body') &&
|
|
44
|
+
responseType.getProperties().some((symbol) => symbol.name === 'json');
|
|
45
|
+
|
|
46
|
+
if (shouldReplace) {
|
|
47
|
+
const responseText = sourceCode.getText(responseBody.object);
|
|
48
|
+
context.report({
|
|
49
|
+
messageId: 'replaceBodyWithJson',
|
|
50
|
+
node: responseBody,
|
|
51
|
+
fix(fixer) {
|
|
52
|
+
return fixer.replaceText(responseBody, `(await ${responseText}.json())`);
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
} catch (error) {
|
|
57
|
+
// eslint-disable-next-line no-console
|
|
58
|
+
console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
|
|
59
|
+
context.report({
|
|
60
|
+
node: responseBody,
|
|
61
|
+
messageId: 'unknownError',
|
|
62
|
+
data: {
|
|
63
|
+
fileName: context.filename,
|
|
64
|
+
error: error instanceof Error ? error.toString() : JSON.stringify(error),
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
export default rule;
|
|
@@ -36,21 +36,12 @@ const rule = createRule({
|
|
|
36
36
|
schema: [],
|
|
37
37
|
},
|
|
38
38
|
defaultOptions: [],
|
|
39
|
-
// eslint-disable-next-line max-lines-per-function
|
|
40
39
|
create(context) {
|
|
41
40
|
const sourceCode = context.sourceCode;
|
|
42
41
|
const scopeManager = sourceCode.scopeManager;
|
|
43
42
|
const parserService = ESLintUtils.getParserServices(context);
|
|
44
43
|
const typeChecker = parserService.program.getTypeChecker();
|
|
45
44
|
|
|
46
|
-
// function reportUnknownError(node: TSESTree.Node, error: string) {
|
|
47
|
-
// context.report({
|
|
48
|
-
// node,
|
|
49
|
-
// messageId: 'unknownError',
|
|
50
|
-
// data: { error, fileName: context.filename },
|
|
51
|
-
// });
|
|
52
|
-
// }
|
|
53
|
-
|
|
54
45
|
function isUrlArgumentValid(urlArgument: TSESTree.Node | undefined, scope: Scope) {
|
|
55
46
|
if (
|
|
56
47
|
(urlArgument?.type === AST_NODE_TYPES.Literal && typeof urlArgument.value === 'string') ||
|
|
@@ -62,13 +53,14 @@ const rule = createRule({
|
|
|
62
53
|
|
|
63
54
|
if (urlArgument?.type === AST_NODE_TYPES.Identifier) {
|
|
64
55
|
const foundVariable = scope.variables.find((variable) => variable.name === urlArgument.name);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
56
|
+
if (foundVariable) {
|
|
57
|
+
const variableDefinition = foundVariable.defs.find((def) => def.type === DefinitionType.Variable);
|
|
58
|
+
assert.ok(variableDefinition, `Variable "${urlArgument.name}" not defined in scope`);
|
|
59
|
+
const variableDefinitionNode = variableDefinition.node;
|
|
60
|
+
assert.ok(variableDefinitionNode.type === AST_NODE_TYPES.VariableDeclarator);
|
|
61
|
+
assert.ok(variableDefinitionNode.init, 'Variable definition node has no init property');
|
|
62
|
+
return isUrlArgumentValid(variableDefinitionNode.init, scope);
|
|
63
|
+
}
|
|
72
64
|
}
|
|
73
65
|
|
|
74
66
|
return false;
|
|
@@ -21,14 +21,13 @@ const rule = createRule({
|
|
|
21
21
|
description: 'Access the status code property of the fetch Response using "status" instead of "statusCode".',
|
|
22
22
|
},
|
|
23
23
|
messages: {
|
|
24
|
-
replaceStatusCode: '
|
|
24
|
+
replaceStatusCode: 'Replace "statusCode" with "status".',
|
|
25
25
|
unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.',
|
|
26
26
|
},
|
|
27
27
|
fixable: 'code',
|
|
28
28
|
schema: [],
|
|
29
29
|
},
|
|
30
30
|
defaultOptions: [],
|
|
31
|
-
// eslint-disable-next-line max-lines-per-function
|
|
32
31
|
create(context) {
|
|
33
32
|
const parserServices = ESLintUtils.getParserServices(context);
|
|
34
33
|
const typeChecker = parserServices.program.getTypeChecker();
|
package/src/index.ts
CHANGED
|
@@ -7,11 +7,13 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import fetchHeaderGetter, { ruleId as fetchHeaderGetterRuleId } from './fixture/fetch-header-getter';
|
|
10
|
+
import fetchResponseBodyJson, { ruleId as fetchResponseBodyJsonRuleId } from './fixture/fetch-response-body-json';
|
|
10
11
|
import fetchThen, { ruleId as fetchThenRuleId } from './fixture/fetch-then';
|
|
11
12
|
import invalidJsonStringify, { ruleId as invalidJsonStringifyRuleId } from './invalid-json-stringify';
|
|
12
13
|
import noFixture, { ruleId as noFixtureRuleId } from './fixture/no-fixture';
|
|
13
14
|
import noPromiseInstanceMethod, { ruleId as noPromiseInstanceMethodRuleId } from './no-promise-instance-method';
|
|
14
15
|
import noServiceWrapper, { ruleId as noServiceWrapperRuleId } from './fixture/no-service-wrapper';
|
|
16
|
+
import noStatusCode, { ruleId as noStatusCodeRuleId } from './fixture/no-status-code';
|
|
15
17
|
import filePathComment from './file-path-comment';
|
|
16
18
|
import noCardNumbers from './no-card-numbers';
|
|
17
19
|
import noTestImport from './no-test-import';
|
|
@@ -39,6 +41,8 @@ export default {
|
|
|
39
41
|
[fetchHeaderGetterRuleId]: fetchHeaderGetter,
|
|
40
42
|
[fetchThenRuleId]: fetchThen,
|
|
41
43
|
[noServiceWrapperRuleId]: noServiceWrapper,
|
|
44
|
+
[noStatusCodeRuleId]: noStatusCode,
|
|
45
|
+
[fetchResponseBodyJsonRuleId]: fetchResponseBodyJson,
|
|
42
46
|
},
|
|
43
47
|
configs: {
|
|
44
48
|
all: {
|
|
@@ -58,6 +62,8 @@ export default {
|
|
|
58
62
|
[`@checkdigit/${fetchHeaderGetterRuleId}`]: 'error',
|
|
59
63
|
[`@checkdigit/${fetchThenRuleId}`]: 'error',
|
|
60
64
|
[`@checkdigit/${noServiceWrapperRuleId}`]: 'error',
|
|
65
|
+
[`@checkdigit/${noStatusCodeRuleId}`]: 'error',
|
|
66
|
+
[`@checkdigit/${fetchResponseBodyJsonRuleId}`]: 'error',
|
|
61
67
|
},
|
|
62
68
|
},
|
|
63
69
|
recommended: {
|