@checkdigit/eslint-plugin 6.6.0-PR.75-f33d → 6.6.0-PR.75-9891
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 +798 -640
- package/dist-cjs/metafile.json +192 -65
- package/dist-mjs/ast/tree.mjs +2 -2
- package/dist-mjs/fixture/concurrent-promises.mjs +191 -0
- package/dist-mjs/fixture/fetch-header-getter.mjs +64 -0
- package/dist-mjs/fixture/fetch.mjs +8 -0
- package/dist-mjs/fixture/no-fixture.mjs +315 -0
- package/dist-mjs/fixture/response-reference.mjs +56 -0
- package/dist-mjs/fixture/url.mjs +8 -0
- package/dist-mjs/fixture/variable.mjs +8 -0
- package/dist-mjs/index.mjs +8 -5
- package/dist-types/{no-fixture-headers.d.ts → fixture/concurrent-promises.d.ts} +1 -1
- package/dist-types/fixture/fetch-header-getter.d.ts +4 -0
- package/dist-types/fixture/fetch.d.ts +1 -0
- package/dist-types/fixture/response-reference.d.ts +16 -0
- package/dist-types/fixture/url.d.ts +1 -0
- package/dist-types/fixture/variable.d.ts +1 -0
- package/dist-types/index.d.ts +4 -2
- package/package.json +1 -1
- package/src/ast/tree.ts +1 -1
- package/src/fixture/concurrent-promises.ts +242 -0
- package/src/fixture/fetch-header-getter.ts +90 -0
- package/src/fixture/fetch.ts +5 -0
- package/src/{no-fixture.ts → fixture/no-fixture.ts} +11 -125
- package/src/fixture/response-reference.ts +108 -0
- package/src/fixture/url.ts +6 -0
- package/src/fixture/variable.ts +5 -0
- package/src/index.ts +7 -4
- package/dist-mjs/no-fixture-headers.mjs +0 -98
- package/dist-mjs/no-fixture.mjs +0 -369
- package/src/no-fixture-headers.ts +0 -134
- /package/dist-types/{no-fixture.d.ts → fixture/no-fixture.d.ts} +0 -0
package/dist-cjs/metafile.json
CHANGED
|
@@ -1,38 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"inputs": {
|
|
3
|
-
"package.json": {
|
|
4
|
-
"bytes": 2685,
|
|
5
|
-
"imports": [],
|
|
6
|
-
"format": "esm",
|
|
7
|
-
"with": {
|
|
8
|
-
"type": "json"
|
|
9
|
-
}
|
|
10
|
-
},
|
|
11
|
-
"src/get-documentation-url.ts": {
|
|
12
|
-
"bytes": 262,
|
|
13
|
-
"imports": [
|
|
14
|
-
{
|
|
15
|
-
"path": "package.json",
|
|
16
|
-
"kind": "import-statement",
|
|
17
|
-
"original": "../package.json",
|
|
18
|
-
"with": {
|
|
19
|
-
"type": "json"
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
],
|
|
23
|
-
"format": "esm"
|
|
24
|
-
},
|
|
25
|
-
"src/invalid-json-stringify.ts": {
|
|
26
|
-
"bytes": 2840,
|
|
27
|
-
"imports": [
|
|
28
|
-
{
|
|
29
|
-
"path": "src/get-documentation-url.ts",
|
|
30
|
-
"kind": "import-statement",
|
|
31
|
-
"original": "./get-documentation-url"
|
|
32
|
-
}
|
|
33
|
-
],
|
|
34
|
-
"format": "esm"
|
|
35
|
-
},
|
|
36
3
|
"node_modules/eslint/conf/default-cli-options.js": {
|
|
37
4
|
"bytes": 791,
|
|
38
5
|
"imports": [],
|
|
@@ -8177,9 +8144,26 @@
|
|
|
8177
8144
|
],
|
|
8178
8145
|
"format": "cjs"
|
|
8179
8146
|
},
|
|
8180
|
-
"
|
|
8181
|
-
"bytes":
|
|
8147
|
+
"package.json": {
|
|
8148
|
+
"bytes": 2685,
|
|
8182
8149
|
"imports": [],
|
|
8150
|
+
"format": "esm",
|
|
8151
|
+
"with": {
|
|
8152
|
+
"type": "json"
|
|
8153
|
+
}
|
|
8154
|
+
},
|
|
8155
|
+
"src/get-documentation-url.ts": {
|
|
8156
|
+
"bytes": 262,
|
|
8157
|
+
"imports": [
|
|
8158
|
+
{
|
|
8159
|
+
"path": "package.json",
|
|
8160
|
+
"kind": "import-statement",
|
|
8161
|
+
"original": "../package.json",
|
|
8162
|
+
"with": {
|
|
8163
|
+
"type": "json"
|
|
8164
|
+
}
|
|
8165
|
+
}
|
|
8166
|
+
],
|
|
8183
8167
|
"format": "esm"
|
|
8184
8168
|
},
|
|
8185
8169
|
"src/ast/format.ts": {
|
|
@@ -8193,18 +8177,90 @@
|
|
|
8193
8177
|
],
|
|
8194
8178
|
"format": "esm"
|
|
8195
8179
|
},
|
|
8196
|
-
"src/
|
|
8197
|
-
"bytes":
|
|
8180
|
+
"src/ast/tree.ts": {
|
|
8181
|
+
"bytes": 1494,
|
|
8182
|
+
"imports": [],
|
|
8183
|
+
"format": "esm"
|
|
8184
|
+
},
|
|
8185
|
+
"src/fixture/variable.ts": {
|
|
8186
|
+
"bytes": 158,
|
|
8187
|
+
"imports": [],
|
|
8188
|
+
"format": "esm"
|
|
8189
|
+
},
|
|
8190
|
+
"src/fixture/url.ts": {
|
|
8191
|
+
"bytes": 221,
|
|
8192
|
+
"imports": [],
|
|
8193
|
+
"format": "esm"
|
|
8194
|
+
},
|
|
8195
|
+
"src/fixture/concurrent-promises.ts": {
|
|
8196
|
+
"bytes": 10578,
|
|
8198
8197
|
"imports": [
|
|
8199
8198
|
{
|
|
8200
8199
|
"path": "node_modules/eslint/lib/api.js",
|
|
8201
8200
|
"kind": "import-statement",
|
|
8202
8201
|
"original": "eslint"
|
|
8203
8202
|
},
|
|
8203
|
+
{
|
|
8204
|
+
"path": "node:assert",
|
|
8205
|
+
"kind": "import-statement",
|
|
8206
|
+
"external": true
|
|
8207
|
+
},
|
|
8208
|
+
{
|
|
8209
|
+
"path": "src/get-documentation-url.ts",
|
|
8210
|
+
"kind": "import-statement",
|
|
8211
|
+
"original": "../get-documentation-url"
|
|
8212
|
+
},
|
|
8213
|
+
{
|
|
8214
|
+
"path": "src/ast/format.ts",
|
|
8215
|
+
"kind": "import-statement",
|
|
8216
|
+
"original": "../ast/format"
|
|
8217
|
+
},
|
|
8204
8218
|
{
|
|
8205
8219
|
"path": "src/ast/tree.ts",
|
|
8206
8220
|
"kind": "import-statement",
|
|
8207
|
-
"original": "
|
|
8221
|
+
"original": "../ast/tree"
|
|
8222
|
+
},
|
|
8223
|
+
{
|
|
8224
|
+
"path": "src/fixture/variable.ts",
|
|
8225
|
+
"kind": "import-statement",
|
|
8226
|
+
"original": "./variable"
|
|
8227
|
+
},
|
|
8228
|
+
{
|
|
8229
|
+
"path": "src/fixture/url.ts",
|
|
8230
|
+
"kind": "import-statement",
|
|
8231
|
+
"original": "./url"
|
|
8232
|
+
}
|
|
8233
|
+
],
|
|
8234
|
+
"format": "esm"
|
|
8235
|
+
},
|
|
8236
|
+
"src/fixture/response-reference.ts": {
|
|
8237
|
+
"bytes": 4197,
|
|
8238
|
+
"imports": [
|
|
8239
|
+
{
|
|
8240
|
+
"path": "node_modules/eslint/lib/api.js",
|
|
8241
|
+
"kind": "import-statement",
|
|
8242
|
+
"original": "eslint"
|
|
8243
|
+
},
|
|
8244
|
+
{
|
|
8245
|
+
"path": "node:assert",
|
|
8246
|
+
"kind": "import-statement",
|
|
8247
|
+
"external": true
|
|
8248
|
+
},
|
|
8249
|
+
{
|
|
8250
|
+
"path": "src/ast/tree.ts",
|
|
8251
|
+
"kind": "import-statement",
|
|
8252
|
+
"original": "../ast/tree"
|
|
8253
|
+
}
|
|
8254
|
+
],
|
|
8255
|
+
"format": "esm"
|
|
8256
|
+
},
|
|
8257
|
+
"src/fixture/fetch-header-getter.ts": {
|
|
8258
|
+
"bytes": 3414,
|
|
8259
|
+
"imports": [
|
|
8260
|
+
{
|
|
8261
|
+
"path": "src/fixture/response-reference.ts",
|
|
8262
|
+
"kind": "import-statement",
|
|
8263
|
+
"original": "./response-reference"
|
|
8208
8264
|
},
|
|
8209
8265
|
{
|
|
8210
8266
|
"path": "node:assert",
|
|
@@ -8214,29 +8270,50 @@
|
|
|
8214
8270
|
{
|
|
8215
8271
|
"path": "src/get-documentation-url.ts",
|
|
8216
8272
|
"kind": "import-statement",
|
|
8217
|
-
"original": "
|
|
8273
|
+
"original": "../get-documentation-url"
|
|
8218
8274
|
},
|
|
8219
8275
|
{
|
|
8220
|
-
"path": "src/ast/
|
|
8276
|
+
"path": "src/ast/tree.ts",
|
|
8221
8277
|
"kind": "import-statement",
|
|
8222
|
-
"original": "
|
|
8278
|
+
"original": "../ast/tree"
|
|
8223
8279
|
}
|
|
8224
8280
|
],
|
|
8225
8281
|
"format": "esm"
|
|
8226
8282
|
},
|
|
8227
|
-
"src/
|
|
8228
|
-
"bytes":
|
|
8283
|
+
"src/invalid-json-stringify.ts": {
|
|
8284
|
+
"bytes": 2840,
|
|
8229
8285
|
"imports": [
|
|
8230
8286
|
{
|
|
8231
|
-
"path": "src/
|
|
8287
|
+
"path": "src/get-documentation-url.ts",
|
|
8232
8288
|
"kind": "import-statement",
|
|
8233
|
-
"original": "./
|
|
8234
|
-
}
|
|
8289
|
+
"original": "./get-documentation-url"
|
|
8290
|
+
}
|
|
8291
|
+
],
|
|
8292
|
+
"format": "esm"
|
|
8293
|
+
},
|
|
8294
|
+
"src/fixture/fetch.ts": {
|
|
8295
|
+
"bytes": 149,
|
|
8296
|
+
"imports": [],
|
|
8297
|
+
"format": "esm"
|
|
8298
|
+
},
|
|
8299
|
+
"src/fixture/no-fixture.ts": {
|
|
8300
|
+
"bytes": 19159,
|
|
8301
|
+
"imports": [
|
|
8235
8302
|
{
|
|
8236
8303
|
"path": "node_modules/eslint/lib/api.js",
|
|
8237
8304
|
"kind": "import-statement",
|
|
8238
8305
|
"original": "eslint"
|
|
8239
8306
|
},
|
|
8307
|
+
{
|
|
8308
|
+
"path": "src/ast/tree.ts",
|
|
8309
|
+
"kind": "import-statement",
|
|
8310
|
+
"original": "../ast/tree"
|
|
8311
|
+
},
|
|
8312
|
+
{
|
|
8313
|
+
"path": "src/fixture/response-reference.ts",
|
|
8314
|
+
"kind": "import-statement",
|
|
8315
|
+
"original": "./response-reference"
|
|
8316
|
+
},
|
|
8240
8317
|
{
|
|
8241
8318
|
"path": "node:assert",
|
|
8242
8319
|
"kind": "import-statement",
|
|
@@ -8245,7 +8322,27 @@
|
|
|
8245
8322
|
{
|
|
8246
8323
|
"path": "src/get-documentation-url.ts",
|
|
8247
8324
|
"kind": "import-statement",
|
|
8248
|
-
"original": "
|
|
8325
|
+
"original": "../get-documentation-url"
|
|
8326
|
+
},
|
|
8327
|
+
{
|
|
8328
|
+
"path": "src/ast/format.ts",
|
|
8329
|
+
"kind": "import-statement",
|
|
8330
|
+
"original": "../ast/format"
|
|
8331
|
+
},
|
|
8332
|
+
{
|
|
8333
|
+
"path": "src/fixture/fetch.ts",
|
|
8334
|
+
"kind": "import-statement",
|
|
8335
|
+
"original": "./fetch"
|
|
8336
|
+
},
|
|
8337
|
+
{
|
|
8338
|
+
"path": "src/fixture/variable.ts",
|
|
8339
|
+
"kind": "import-statement",
|
|
8340
|
+
"original": "./variable"
|
|
8341
|
+
},
|
|
8342
|
+
{
|
|
8343
|
+
"path": "src/fixture/url.ts",
|
|
8344
|
+
"kind": "import-statement",
|
|
8345
|
+
"original": "./url"
|
|
8249
8346
|
}
|
|
8250
8347
|
],
|
|
8251
8348
|
"format": "esm"
|
|
@@ -8307,22 +8404,27 @@
|
|
|
8307
8404
|
"format": "esm"
|
|
8308
8405
|
},
|
|
8309
8406
|
"src/index.ts": {
|
|
8310
|
-
"bytes":
|
|
8407
|
+
"bytes": 3353,
|
|
8311
8408
|
"imports": [
|
|
8312
8409
|
{
|
|
8313
|
-
"path": "src/
|
|
8410
|
+
"path": "src/fixture/concurrent-promises.ts",
|
|
8314
8411
|
"kind": "import-statement",
|
|
8315
|
-
"original": "./
|
|
8412
|
+
"original": "./fixture/concurrent-promises"
|
|
8316
8413
|
},
|
|
8317
8414
|
{
|
|
8318
|
-
"path": "src/
|
|
8415
|
+
"path": "src/fixture/fetch-header-getter.ts",
|
|
8319
8416
|
"kind": "import-statement",
|
|
8320
|
-
"original": "./
|
|
8417
|
+
"original": "./fixture/fetch-header-getter"
|
|
8418
|
+
},
|
|
8419
|
+
{
|
|
8420
|
+
"path": "src/invalid-json-stringify.ts",
|
|
8421
|
+
"kind": "import-statement",
|
|
8422
|
+
"original": "./invalid-json-stringify"
|
|
8321
8423
|
},
|
|
8322
8424
|
{
|
|
8323
|
-
"path": "src/no-fixture
|
|
8425
|
+
"path": "src/fixture/no-fixture.ts",
|
|
8324
8426
|
"kind": "import-statement",
|
|
8325
|
-
"original": "./no-fixture
|
|
8427
|
+
"original": "./fixture/no-fixture"
|
|
8326
8428
|
},
|
|
8327
8429
|
{
|
|
8328
8430
|
"path": "src/no-promise-instance-method.ts",
|
|
@@ -8876,6 +8978,16 @@
|
|
|
8876
8978
|
"kind": "require-call",
|
|
8877
8979
|
"external": true
|
|
8878
8980
|
},
|
|
8981
|
+
{
|
|
8982
|
+
"path": "node:assert",
|
|
8983
|
+
"kind": "require-call",
|
|
8984
|
+
"external": true
|
|
8985
|
+
},
|
|
8986
|
+
{
|
|
8987
|
+
"path": "node:assert",
|
|
8988
|
+
"kind": "require-call",
|
|
8989
|
+
"external": true
|
|
8990
|
+
},
|
|
8879
8991
|
{
|
|
8880
8992
|
"path": "node:assert",
|
|
8881
8993
|
"kind": "require-call",
|
|
@@ -10527,7 +10639,7 @@
|
|
|
10527
10639
|
"bytesInOutput": 772
|
|
10528
10640
|
},
|
|
10529
10641
|
"src/index.ts": {
|
|
10530
|
-
"bytesInOutput":
|
|
10642
|
+
"bytesInOutput": 2271
|
|
10531
10643
|
},
|
|
10532
10644
|
"package.json": {
|
|
10533
10645
|
"bytesInOutput": 2774
|
|
@@ -10535,20 +10647,35 @@
|
|
|
10535
10647
|
"src/get-documentation-url.ts": {
|
|
10536
10648
|
"bytesInOutput": 146
|
|
10537
10649
|
},
|
|
10538
|
-
"src/
|
|
10539
|
-
"bytesInOutput":
|
|
10650
|
+
"src/ast/format.ts": {
|
|
10651
|
+
"bytesInOutput": 331
|
|
10540
10652
|
},
|
|
10541
10653
|
"src/ast/tree.ts": {
|
|
10542
|
-
"bytesInOutput":
|
|
10654
|
+
"bytesInOutput": 981
|
|
10543
10655
|
},
|
|
10544
|
-
"src/
|
|
10545
|
-
"bytesInOutput":
|
|
10656
|
+
"src/fixture/variable.ts": {
|
|
10657
|
+
"bytesInOutput": 118
|
|
10658
|
+
},
|
|
10659
|
+
"src/fixture/url.ts": {
|
|
10660
|
+
"bytesInOutput": 129
|
|
10661
|
+
},
|
|
10662
|
+
"src/fixture/concurrent-promises.ts": {
|
|
10663
|
+
"bytesInOutput": 8763
|
|
10664
|
+
},
|
|
10665
|
+
"src/fixture/response-reference.ts": {
|
|
10666
|
+
"bytesInOutput": 2776
|
|
10667
|
+
},
|
|
10668
|
+
"src/fixture/fetch-header-getter.ts": {
|
|
10669
|
+
"bytesInOutput": 2693
|
|
10670
|
+
},
|
|
10671
|
+
"src/invalid-json-stringify.ts": {
|
|
10672
|
+
"bytesInOutput": 2473
|
|
10546
10673
|
},
|
|
10547
|
-
"src/
|
|
10548
|
-
"bytesInOutput":
|
|
10674
|
+
"src/fixture/fetch.ts": {
|
|
10675
|
+
"bytesInOutput": 113
|
|
10549
10676
|
},
|
|
10550
|
-
"src/no-fixture
|
|
10551
|
-
"bytesInOutput":
|
|
10677
|
+
"src/fixture/no-fixture.ts": {
|
|
10678
|
+
"bytesInOutput": 16123
|
|
10552
10679
|
},
|
|
10553
10680
|
"src/no-promise-instance-method.ts": {
|
|
10554
10681
|
"bytesInOutput": 1275
|
|
@@ -10581,7 +10708,7 @@
|
|
|
10581
10708
|
"bytesInOutput": 3362
|
|
10582
10709
|
}
|
|
10583
10710
|
},
|
|
10584
|
-
"bytes":
|
|
10711
|
+
"bytes": 3844761
|
|
10585
10712
|
}
|
|
10586
10713
|
}
|
|
10587
10714
|
}
|
package/dist-mjs/ast/tree.mjs
CHANGED
|
@@ -26,7 +26,7 @@ function getEnclosingStatement(node) {
|
|
|
26
26
|
function getEnclosingScopeNode(node) {
|
|
27
27
|
return getAncestor(
|
|
28
28
|
node,
|
|
29
|
-
(parentNode) => ["FunctionExpression", "FunctionDeclaration", "ArrowFunctionExpression"].includes(parentNode.type)
|
|
29
|
+
(parentNode) => ["FunctionExpression", "FunctionDeclaration", "ArrowFunctionExpression", "Program"].includes(parentNode.type)
|
|
30
30
|
);
|
|
31
31
|
}
|
|
32
32
|
export {
|
|
@@ -35,4 +35,4 @@ export {
|
|
|
35
35
|
getEnclosingStatement,
|
|
36
36
|
getParent
|
|
37
37
|
};
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FzdC90cmVlLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQWdCTyxTQUFTLFVBQVUsTUFBcUM7QUFDN0QsU0FBUSxLQUF3QztBQUNsRDtBQUVPLFNBQVMsWUFDZCxNQUNBLFNBQ0EsYUFDa0I7QUFDbEIsUUFBTSxTQUFTLFVBQVUsSUFBSTtBQUM3QixNQUFJLENBQUMsUUFBUTtBQUNYLFdBQU87QUFBQSxFQUNULFdBQVcsT0FBTyxZQUFZLFlBQVksT0FBTyxTQUFTLFNBQVM7QUFDakUsV0FBTztBQUFBLEVBQ1QsV0FBVyxPQUFPLFlBQVksY0FBYyxRQUFRLE1BQU0sR0FBRztBQUMzRCxXQUFPO0FBQUEsRUFDVCxXQUFXLE9BQU8sZ0JBQWdCLFlBQVksT0FBTyxTQUFTLGFBQWE7QUFDekUsV0FBTztBQUFBLEVBQ1QsV0FBVyxPQUFPLGdCQUFnQixjQUFjLFlBQVksTUFBTSxHQUFHO0FBQ25FLFdBQU87QUFBQSxFQUNUO0FBQ0EsU0FBTyxZQUFZLFFBQVEsU0FBUyxXQUFXO0FBQ2pEO0FBRU8sU0FBUyxzQkFBc0IsTUFBWTtBQUNoRCxTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0EsQ0FBQyxlQUFlLFdBQVcsS0FBSyxTQUFTLFdBQVcsS0FBSyxXQUFXLEtBQUssU0FBUyxhQUFhO0FBQUEsRUFDakc7QUFDRjtBQUVPLFNBQVMsc0JBQXNCLE1BQVk7QUFDaEQsU0FBTztBQUFBLElBQVk7QUFBQSxJQUFNLENBQUMsZUFDeEIsQ0FBQyxzQkFBc0IsdUJBQXVCLDJCQUEyQixTQUFTLEVBQUUsU0FBUyxXQUFXLElBQUk7QUFBQSxFQUM5RztBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// src/fixture/concurrent-promises.ts
|
|
2
|
+
import "eslint";
|
|
3
|
+
import { strict as assert } from "node:assert";
|
|
4
|
+
import getDocumentationUrl from "../get-documentation-url.mjs";
|
|
5
|
+
import { getIndentation } from "../ast/format.mjs";
|
|
6
|
+
import { getParent } from "../ast/tree.mjs";
|
|
7
|
+
import { isValidPropertyName } from "./variable.mjs";
|
|
8
|
+
import { replaceEndpointUrlPrefixWithBasePath } from "./url.mjs";
|
|
9
|
+
var ruleId = "concurrent-promises";
|
|
10
|
+
function analyzeFixtureCall(call, results, sourceCode) {
|
|
11
|
+
const parent = getParent(call);
|
|
12
|
+
if (!parent) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
let nextCall;
|
|
16
|
+
if (parent.type === "ArrayExpression") {
|
|
17
|
+
results.fixtureNode = call;
|
|
18
|
+
} else if (parent.type === "MemberExpression" && parent.property.type === "Identifier") {
|
|
19
|
+
if (parent.property.name === "expect") {
|
|
20
|
+
const assertionCall = getParent(parent);
|
|
21
|
+
assert.ok(assertionCall && assertionCall.type === "CallExpression");
|
|
22
|
+
results.assertions = [...results.assertions ?? [], assertionCall.arguments];
|
|
23
|
+
nextCall = assertionCall;
|
|
24
|
+
} else if (parent.property.name === "send") {
|
|
25
|
+
const sendRequestBodyCall = getParent(parent);
|
|
26
|
+
assert.ok(sendRequestBodyCall && sendRequestBodyCall.type === "CallExpression");
|
|
27
|
+
results.requestBody = sendRequestBodyCall.arguments[0];
|
|
28
|
+
nextCall = sendRequestBodyCall;
|
|
29
|
+
} else if (parent.property.name === "set") {
|
|
30
|
+
const setRequestHeaderCall = getParent(parent);
|
|
31
|
+
assert.ok(setRequestHeaderCall && setRequestHeaderCall.type === "CallExpression");
|
|
32
|
+
const [name, value] = setRequestHeaderCall.arguments;
|
|
33
|
+
results.requestHeaders = [...results.requestHeaders ?? [], { name, value }];
|
|
34
|
+
nextCall = setRequestHeaderCall;
|
|
35
|
+
}
|
|
36
|
+
} else {
|
|
37
|
+
throw new Error(`Unexpected expression in fixture/supertest call ${sourceCode.getText(parent)}.`);
|
|
38
|
+
}
|
|
39
|
+
if (nextCall) {
|
|
40
|
+
analyzeFixtureCall(nextCall, results, sourceCode);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function createResponseAssertions(fixtureCallInformation, sourceCode, responseVariableName) {
|
|
44
|
+
let statusAssertion;
|
|
45
|
+
const nonStatusAssertions = [];
|
|
46
|
+
for (const expectArguments of fixtureCallInformation.assertions ?? []) {
|
|
47
|
+
if (expectArguments.length === 1) {
|
|
48
|
+
const [assertionArgument] = expectArguments;
|
|
49
|
+
assert.ok(assertionArgument);
|
|
50
|
+
if (assertionArgument.type === "MemberExpression" && assertionArgument.object.type === "Identifier" && assertionArgument.object.name === "StatusCodes" || assertionArgument.type === "Literal" || sourceCode.getText(assertionArgument).includes("StatusCodes.")) {
|
|
51
|
+
statusAssertion = `assert.equal(${responseVariableName}.status, ${sourceCode.getText(assertionArgument)})`;
|
|
52
|
+
} else if (assertionArgument.type === "ArrowFunctionExpression") {
|
|
53
|
+
let functionBody = sourceCode.getText(assertionArgument.body);
|
|
54
|
+
const [originalResponseArgument] = assertionArgument.params;
|
|
55
|
+
assert.ok(originalResponseArgument?.type === "Identifier");
|
|
56
|
+
const originalResponseArgumentName = originalResponseArgument.name;
|
|
57
|
+
if (originalResponseArgumentName !== responseVariableName) {
|
|
58
|
+
functionBody = functionBody.replace(
|
|
59
|
+
new RegExp(`\\b${originalResponseArgumentName}\\b`, "ug"),
|
|
60
|
+
responseVariableName
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
nonStatusAssertions.push(`assert.ok(${functionBody})`);
|
|
64
|
+
} else if (assertionArgument.type === "Identifier") {
|
|
65
|
+
nonStatusAssertions.push(`assert.ok(${sourceCode.getText(assertionArgument)}(${responseVariableName}))`);
|
|
66
|
+
} else if (assertionArgument.type === "ObjectExpression" || assertionArgument.type === "CallExpression") {
|
|
67
|
+
nonStatusAssertions.push(
|
|
68
|
+
`assert.deepEqual(await ${responseVariableName}.json(), ${sourceCode.getText(assertionArgument)})`
|
|
69
|
+
);
|
|
70
|
+
} else {
|
|
71
|
+
throw new Error(`Unexpected Supertest assertion argument: ".expect(${sourceCode.getText(assertionArgument)})`);
|
|
72
|
+
}
|
|
73
|
+
} else if (expectArguments.length === 2) {
|
|
74
|
+
const [headerName, headerValue] = expectArguments;
|
|
75
|
+
assert.ok(headerName && headerValue);
|
|
76
|
+
const headersReference = `${responseVariableName}.headers`;
|
|
77
|
+
if (headerValue.type === "Literal" && headerValue.value instanceof RegExp) {
|
|
78
|
+
nonStatusAssertions.push(
|
|
79
|
+
`assert.ok(${headersReference}.get(${sourceCode.getText(headerName)}).match(${sourceCode.getText(headerValue)}))`
|
|
80
|
+
);
|
|
81
|
+
} else {
|
|
82
|
+
nonStatusAssertions.push(
|
|
83
|
+
`assert.equal(${headersReference}.get(${sourceCode.getText(headerName)}), ${sourceCode.getText(headerValue)})`
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
statusAssertion,
|
|
90
|
+
nonStatusAssertions
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
var rule = {
|
|
94
|
+
meta: {
|
|
95
|
+
type: "suggestion",
|
|
96
|
+
docs: {
|
|
97
|
+
description: "Prefer native fetch API over customized fixture API.",
|
|
98
|
+
url: getDocumentationUrl(ruleId)
|
|
99
|
+
},
|
|
100
|
+
messages: {
|
|
101
|
+
preferNativeFetch: "Prefer native fetch API over customized fixture API.",
|
|
102
|
+
unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}. Please manually convert the fixture API call to fetch API call.'
|
|
103
|
+
},
|
|
104
|
+
fixable: "code",
|
|
105
|
+
schema: []
|
|
106
|
+
},
|
|
107
|
+
// eslint-disable-next-line max-lines-per-function
|
|
108
|
+
create(context) {
|
|
109
|
+
const sourceCode = context.sourceCode;
|
|
110
|
+
return {
|
|
111
|
+
// eslint-disable-next-line max-lines-per-function
|
|
112
|
+
'CallExpression[callee.object.name="Promise"] > ArrayExpression CallExpression[callee.object.object.name="fixture"][callee.object.property.name="api"]': (fixtureCall) => {
|
|
113
|
+
try {
|
|
114
|
+
assert.ok(fixtureCall.type === "CallExpression");
|
|
115
|
+
const fixtureFunction = fixtureCall.callee;
|
|
116
|
+
assert.ok(fixtureFunction.type === "MemberExpression");
|
|
117
|
+
const indentation = getIndentation(fixtureCall, sourceCode);
|
|
118
|
+
const [urlArgumentNode] = fixtureCall.arguments;
|
|
119
|
+
assert.ok(urlArgumentNode !== void 0);
|
|
120
|
+
const fixtureCallInformation = {};
|
|
121
|
+
analyzeFixtureCall(fixtureCall, fixtureCallInformation, sourceCode);
|
|
122
|
+
const originalUrlArgumentText = sourceCode.getText(urlArgumentNode);
|
|
123
|
+
const fetchUrlArgumentText = replaceEndpointUrlPrefixWithBasePath(originalUrlArgumentText);
|
|
124
|
+
const methodNode = fixtureFunction.property;
|
|
125
|
+
assert.ok(methodNode.type === "Identifier");
|
|
126
|
+
const fetchRequestArgumentLines = [
|
|
127
|
+
"{",
|
|
128
|
+
` method: '${methodNode.name.toUpperCase()}',`,
|
|
129
|
+
...fixtureCallInformation.requestBody ? [` body: JSON.stringify(${sourceCode.getText(fixtureCallInformation.requestBody)}),`] : [],
|
|
130
|
+
...fixtureCallInformation.requestHeaders ? [
|
|
131
|
+
` headers: {`,
|
|
132
|
+
...fixtureCallInformation.requestHeaders.map(
|
|
133
|
+
({ name, value }) => (
|
|
134
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions, no-nested-ternary, sonarjs/no-nested-template-literals
|
|
135
|
+
` ${name.type === "Literal" ? isValidPropertyName(name.value) ? name.value : `'${name.value}'` : `[${sourceCode.getText(name)}]`}: ${sourceCode.getText(value)},`
|
|
136
|
+
)
|
|
137
|
+
),
|
|
138
|
+
` },`
|
|
139
|
+
] : [],
|
|
140
|
+
"}"
|
|
141
|
+
].join(`
|
|
142
|
+
${indentation}`);
|
|
143
|
+
const responseVariableNameToUse = "res";
|
|
144
|
+
const { statusAssertion, nonStatusAssertions } = createResponseAssertions(
|
|
145
|
+
fixtureCallInformation,
|
|
146
|
+
sourceCode,
|
|
147
|
+
responseVariableNameToUse
|
|
148
|
+
);
|
|
149
|
+
const disableLintComment = "// eslint-disable-next-line @checkdigit/no-promise-instance-method";
|
|
150
|
+
const fetchCallText = `fetch(${fetchUrlArgumentText}, ${fetchRequestArgumentLines})`;
|
|
151
|
+
const appendingAssignmentAndAssertionText = [
|
|
152
|
+
...statusAssertion !== void 0 ? [statusAssertion] : [],
|
|
153
|
+
...nonStatusAssertions
|
|
154
|
+
].join(`;
|
|
155
|
+
${indentation}`);
|
|
156
|
+
const replacementText = [
|
|
157
|
+
disableLintComment,
|
|
158
|
+
`${fetchCallText}.then((${responseVariableNameToUse}) => {`,
|
|
159
|
+
appendingAssignmentAndAssertionText === "" ? "" : ` ${appendingAssignmentAndAssertionText};`,
|
|
160
|
+
` return ${responseVariableNameToUse};`,
|
|
161
|
+
`})`
|
|
162
|
+
].join(`
|
|
163
|
+
${indentation}`);
|
|
164
|
+
context.report({
|
|
165
|
+
node: fixtureCall,
|
|
166
|
+
messageId: "preferNativeFetch",
|
|
167
|
+
fix(fixer) {
|
|
168
|
+
return fixer.replaceText(fixtureCallInformation.fixtureNode, replacementText);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
} catch (error) {
|
|
172
|
+
console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
|
|
173
|
+
context.report({
|
|
174
|
+
node: fixtureCall,
|
|
175
|
+
messageId: "unknownError",
|
|
176
|
+
data: {
|
|
177
|
+
fileName: context.filename,
|
|
178
|
+
error: error instanceof Error ? error.toString() : JSON.stringify(error)
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
var concurrent_promises_default = rule;
|
|
187
|
+
export {
|
|
188
|
+
concurrent_promises_default as default,
|
|
189
|
+
ruleId
|
|
190
|
+
};
|
|
191
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2ZpeHR1cmUvY29uY3VycmVudC1wcm9taXNlcy50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFTQSxPQUFzQztBQUN0QyxTQUFTLFVBQVUsY0FBYztBQUNqQyxPQUFPLHlCQUF5QjtBQUNoQyxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLGlCQUFpQjtBQUMxQixTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLDRDQUE0QztBQUU5QyxJQUFNLFNBQVM7QUFVdEIsU0FBUyxtQkFBbUIsTUFBNEIsU0FBaUMsWUFBd0I7QUFDL0csUUFBTSxTQUFTLFVBQVUsSUFBSTtBQUM3QixNQUFJLENBQUMsUUFBUTtBQUNYO0FBQUEsRUFDRjtBQUVBLE1BQUk7QUFDSixNQUFJLE9BQU8sU0FBUyxtQkFBbUI7QUFDckMsWUFBUSxjQUFjO0FBQUEsRUFDeEIsV0FBVyxPQUFPLFNBQVMsc0JBQXNCLE9BQU8sU0FBUyxTQUFTLGNBQWM7QUFDdEYsUUFBSSxPQUFPLFNBQVMsU0FBUyxVQUFVO0FBRXJDLFlBQU0sZ0JBQWdCLFVBQVUsTUFBTTtBQUN0QyxhQUFPLEdBQUcsaUJBQWlCLGNBQWMsU0FBUyxnQkFBZ0I7QUFDbEUsY0FBUSxhQUFhLENBQUMsR0FBSSxRQUFRLGNBQWMsQ0FBQyxHQUFJLGNBQWMsU0FBeUI7QUFDNUYsaUJBQVc7QUFBQSxJQUNiLFdBQVcsT0FBTyxTQUFTLFNBQVMsUUFBUTtBQUUxQyxZQUFNLHNCQUFzQixVQUFVLE1BQU07QUFDNUMsYUFBTyxHQUFHLHVCQUF1QixvQkFBb0IsU0FBUyxnQkFBZ0I7QUFDOUUsY0FBUSxjQUFjLG9CQUFvQixVQUFVLENBQUM7QUFDckQsaUJBQVc7QUFBQSxJQUNiLFdBQVcsT0FBTyxTQUFTLFNBQVMsT0FBTztBQUV6QyxZQUFNLHVCQUF1QixVQUFVLE1BQU07QUFDN0MsYUFBTyxHQUFHLHdCQUF3QixxQkFBcUIsU0FBUyxnQkFBZ0I7QUFDaEYsWUFBTSxDQUFDLE1BQU0sS0FBSyxJQUFJLHFCQUFxQjtBQUMz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
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// src/fixture/fetch-header-getter.ts
|
|
2
|
+
import { analyzeResponseReferences } from "./response-reference.mjs";
|
|
3
|
+
import { strict as assert } from "node:assert";
|
|
4
|
+
import getDocumentationUrl from "../get-documentation-url.mjs";
|
|
5
|
+
import { getParent } from "../ast/tree.mjs";
|
|
6
|
+
var ruleId = "fetch-header-getter";
|
|
7
|
+
var rule = {
|
|
8
|
+
meta: {
|
|
9
|
+
type: "problem",
|
|
10
|
+
docs: {
|
|
11
|
+
description: "Make sure getter is used to access response headers.",
|
|
12
|
+
url: getDocumentationUrl(ruleId)
|
|
13
|
+
},
|
|
14
|
+
messages: {
|
|
15
|
+
shouldUseHeaderGetter: "Getter should be used to access response headers."
|
|
16
|
+
},
|
|
17
|
+
fixable: "code",
|
|
18
|
+
schema: []
|
|
19
|
+
},
|
|
20
|
+
create(context) {
|
|
21
|
+
const sourceCode = context.sourceCode;
|
|
22
|
+
const scopeManager = sourceCode.scopeManager;
|
|
23
|
+
return {
|
|
24
|
+
'VariableDeclarator[init.argument.callee.name="fetch"]': (fetchCall) => {
|
|
25
|
+
const variableDeclaration = getParent(fetchCall);
|
|
26
|
+
assert.ok(variableDeclaration?.type === "VariableDeclaration");
|
|
27
|
+
const { variable: responseVariable, headersReferences: responseHeadersReferences } = analyzeResponseReferences(
|
|
28
|
+
variableDeclaration,
|
|
29
|
+
scopeManager
|
|
30
|
+
);
|
|
31
|
+
assert.ok(responseVariable);
|
|
32
|
+
const directHeaderReferences = responseHeadersReferences.map(getParent).filter((parent) => parent?.type === "MemberExpression");
|
|
33
|
+
const indirectHeaderReferences = responseHeadersReferences.map((reference) => getParent(reference)).filter((parent) => parent?.type === "VariableDeclarator").map((declarator) => declarator.id.name).map((redefinedHeadersVariableName) => {
|
|
34
|
+
const headersVariable = responseVariable.scope.variables.find((variable) => {
|
|
35
|
+
const identifier = variable.identifiers[0];
|
|
36
|
+
return identifier?.type === "Identifier" && identifier.name === redefinedHeadersVariableName;
|
|
37
|
+
});
|
|
38
|
+
return headersVariable?.references.map((reference) => getParent(reference.identifier)).filter((parent) => parent?.type === "MemberExpression") ?? [];
|
|
39
|
+
}).flat();
|
|
40
|
+
const invalidHeaderReferences = [...directHeaderReferences, ...indirectHeaderReferences].filter(
|
|
41
|
+
(reference) => !(reference.property.type === "Identifier" && reference.property.name === "get")
|
|
42
|
+
);
|
|
43
|
+
invalidHeaderReferences.forEach((reference) => {
|
|
44
|
+
const headerNameNode = reference.property;
|
|
45
|
+
const headerName = reference.computed ? sourceCode.getText(headerNameNode) : `'${sourceCode.getText(headerNameNode)}'`;
|
|
46
|
+
const replacementText = `${sourceCode.getText(reference.object)}.get(${headerName})`;
|
|
47
|
+
context.report({
|
|
48
|
+
node: reference,
|
|
49
|
+
messageId: "shouldUseHeaderGetter",
|
|
50
|
+
fix(fixer) {
|
|
51
|
+
return fixer.replaceText(reference, replacementText);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
var fetch_header_getter_default = rule;
|
|
60
|
+
export {
|
|
61
|
+
fetch_header_getter_default as default,
|
|
62
|
+
ruleId
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2ZpeHR1cmUvZmV0Y2gtaGVhZGVyLWdldHRlci50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFVQSxTQUFTLGlDQUFpQztBQUMxQyxTQUFTLFVBQVUsY0FBYztBQUNqQyxPQUFPLHlCQUF5QjtBQUNoQyxTQUFTLGlCQUFpQjtBQUVuQixJQUFNLFNBQVM7QUFFdEIsSUFBTSxPQUF3QjtBQUFBLEVBQzVCLE1BQU07QUFBQSxJQUNKLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxNQUNKLGFBQWE7QUFBQSxNQUNiLEtBQUssb0JBQW9CLE1BQU07QUFBQSxJQUNqQztBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IsdUJBQXVCO0FBQUEsSUFDekI7QUFBQSxJQUNBLFNBQVM7QUFBQSxJQUNULFFBQVEsQ0FBQztBQUFBLEVBQ1g7QUFBQSxFQUNBLE9BQU8sU0FBUztBQUNkLFVBQU0sYUFBYSxRQUFRO0FBQzNCLFVBQU0sZUFBZSxXQUFXO0FBRWhDLFdBQU87QUFBQSxNQUNMLHlEQUF5RCxDQUFDLGNBQWtDO0FBQzFGLGNBQU0sc0JBQXNCLFVBQVUsU0FBUztBQUMvQyxlQUFPLEdBQUcscUJBQXFCLFNBQVMscUJBQXFCO0FBQzdELGNBQU0sRUFBRSxVQUFVLGtCQUFrQixtQkFBbUIsMEJBQTBCLElBQUk7QUFBQSxVQUNuRjtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQ0EsZUFBTyxHQUFHLGdCQUFnQjtBQUUxQixjQUFNLHlCQUF5QiwwQkFDNUIsSUFBSSxTQUFTLEVBQ2IsT0FBTyxDQUFDLFdBQXVDLFFBQVEsU0FBUyxrQkFBa0I7QUFFckYsY0FBTSwyQkFBMkIsMEJBQzlCLElBQUksQ0FBQyxjQUFjLFVBQVUsU0FBUyxDQUFDLEVBQ3ZDLE9BQU8sQ0FBQyxXQUF5QyxRQUFRLFNBQVMsb0JBQW9CLEVBQ3RGLElBQUksQ0FBQyxlQUFnQixXQUFXLEdBQWtCLElBQUksRUFDdEQsSUFBSSxDQUFDLGlDQUFpQztBQUNyQyxnQkFBTSxrQkFBa0IsaUJBQWlCLE1BQU0sVUFBVSxLQUFLLENBQUMsYUFBYTtBQUMxRSxrQkFBTSxhQUFhLFNBQVMsWUFBWSxDQUFDO0FBQ3pDLG1CQUFPLFlBQVksU0FBUyxnQkFBZ0IsV0FBVyxTQUFTO0FBQUEsVUFDbEUsQ0FBQztBQUNELGlCQUNFLGlCQUFpQixXQUNkLElBQUksQ0FBQyxjQUFjLFVBQVUsVUFBVSxVQUFVLENBQUMsRUFDbEQsT0FBTyxDQUFDLFdBQXVDLFFBQVEsU0FBUyxrQkFBa0IsS0FBSyxDQUFDO0FBQUEsUUFFL0YsQ0FBQyxFQUNBLEtBQUs7QUFFUixjQUFNLDBCQUEwQixDQUFDLEdBQUcsd0JBQXdCLEdBQUcsd0JBQXdCLEVBQUU7QUFBQSxVQUN2RixDQUFDLGNBQWMsRUFBRSxVQUFVLFNBQVMsU0FBUyxnQkFBZ0IsVUFBVSxTQUFTLFNBQVM7QUFBQSxRQUMzRjtBQUVBLGdDQUF3QixRQUFRLENBQUMsY0FBYztBQUM3QyxnQkFBTSxpQkFBaUIsVUFBVTtBQUNqQyxnQkFBTSxhQUFhLFVBQVUsV0FDekIsV0FBVyxRQUFRLGNBQWMsSUFDakMsSUFBSSxXQUFXLFFBQVEsY0FBYyxDQUFDO0FBQzFDLGdCQUFNLGtCQUFrQixHQUFHLFdBQVcsUUFBUSxVQUFVLE1BQU0sQ0FBQyxRQUFRLFVBQVU7QUFFakYsa0JBQVEsT0FBTztBQUFBLFlBQ2IsTUFBTTtBQUFBLFlBQ04sV0FBVztBQUFBLFlBQ1gsSUFBSSxPQUFPO0FBQ1QscUJBQU8sTUFBTSxZQUFZLFdBQVcsZUFBZTtBQUFBLFlBQ3JEO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSCxDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxJQUFPLDhCQUFROyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// src/fixture/fetch.ts
|
|
2
|
+
function getResponseBodyRetrievalText(responseVariableName) {
|
|
3
|
+
return `await ${responseVariableName}.json()`;
|
|
4
|
+
}
|
|
5
|
+
export {
|
|
6
|
+
getResponseBodyRetrievalText
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2ZpeHR1cmUvZmV0Y2gudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBRU8sU0FBUyw2QkFBNkIsc0JBQThCO0FBQ3pFLFNBQU8sU0FBUyxvQkFBb0I7QUFDdEM7IiwKICAibmFtZXMiOiBbXQp9Cg==
|