@checkdigit/eslint-plugin 6.6.0-PR.75-1f73 → 6.6.0-PR.77-5328

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.
Files changed (45) hide show
  1. package/dist-cjs/index.cjs +755 -2126
  2. package/dist-cjs/metafile.json +82 -519
  3. package/dist-mjs/index.mjs +2 -60
  4. package/dist-mjs/require-resolve-full-response.mjs +5 -2
  5. package/dist-types/index.d.ts +1 -48
  6. package/dist-types/require-resolve-full-response.d.ts +3 -1
  7. package/package.json +1 -1
  8. package/src/index.ts +0 -58
  9. package/src/require-resolve-full-response.ts +2 -1
  10. package/dist-mjs/agent/add-url-domain.mjs +0 -61
  11. package/dist-mjs/agent/fetch-response-body-json.mjs +0 -63
  12. package/dist-mjs/agent/fetch-response-header-getter.mjs +0 -117
  13. package/dist-mjs/agent/fetch-then.mjs +0 -269
  14. package/dist-mjs/agent/fetch.mjs +0 -34
  15. package/dist-mjs/agent/no-fixture.mjs +0 -328
  16. package/dist-mjs/agent/no-full-response.mjs +0 -67
  17. package/dist-mjs/agent/no-mapped-response.mjs +0 -75
  18. package/dist-mjs/agent/no-service-wrapper.mjs +0 -184
  19. package/dist-mjs/agent/no-status-code.mjs +0 -59
  20. package/dist-mjs/agent/response-reference.mjs +0 -56
  21. package/dist-mjs/agent/url.mjs +0 -26
  22. package/dist-types/agent/add-url-domain.d.ts +0 -4
  23. package/dist-types/agent/fetch-response-body-json.d.ts +0 -4
  24. package/dist-types/agent/fetch-response-header-getter.d.ts +0 -4
  25. package/dist-types/agent/fetch-then.d.ts +0 -4
  26. package/dist-types/agent/fetch.d.ts +0 -4
  27. package/dist-types/agent/no-fixture.d.ts +0 -4
  28. package/dist-types/agent/no-full-response.d.ts +0 -4
  29. package/dist-types/agent/no-mapped-response.d.ts +0 -4
  30. package/dist-types/agent/no-service-wrapper.d.ts +0 -4
  31. package/dist-types/agent/no-status-code.d.ts +0 -4
  32. package/dist-types/agent/response-reference.d.ts +0 -16
  33. package/dist-types/agent/url.d.ts +0 -5
  34. package/src/agent/add-url-domain.ts +0 -75
  35. package/src/agent/fetch-response-body-json.ts +0 -76
  36. package/src/agent/fetch-response-header-getter.ts +0 -148
  37. package/src/agent/fetch-then.ts +0 -354
  38. package/src/agent/fetch.ts +0 -52
  39. package/src/agent/no-fixture.ts +0 -453
  40. package/src/agent/no-full-response.ts +0 -75
  41. package/src/agent/no-mapped-response.ts +0 -84
  42. package/src/agent/no-service-wrapper.ts +0 -238
  43. package/src/agent/no-status-code.ts +0 -71
  44. package/src/agent/response-reference.ts +0 -100
  45. package/src/agent/url.ts +0 -23
@@ -1,269 +0,0 @@
1
- // src/agent/fetch-then.ts
2
- import "eslint";
3
- import { getEnclosingFunction, getEnclosingStatement, getParent, isUsedInArrayOrAsArgument } from "../library/tree.mjs";
4
- import { hasAssertions, isInvalidResponseHeadersAccess } from "./fetch.mjs";
5
- import { strict as assert } from "node:assert";
6
- import getDocumentationUrl from "../get-documentation-url.mjs";
7
- import { getIndentation } from "../library/format.mjs";
8
- import { isValidPropertyName } from "../library/variable.mjs";
9
- import { replaceEndpointUrlPrefixWithBasePath } from "./url.mjs";
10
- var ruleId = "fetch-then";
11
- function analyzeFixtureCall(call, results, sourceCode) {
12
- const parent = getParent(call);
13
- if (!parent) {
14
- return;
15
- }
16
- let nextCall;
17
- if (parent.type !== "MemberExpression") {
18
- results.fixtureNode = call;
19
- return;
20
- }
21
- if (parent.property.type === "Identifier") {
22
- if (parent.property.name === "expect") {
23
- const assertionCall = getParent(parent);
24
- assert.ok(assertionCall && assertionCall.type === "CallExpression");
25
- results.assertions = [...results.assertions ?? [], assertionCall.arguments];
26
- nextCall = assertionCall;
27
- } else if (parent.property.name === "send") {
28
- const sendRequestBodyCall = getParent(parent);
29
- assert.ok(sendRequestBodyCall && sendRequestBodyCall.type === "CallExpression");
30
- results.requestBody = sendRequestBodyCall.arguments[0];
31
- nextCall = sendRequestBodyCall;
32
- } else if (parent.property.name === "set") {
33
- const setRequestHeaderCall = getParent(parent);
34
- assert.ok(setRequestHeaderCall && setRequestHeaderCall.type === "CallExpression");
35
- const [name, value] = setRequestHeaderCall.arguments;
36
- results.requestHeaders = [...results.requestHeaders ?? [], { name, value }];
37
- nextCall = setRequestHeaderCall;
38
- }
39
- } else {
40
- throw new Error(`Unexpected expression in fixture/supertest call ${sourceCode.getText(parent)}.`);
41
- }
42
- if (nextCall) {
43
- analyzeFixtureCall(nextCall, results, sourceCode);
44
- }
45
- }
46
- function createResponseAssertions(fixtureCallInformation, sourceCode, responseVariableName) {
47
- let statusAssertion;
48
- const nonStatusAssertions = [];
49
- for (const expectArguments of fixtureCallInformation.assertions ?? []) {
50
- if (expectArguments.length === 1) {
51
- const [assertionArgument] = expectArguments;
52
- assert.ok(assertionArgument);
53
- if (assertionArgument.type === "MemberExpression" && assertionArgument.object.type === "Identifier" && assertionArgument.object.name === "StatusCodes" || assertionArgument.type === "Literal" || sourceCode.getText(assertionArgument).includes("StatusCodes.")) {
54
- statusAssertion = `assert.equal(${responseVariableName}.status, ${sourceCode.getText(assertionArgument)})`;
55
- } else if (assertionArgument.type === "ArrowFunctionExpression") {
56
- let functionBody = sourceCode.getText(assertionArgument.body);
57
- const [originalResponseArgument] = assertionArgument.params;
58
- assert.ok(originalResponseArgument?.type === "Identifier");
59
- const originalResponseArgumentName = originalResponseArgument.name;
60
- if (originalResponseArgumentName !== responseVariableName) {
61
- functionBody = functionBody.replace(
62
- new RegExp(`\\b${originalResponseArgumentName}\\b`, "ug"),
63
- responseVariableName
64
- );
65
- }
66
- nonStatusAssertions.push(`assert.ok(${functionBody})`);
67
- } else if (assertionArgument.type === "Identifier") {
68
- nonStatusAssertions.push(`assert.ok(${sourceCode.getText(assertionArgument)}(${responseVariableName}))`);
69
- } else if (assertionArgument.type === "ObjectExpression" || assertionArgument.type === "CallExpression") {
70
- nonStatusAssertions.push(
71
- `assert.deepEqual(await ${responseVariableName}.json(), ${sourceCode.getText(assertionArgument)})`
72
- );
73
- } else {
74
- throw new Error(`Unexpected Supertest assertion argument: ".expect(${sourceCode.getText(assertionArgument)})`);
75
- }
76
- } else if (expectArguments.length === 2) {
77
- const [headerName, headerValue] = expectArguments;
78
- assert.ok(headerName && headerValue);
79
- const headersReference = `${responseVariableName}.headers`;
80
- if (headerValue.type === "Literal" && headerValue.value instanceof RegExp) {
81
- nonStatusAssertions.push(
82
- `assert.ok(${headersReference}.get(${sourceCode.getText(headerName)}).match(${sourceCode.getText(headerValue)}))`
83
- );
84
- } else {
85
- nonStatusAssertions.push(
86
- `assert.equal(${headersReference}.get(${sourceCode.getText(headerName)}), ${sourceCode.getText(headerValue)})`
87
- );
88
- }
89
- }
90
- }
91
- return {
92
- statusAssertion,
93
- nonStatusAssertions
94
- };
95
- }
96
- function getResponseHeadersAccesses(responseVariables, scopeManager, sourceCode) {
97
- const responseHeadersAccesses = [];
98
- for (const responseVariable of responseVariables) {
99
- for (const responseReference of responseVariable.references) {
100
- const responseAccess = getParent(responseReference.identifier);
101
- if (!responseAccess || responseAccess.type !== "MemberExpression") {
102
- continue;
103
- }
104
- const responseAccessParent = getParent(responseAccess);
105
- if (!responseAccessParent) {
106
- continue;
107
- }
108
- if (responseAccessParent.type === "CallExpression" && responseAccessParent.arguments[0]?.type === "ArrowFunctionExpression") {
109
- responseHeadersAccesses.push(
110
- ...getResponseHeadersAccesses(
111
- scopeManager.getDeclaredVariables(responseAccessParent.arguments[0]),
112
- scopeManager,
113
- sourceCode
114
- )
115
- );
116
- continue;
117
- }
118
- if (responseAccess.computed && responseAccess.property.type === "Literal" && responseAccessParent.type === "MemberExpression") {
119
- responseHeadersAccesses.push(responseAccessParent);
120
- } else {
121
- responseHeadersAccesses.push(responseAccess);
122
- }
123
- }
124
- }
125
- return responseHeadersAccesses;
126
- }
127
- var rule = {
128
- meta: {
129
- type: "suggestion",
130
- docs: {
131
- description: "Prefer native fetch API over customized fixture API.",
132
- url: getDocumentationUrl(ruleId)
133
- },
134
- messages: {
135
- preferNativeFetch: "Prefer native fetch API over customized fixture API.",
136
- shouldUseHeaderGetter: "Getter should be used to access response headers.",
137
- unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
138
- },
139
- fixable: "code",
140
- schema: []
141
- },
142
- // eslint-disable-next-line max-lines-per-function
143
- create(context) {
144
- const sourceCode = context.sourceCode;
145
- const scopeManager = sourceCode.scopeManager;
146
- return {
147
- // eslint-disable-next-line max-lines-per-function
148
- 'CallExpression[callee.object.object.name="fixture"][callee.object.property.name="api"]': (fixtureCall) => {
149
- try {
150
- if (!hasAssertions(fixtureCall)) {
151
- return;
152
- }
153
- if (!(isUsedInArrayOrAsArgument(fixtureCall) || getEnclosingFunction(fixtureCall)?.async === false)) {
154
- return;
155
- }
156
- assert.ok(fixtureCall.type === "CallExpression");
157
- const fixtureFunction = fixtureCall.callee;
158
- assert.ok(fixtureFunction.type === "MemberExpression");
159
- const indentation = getIndentation(fixtureCall, sourceCode);
160
- const [urlArgumentNode] = fixtureCall.arguments;
161
- assert.ok(urlArgumentNode !== void 0);
162
- const fixtureCallInformation = {};
163
- analyzeFixtureCall(fixtureCall, fixtureCallInformation, sourceCode);
164
- const originalUrlArgumentText = sourceCode.getText(urlArgumentNode);
165
- const fetchUrlArgumentText = replaceEndpointUrlPrefixWithBasePath(originalUrlArgumentText);
166
- const methodNode = fixtureFunction.property;
167
- assert.ok(methodNode.type === "Identifier");
168
- const fetchRequestArgumentLines = [
169
- "{",
170
- ` method: '${methodNode.name.toUpperCase()}',`,
171
- ...fixtureCallInformation.requestBody ? [` body: JSON.stringify(${sourceCode.getText(fixtureCallInformation.requestBody)}),`] : [],
172
- ...fixtureCallInformation.requestHeaders ? [
173
- ` headers: {`,
174
- ...fixtureCallInformation.requestHeaders.map(
175
- ({ name, value }) => (
176
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions, no-nested-ternary, sonarjs/no-nested-template-literals
177
- ` ${name.type === "Literal" ? isValidPropertyName(name.value) ? name.value : `'${name.value}'` : `[${sourceCode.getText(name)}]`}: ${sourceCode.getText(value)},`
178
- )
179
- ),
180
- ` },`
181
- ] : [],
182
- "}"
183
- ].join(`
184
- ${indentation}`);
185
- const responseVariableNameToUse = "res";
186
- const { statusAssertion, nonStatusAssertions } = createResponseAssertions(
187
- fixtureCallInformation,
188
- sourceCode,
189
- responseVariableNameToUse
190
- );
191
- const disableLintComment = "// eslint-disable-next-line @checkdigit/no-promise-instance-method";
192
- const fetchCallText = `fetch(${fetchUrlArgumentText}, ${fetchRequestArgumentLines})`;
193
- const appendingAssignmentAndAssertionText = [
194
- ...statusAssertion !== void 0 ? [statusAssertion] : [],
195
- ...nonStatusAssertions
196
- ].join(`;
197
- ${indentation}`);
198
- const replacementText = fixtureCallInformation.assertions ? [
199
- disableLintComment,
200
- `${fetchCallText}.then((${responseVariableNameToUse}) => {`,
201
- appendingAssignmentAndAssertionText === "" ? "" : ` ${appendingAssignmentAndAssertionText};`,
202
- ` return ${responseVariableNameToUse};`,
203
- `})`
204
- ].join(`
205
- ${indentation}`) : fetchCallText;
206
- context.report({
207
- node: fixtureCall,
208
- messageId: "preferNativeFetch",
209
- fix(fixer) {
210
- return fixer.replaceText(fixtureCallInformation.fixtureNode, replacementText);
211
- }
212
- });
213
- const responsesVariable = getEnclosingStatement(fixtureCallInformation.fixtureNode);
214
- if (!responsesVariable) {
215
- return;
216
- }
217
- const responseVariableReferences = scopeManager.getDeclaredVariables(responsesVariable);
218
- const responseHeadersAccesses = getResponseHeadersAccesses(
219
- responseVariableReferences,
220
- scopeManager,
221
- sourceCode
222
- );
223
- for (const responseHeadersAccess of responseHeadersAccesses) {
224
- if (isInvalidResponseHeadersAccess(responseHeadersAccess)) {
225
- const headerAccess = getParent(responseHeadersAccess);
226
- if (headerAccess?.type === "MemberExpression") {
227
- const headerNameNode = headerAccess.property;
228
- const headerName = headerAccess.computed ? sourceCode.getText(headerNameNode) : `'${sourceCode.getText(headerNameNode)}'`;
229
- const headerAccessReplacementText = `${sourceCode.getText(headerAccess.object)}.get(${headerName})`;
230
- context.report({
231
- node: headerAccess,
232
- messageId: "shouldUseHeaderGetter",
233
- fix(fixer) {
234
- return fixer.replaceText(headerAccess, headerAccessReplacementText);
235
- }
236
- });
237
- } else if (headerAccess?.type === "CallExpression" && responseHeadersAccess.property.type === "Identifier" && responseHeadersAccess.property.name === "get") {
238
- const headerAccessReplacementText = `${sourceCode.getText(responseHeadersAccess.object)}.headers.get(${sourceCode.getText(headerAccess.arguments[0])})`;
239
- context.report({
240
- node: headerAccess,
241
- messageId: "shouldUseHeaderGetter",
242
- fix(fixer) {
243
- return fixer.replaceText(headerAccess, headerAccessReplacementText);
244
- }
245
- });
246
- }
247
- }
248
- }
249
- } catch (error) {
250
- console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
251
- context.report({
252
- node: fixtureCall,
253
- messageId: "unknownError",
254
- data: {
255
- fileName: context.filename,
256
- error: error instanceof Error ? error.toString() : JSON.stringify(error)
257
- }
258
- });
259
- }
260
- }
261
- };
262
- }
263
- };
264
- var fetch_then_default = rule;
265
- export {
266
- fetch_then_default as default,
267
- ruleId
268
- };
269
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L2ZldGNoLXRoZW4udHMiXSwKICAibWFwcGluZ3MiOiAiO0FBU0EsT0FBa0Q7QUFDbEQsU0FBUyxzQkFBc0IsdUJBQXVCLFdBQVcsaUNBQWlDO0FBQ2xHLFNBQVMsZUFBZSxzQ0FBc0M7QUFDOUQsU0FBUyxVQUFVLGNBQWM7QUFDakMsT0FBTyx5QkFBeUI7QUFDaEMsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyw0Q0FBNEM7QUFFOUMsSUFBTSxTQUFTO0FBVXRCLFNBQVMsbUJBQW1CLE1BQTRCLFNBQWlDLFlBQXdCO0FBQy9HLFFBQU0sU0FBUyxVQUFVLElBQUk7QUFDN0IsTUFBSSxDQUFDLFFBQVE7QUFDWDtBQUFBLEVBQ0Y7QUFFQSxNQUFJO0FBQ0osTUFBSSxPQUFPLFNBQVMsb0JBQW9CO0FBQ3RDLFlBQVEsY0FBYztBQUN0QjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLE9BQU8sU0FBUyxTQUFTLGNBQWM7QUFDekMsUUFBSSxPQUFPLFNBQVMsU0FBUyxVQUFVO0FBRXJDLFlBQU0sZ0JBQWdCLFVBQVUsTUFBTTtBQUN0QyxhQUFPLEdBQUcsaUJBQWlCLGNBQWMsU0FBUyxnQkFBZ0I7QUFDbEUsY0FBUSxhQUFhLENBQUMsR0FBSSxRQUFRLGNBQWMsQ0FBQyxHQUFJLGNBQWMsU0FBeUI7QUFDNUYsaUJBQVc7QUFBQSxJQUNiLFdBQVcsT0FBTyxTQUFTLFNBQVMsUUFBUTtBQUUxQyxZQUFNLHNCQUFzQixVQUFVLE1BQU07QUFDNUMsYUFBTyxHQUFHLHVCQUF1QixvQkFBb0IsU0FBUyxnQkFBZ0I7QUFDOUUsY0FBUSxjQUFjLG9CQUFvQixVQUFVLENBQUM7QUFDckQsaUJBQVc7QUFBQSxJQUNiLFdBQVcsT0FBTyxTQUFTLFNBQVMsT0FBTztBQUV6QyxZQUFNLHVCQUF1QixVQUFVLE1BQU07QUFDN0MsYUFBTyxHQUFHLHdCQUF3QixxQkFBcUIsU0FBUyxnQkFBZ0I7QUFDaEYsWUFBTSxDQUFDLE1B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
@@ -1,34 +0,0 @@
1
- // src/agent/fetch.ts
2
- import { getParent, isBlockStatement } from "../library/tree.mjs";
3
- function getResponseBodyRetrievalText(responseVariableName) {
4
- return `await ${responseVariableName}.json()`;
5
- }
6
- function isInvalidResponseHeadersAccess(responseHeadersAccess) {
7
- const responseHeaderAccessParent = getParent(responseHeadersAccess);
8
- if (responseHeaderAccessParent?.type === "VariableDeclarator") {
9
- return false;
10
- }
11
- if (responseHeaderAccessParent?.type === "CallExpression" && responseHeaderAccessParent.callee.type === "MemberExpression" && responseHeaderAccessParent.callee.property.type === "Identifier" && responseHeaderAccessParent.callee.property.name === "get") {
12
- return true;
13
- }
14
- return !(responseHeaderAccessParent?.type === "MemberExpression" && responseHeaderAccessParent.property.type === "Identifier" && responseHeaderAccessParent.property.name === "get");
15
- }
16
- function hasAssertions(fixtureCall) {
17
- if (isBlockStatement(fixtureCall)) {
18
- return false;
19
- }
20
- const parent = getParent(fixtureCall);
21
- if (!parent) {
22
- return false;
23
- }
24
- if (parent.type === "MemberExpression" && parent.property.type === "Identifier" && parent.property.name === "expect" && getParent(parent)?.type === "CallExpression") {
25
- return true;
26
- }
27
- return hasAssertions(parent);
28
- }
29
- export {
30
- getResponseBodyRetrievalText,
31
- hasAssertions,
32
- isInvalidResponseHeadersAccess
33
- };
34
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L2ZldGNoLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLFNBQVMsV0FBVyx3QkFBd0I7QUFHckMsU0FBUyw2QkFBNkIsc0JBQThCO0FBQ3pFLFNBQU8sU0FBUyxvQkFBb0I7QUFDdEM7QUFFTyxTQUFTLCtCQUErQix1QkFBNkI7QUFDMUUsUUFBTSw2QkFBNkIsVUFBVSxxQkFBcUI7QUFDbEUsTUFBSSw0QkFBNEIsU0FBUyxzQkFBc0I7QUFDN0QsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUNFLDRCQUE0QixTQUFTLG9CQUNyQywyQkFBMkIsT0FBTyxTQUFTLHNCQUMzQywyQkFBMkIsT0FBTyxTQUFTLFNBQVMsZ0JBQ3BELDJCQUEyQixPQUFPLFNBQVMsU0FBUyxPQUNwRDtBQUNBLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxFQUNMLDRCQUE0QixTQUFTLHNCQUNyQywyQkFBMkIsU0FBUyxTQUFTLGdCQUM3QywyQkFBMkIsU0FBUyxTQUFTO0FBRWpEO0FBRU8sU0FBUyxjQUFjLGFBQW1CO0FBQy9DLE1BQUksaUJBQWlCLFdBQVcsR0FBRztBQUNqQyxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sU0FBUyxVQUFVLFdBQVc7QUFDcEMsTUFBSSxDQUFDLFFBQVE7QUFDWCxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQ0UsT0FBTyxTQUFTLHNCQUNoQixPQUFPLFNBQVMsU0FBUyxnQkFDekIsT0FBTyxTQUFTLFNBQVMsWUFDekIsVUFBVSxNQUFNLEdBQUcsU0FBUyxrQkFDNUI7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU8sY0FBYyxNQUFNO0FBQzdCOyIsCiAgIm5hbWVzIjogW10KfQo=