@checkdigit/eslint-plugin 7.6.0-PR.75-7ee9 → 7.6.0-PR.75-a611

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/src/index.ts CHANGED
@@ -15,15 +15,15 @@ import fetchResponseHeaderGetter, {
15
15
  ruleId as fetchResponseHeaderGetterRuleId,
16
16
  } from './agent/fetch-response-header-getter';
17
17
  import fetchResponseStatus, { ruleId as fetchResponseStatusRuleId } from './agent/fetch-response-status';
18
- import fetchThen, { ruleId as fetchThenRuleId } from './agent/fetch-then';
18
+ // import fetchThen, { ruleId as fetchThenRuleId } from './agent/fetch-then';
19
19
  import fixFunctionCallArguments, {
20
20
  ruleId as fixFunctionCallArgumentsRuleId,
21
21
  } from './agent/fix-function-call-arguments';
22
22
  import invalidJsonStringify, { ruleId as invalidJsonStringifyRuleId } from './invalid-json-stringify';
23
23
  import noDuplicatedImports, { ruleId as noDuplicatedImportsRuleId } from './no-duplicated-imports';
24
24
  import noFixture, { ruleId as noFixtureRuleId } from './agent/no-fixture';
25
- import noSupertest, { ruleId as noSupertestRuleId } from './agent/no-supertest';
26
- import supertestThen, { ruleId as supertestThenRuleId } from './agent/supertest-then';
25
+ import noExpectAssertion, { ruleId as noExpectAssertionRuleId } from './agent/no-expect-assertion';
26
+ // import supertestThen, { ruleId as supertestThenRuleId } from './agent/supertest-then';
27
27
  import noLegacyServiceTyping, { ruleId as noLegacyServiceTypingRuleId } from './no-legacy-service-typing';
28
28
  import noMappedResponse, { ruleId as noMappedResponseRuleId } from './agent/no-mapped-response';
29
29
  import noPromiseInstanceMethod, { ruleId as noPromiseInstanceMethodRuleId } from './no-promise-instance-method';
@@ -74,9 +74,9 @@ const rules: Record<string, TSESLint.LooseRuleDefinition> = {
74
74
  [invalidJsonStringifyRuleId]: invalidJsonStringify,
75
75
  [noPromiseInstanceMethodRuleId]: noPromiseInstanceMethod,
76
76
  [noFixtureRuleId]: noFixture,
77
- [noSupertestRuleId]: noSupertest,
78
- [supertestThenRuleId]: supertestThen,
79
- [fetchThenRuleId]: fetchThen,
77
+ [noExpectAssertionRuleId]: noExpectAssertion,
78
+ // [supertestThenRuleId]: supertestThen,
79
+ // [fetchThenRuleId]: fetchThen,
80
80
  [noServiceWrapperRuleId]: noServiceWrapper,
81
81
  [noStatusCodeRuleId]: noStatusCode,
82
82
  [fetchResponseBodyJsonRuleId]: fetchResponseBodyJson,
@@ -135,14 +135,14 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
135
135
  [`@checkdigit/${noMappedResponseRuleId}`]: 'off',
136
136
  [`@checkdigit/${addUrlDomainRuleId}`]: 'off',
137
137
  [`@checkdigit/${noFixtureRuleId}`]: 'off',
138
- [`@checkdigit/${noSupertestRuleId}`]: 'off',
139
- [`@checkdigit/${supertestThenRuleId}`]: 'off',
138
+ [`@checkdigit/${noExpectAssertionRuleId}`]: 'off',
139
+ // [`@checkdigit/${supertestThenRuleId}`]: 'off',
140
140
  [`@checkdigit/${noServiceWrapperRuleId}`]: 'off',
141
141
  [`@checkdigit/${noStatusCodeRuleId}`]: 'off',
142
142
  [`@checkdigit/${fetchResponseBodyJsonRuleId}`]: 'off',
143
143
  [`@checkdigit/${fetchResponseHeaderGetterRuleId}`]: 'off',
144
144
  [`@checkdigit/${fetchResponseStatusRuleId}`]: 'off',
145
- [`@checkdigit/${fetchThenRuleId}`]: 'off',
145
+ // [`@checkdigit/${fetchThenRuleId}`]: 'off',
146
146
  [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: 'off',
147
147
  [`@checkdigit/${noUnusedServiceVariablesRuleId}`]: 'off',
148
148
  [`@checkdigit/${noUnusedImportsRuleId}`]: 'off',
@@ -185,14 +185,14 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
185
185
  [`@checkdigit/${noMappedResponseRuleId}`]: 'off',
186
186
  [`@checkdigit/${addUrlDomainRuleId}`]: 'off',
187
187
  [`@checkdigit/${noFixtureRuleId}`]: 'off',
188
- [`@checkdigit/${noSupertestRuleId}`]: 'off',
189
- [`@checkdigit/${supertestThenRuleId}`]: 'off',
188
+ [`@checkdigit/${noExpectAssertionRuleId}`]: 'off',
189
+ // [`@checkdigit/${supertestThenRuleId}`]: 'off',
190
190
  [`@checkdigit/${noServiceWrapperRuleId}`]: 'off',
191
191
  [`@checkdigit/${noStatusCodeRuleId}`]: 'off',
192
192
  [`@checkdigit/${fetchResponseBodyJsonRuleId}`]: 'off',
193
193
  [`@checkdigit/${fetchResponseHeaderGetterRuleId}`]: 'off',
194
194
  [`@checkdigit/${fetchResponseStatusRuleId}`]: 'off',
195
- [`@checkdigit/${fetchThenRuleId}`]: 'off',
195
+ // [`@checkdigit/${fetchThenRuleId}`]: 'off',
196
196
  [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: 'off',
197
197
  [`@checkdigit/${noUnusedServiceVariablesRuleId}`]: 'off',
198
198
  [`@checkdigit/${noUnusedImportsRuleId}`]: 'off',
@@ -221,7 +221,7 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
221
221
  [`@checkdigit/${fetchResponseBodyJsonRuleId}`]: 'error',
222
222
  [`@checkdigit/${fetchResponseHeaderGetterRuleId}`]: 'error',
223
223
  [`@checkdigit/${fetchResponseStatusRuleId}`]: 'error',
224
- [`@checkdigit/${fetchThenRuleId}`]: 'error',
224
+ // [`@checkdigit/${fetchThenRuleId}`]: 'error',
225
225
  [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: 'error',
226
226
  [`@checkdigit/${noUnusedServiceVariablesRuleId}`]: 'error',
227
227
  [`@checkdigit/${noUnusedImportsRuleId}`]: 'error',
@@ -230,8 +230,8 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
230
230
  [`@checkdigit/${addBasePathImportRuleId}`]: 'error',
231
231
  [`@checkdigit/${addAssertImportRuleId}`]: 'error',
232
232
  [`@checkdigit/${noFixtureRuleId}`]: 'error',
233
- [`@checkdigit/${noSupertestRuleId}`]: 'error',
234
- [`@checkdigit/${supertestThenRuleId}`]: 'error',
233
+ [`@checkdigit/${noExpectAssertionRuleId}`]: 'error',
234
+ // [`@checkdigit/${supertestThenRuleId}`]: 'error',
235
235
  },
236
236
  },
237
237
  {
@@ -260,7 +260,7 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
260
260
  [`@checkdigit/${fetchResponseBodyJsonRuleId}`]: 'error',
261
261
  [`@checkdigit/${fetchResponseHeaderGetterRuleId}`]: 'error',
262
262
  [`@checkdigit/${fetchResponseStatusRuleId}`]: 'error',
263
- [`@checkdigit/${fetchThenRuleId}`]: 'error',
263
+ // [`@checkdigit/${fetchThenRuleId}`]: 'error',
264
264
  [`@checkdigit/${noUnusedFunctionArgumentsRuleId}`]: 'error',
265
265
  [`@checkdigit/${noUnusedServiceVariablesRuleId}`]: 'error',
266
266
  [`@checkdigit/${noUnusedImportsRuleId}`]: 'error',
@@ -1,346 +0,0 @@
1
- // src/agent/no-supertest.ts
2
- import { strict as assert } from "node:assert";
3
- import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
4
- import {
5
- getEnclosingFunction,
6
- getEnclosingScopeNode,
7
- getEnclosingStatement,
8
- getParent,
9
- isUsedInArrayOrAsArgument
10
- } from "../library/ts-tree.mjs";
11
- import getDocumentationUrl from "../get-documentation-url.mjs";
12
- import { getIndentation } from "../library/format.mjs";
13
- import { analyzeResponseReferences } from "./response-reference.mjs";
14
- import { getResponseBodyRetrievalText, getResponseHeadersRetrievalText, getResponseStatusRetrievalText } from "./fetch.mjs";
15
- var ruleId = "no-supertest";
16
- function analyzeFixtureCall(call, results, sourceCode) {
17
- const parent = getParent(call);
18
- assert.ok(parent, "parent should exist for fixture/supertest call node");
19
- let nextCall;
20
- if (parent.type === AST_NODE_TYPES.ReturnStatement) {
21
- results.fixtureNode = call;
22
- results.rootNode = parent;
23
- } else if (parent.type === AST_NODE_TYPES.ArrayExpression || parent.type === AST_NODE_TYPES.CallExpression || parent.type === AST_NODE_TYPES.ArrowFunctionExpression) {
24
- results.fixtureNode = call;
25
- results.rootNode = call;
26
- } else if (parent.type === AST_NODE_TYPES.AwaitExpression) {
27
- results.fixtureNode = call;
28
- const enclosingStatement = getEnclosingStatement(parent);
29
- assert.ok(enclosingStatement);
30
- const awaitParent = getParent(parent);
31
- if (awaitParent?.type === AST_NODE_TYPES.MemberExpression) {
32
- results.rootNode = parent;
33
- results.inlineStatementNode = enclosingStatement;
34
- if (awaitParent.property.type === AST_NODE_TYPES.Identifier && awaitParent.property.name === "body") {
35
- results.inlineBodyReference = awaitParent;
36
- }
37
- if (awaitParent.property.type === AST_NODE_TYPES.Identifier && (awaitParent.property.name === "status" || awaitParent.property.name === "statusCode")) {
38
- results.inlineStatusReference = awaitParent;
39
- }
40
- if (awaitParent.property.type === AST_NODE_TYPES.Identifier && (awaitParent.property.name === "header" || awaitParent.property.name === "headers")) {
41
- results.inlineHeadersReference = awaitParent;
42
- }
43
- } else if (enclosingStatement.type === AST_NODE_TYPES.VariableDeclaration) {
44
- results.variableDeclaration = enclosingStatement;
45
- results.rootNode = enclosingStatement;
46
- } else if (enclosingStatement.type === AST_NODE_TYPES.ExpressionStatement && enclosingStatement.expression.type === AST_NODE_TYPES.AssignmentExpression) {
47
- results.variableAssignment = enclosingStatement;
48
- results.rootNode = enclosingStatement;
49
- } else {
50
- results.rootNode = parent;
51
- }
52
- } else if (parent.type === AST_NODE_TYPES.MemberExpression && parent.property.type === AST_NODE_TYPES.Identifier) {
53
- if (parent.property.name === "expect") {
54
- const assertionCall = getParent(parent);
55
- assert.ok(assertionCall && assertionCall.type === AST_NODE_TYPES.CallExpression);
56
- results.assertions = [...results.assertions ?? [], assertionCall.arguments];
57
- nextCall = assertionCall;
58
- }
59
- } else {
60
- throw new Error(`Unexpected expression in fixture/supertest call ${sourceCode.getText(parent)}.`);
61
- }
62
- if (nextCall) {
63
- analyzeFixtureCall(nextCall, results, sourceCode);
64
- }
65
- }
66
- function createResponseAssertions(fixtureCallInformation, sourceCode, responseVariableName, destructuringResponseHeadersVariable) {
67
- let statusAssertion;
68
- const nonStatusAssertions = [];
69
- for (const expectArguments of fixtureCallInformation.assertions ?? []) {
70
- if (expectArguments.length === 1) {
71
- const [assertionArgument] = expectArguments;
72
- assert.ok(assertionArgument);
73
- if (assertionArgument.type === AST_NODE_TYPES.MemberExpression && assertionArgument.object.type === AST_NODE_TYPES.Identifier && assertionArgument.object.name === "StatusCodes" || assertionArgument.type === AST_NODE_TYPES.Literal || sourceCode.getText(assertionArgument).includes("StatusCodes.")) {
74
- statusAssertion = `assert.equal(${responseVariableName}.status, ${sourceCode.getText(assertionArgument)})`;
75
- } else if (assertionArgument.type === AST_NODE_TYPES.ArrowFunctionExpression) {
76
- let functionBody = sourceCode.getText(assertionArgument.body);
77
- const [originalResponseArgument] = assertionArgument.params;
78
- assert.ok(originalResponseArgument?.type === AST_NODE_TYPES.Identifier);
79
- const originalResponseArgumentName = originalResponseArgument.name;
80
- if (originalResponseArgumentName !== responseVariableName) {
81
- functionBody = functionBody.replace(
82
- new RegExp(`\\b${originalResponseArgumentName}\\b`, "ug"),
83
- responseVariableName
84
- );
85
- }
86
- nonStatusAssertions.push(`assert.doesNotThrow(()=>${functionBody})`);
87
- } else if (assertionArgument.type === AST_NODE_TYPES.Identifier) {
88
- nonStatusAssertions.push(
89
- `assert.doesNotThrow(()=>${sourceCode.getText(assertionArgument)}(${responseVariableName}))`
90
- );
91
- } else if (assertionArgument.type === AST_NODE_TYPES.ObjectExpression || assertionArgument.type === AST_NODE_TYPES.CallExpression) {
92
- nonStatusAssertions.push(
93
- `assert.deepEqual(await ${responseVariableName}.json(), ${sourceCode.getText(assertionArgument)})`
94
- );
95
- } else {
96
- throw new Error(`Unexpected Supertest assertion argument: ".expect(${sourceCode.getText(assertionArgument)})`);
97
- }
98
- } else if (expectArguments.length === 2) {
99
- const [headerName, headerValue] = expectArguments;
100
- assert.ok(headerName && headerValue);
101
- const headersReference = destructuringResponseHeadersVariable !== void 0 ? destructuringResponseHeadersVariable.name : `${responseVariableName}.headers`;
102
- if (headerValue.type === AST_NODE_TYPES.Literal && headerValue.value instanceof RegExp) {
103
- nonStatusAssertions.push(
104
- `assert.ok(${headersReference}.get(${sourceCode.getText(headerName)}).match(${sourceCode.getText(headerValue)}))`
105
- );
106
- } else {
107
- nonStatusAssertions.push(
108
- `assert.equal(${headersReference}.get(${sourceCode.getText(headerName)}), ${sourceCode.getText(headerValue)})`
109
- );
110
- }
111
- }
112
- }
113
- return {
114
- statusAssertion,
115
- nonStatusAssertions
116
- };
117
- }
118
- function getResponseVariableNameToUse(supertestFunctionName, scopeManager, fixtureCallInformation, scopeVariablesMap) {
119
- if (fixtureCallInformation.variableAssignment) {
120
- assert.ok(
121
- fixtureCallInformation.variableAssignment.expression.type === AST_NODE_TYPES.AssignmentExpression && fixtureCallInformation.variableAssignment.expression.left.type === AST_NODE_TYPES.Identifier
122
- );
123
- return fixtureCallInformation.variableAssignment.expression.left.name;
124
- }
125
- if (fixtureCallInformation.variableDeclaration) {
126
- const firstDeclaration = fixtureCallInformation.variableDeclaration.declarations[0];
127
- if (firstDeclaration !== void 0 && firstDeclaration.id.type === AST_NODE_TYPES.Identifier) {
128
- return firstDeclaration.id.name;
129
- }
130
- }
131
- const enclosingScopeNode = getEnclosingScopeNode(fixtureCallInformation.rootNode);
132
- scopeManager.getDeclaredVariables(fixtureCallInformation.rootNode);
133
- assert.ok(enclosingScopeNode);
134
- const scope = scopeManager.acquire(enclosingScopeNode);
135
- assert.ok(scope !== null);
136
- let scopeVariables = scopeVariablesMap.get(scope);
137
- if (!scopeVariables) {
138
- scopeVariables = [...scope.set.keys()];
139
- scopeVariablesMap.set(scope, scopeVariables);
140
- }
141
- let responseVariableCounter = 0;
142
- let responseVariableNameToUse;
143
- while (responseVariableNameToUse === void 0) {
144
- responseVariableNameToUse = `${supertestFunctionName}Response${responseVariableCounter === 0 ? "" : responseVariableCounter.toString()}`;
145
- if (scopeVariables.includes(responseVariableNameToUse)) {
146
- responseVariableNameToUse = void 0;
147
- }
148
- responseVariableCounter++;
149
- }
150
- scopeVariables.push(responseVariableNameToUse);
151
- return responseVariableNameToUse;
152
- }
153
- function isResponseBodyRedefinition(responseBodyReference) {
154
- const parent = getParent(responseBodyReference);
155
- return parent?.type === AST_NODE_TYPES.VariableDeclarator && parent.id.type === AST_NODE_TYPES.Identifier;
156
- }
157
- var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
158
- var rule = createRule({
159
- name: ruleId,
160
- meta: {
161
- type: "suggestion",
162
- docs: {
163
- description: "Transform supertest assersions to regular node assertions.",
164
- url: getDocumentationUrl(ruleId)
165
- },
166
- messages: {
167
- preferNativeFetch: "Transform supertest assersions to regular node assertions.",
168
- unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
169
- },
170
- fixable: "code",
171
- schema: []
172
- },
173
- defaultOptions: [],
174
- // eslint-disable-next-line max-lines-per-function
175
- create(context) {
176
- const sourceCode = context.sourceCode;
177
- const scopeManager = sourceCode.scopeManager;
178
- assert.ok(scopeManager !== null);
179
- const scopeVariablesMap = /* @__PURE__ */ new Map();
180
- return {
181
- // eslint-disable-next-line max-lines-per-function
182
- 'CallExpression[callee.property.name="expect"]': (supertestCall) => {
183
- try {
184
- assert.ok(supertestCall.callee.type === AST_NODE_TYPES.MemberExpression);
185
- if (supertestCall.callee.object.type !== AST_NODE_TYPES.CallExpression || supertestCall.callee.object.callee.type === AST_NODE_TYPES.MemberExpression && supertestCall.callee.object.callee.property.type === AST_NODE_TYPES.Identifier && supertestCall.callee.object.callee.property.name === "expect") {
186
- return;
187
- }
188
- if (supertestCall.callee.object.callee.type === AST_NODE_TYPES.MemberExpression && supertestCall.callee.object.callee.object.type === AST_NODE_TYPES.MemberExpression && supertestCall.callee.object.callee.object.object.type === AST_NODE_TYPES.Identifier && supertestCall.callee.object.callee.object.object.name === "fixture" && supertestCall.callee.object.callee.object.property.type === AST_NODE_TYPES.Identifier && supertestCall.callee.object.callee.object.property.name === "api") {
189
- return;
190
- }
191
- const fullSupertestFunctionName = sourceCode.getText(supertestCall.callee.object.callee);
192
- const supertestFunctionName = fullSupertestFunctionName.split(".").pop();
193
- assert.ok(supertestFunctionName !== void 0);
194
- if (isUsedInArrayOrAsArgument(supertestCall) || getEnclosingFunction(supertestCall)?.async === false) {
195
- return;
196
- }
197
- const indentation = getIndentation(supertestCall, sourceCode);
198
- const fixtureCallInformation = {};
199
- const fixtureFunction = supertestCall.callee.object;
200
- analyzeFixtureCall(fixtureFunction, fixtureCallInformation, sourceCode);
201
- fixtureCallInformation.assertions?.flat().map((ass) => sourceCode.getText(ass));
202
- const {
203
- variable: responseVariable,
204
- bodyReferences: responseBodyReferences,
205
- headersReferences: responseHeadersReferences,
206
- statusReferences: responseStatusReferences,
207
- destructuringBodyVariable: destructuringResponseBodyVariable,
208
- destructuringHeadersVariable: destructuringResponseHeadersVariable,
209
- destructuringStatusVariable: destructuringResponseStatusVariable
210
- } = analyzeResponseReferences(fixtureCallInformation.variableDeclaration, scopeManager);
211
- const responseVariableNameToUse = getResponseVariableNameToUse(
212
- supertestFunctionName,
213
- scopeManager,
214
- fixtureCallInformation,
215
- scopeVariablesMap
216
- );
217
- const isResponseBodyVariableRedefinitionNeeded = destructuringResponseBodyVariable !== void 0 || fixtureCallInformation.inlineBodyReference !== void 0 || responseBodyReferences.length > 0 && !responseBodyReferences.some(isResponseBodyRedefinition);
218
- const redefineResponseBodyVariableName = `${responseVariableNameToUse}Body`;
219
- const isResponseStatusVariableRedefinitionNeeded = destructuringResponseStatusVariable !== void 0 || fixtureCallInformation.inlineStatusReference !== void 0;
220
- const redefineResponseStatusVariableName = `${responseVariableNameToUse}Status`;
221
- const isResponseHeadersVariableRedefinitionNeeded = destructuringResponseHeadersVariable !== void 0 && // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
222
- destructuringResponseHeadersVariable.type === AST_NODE_TYPES.ObjectPattern || fixtureCallInformation.inlineHeadersReference !== void 0;
223
- const redefineResponseHeadersVariableName = `${responseVariableNameToUse}Headers`;
224
- const isResponseVariableRedefinitionNeeded = fixtureCallInformation.variableAssignment === void 0 && responseVariable === void 0 && fixtureCallInformation.assertions !== void 0 || isResponseBodyVariableRedefinitionNeeded || isResponseStatusVariableRedefinitionNeeded || isResponseHeadersVariableRedefinitionNeeded;
225
- const responseBodyHeadersVariableRedefineLines = isResponseVariableRedefinitionNeeded ? [
226
- // eslint-disable-next-line no-nested-ternary
227
- ...destructuringResponseBodyVariable ? [
228
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
229
- `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${destructuringResponseBodyVariable.type === AST_NODE_TYPES.ObjectPattern ? sourceCode.getText(destructuringResponseBodyVariable) : destructuringResponseBodyVariable.name} = ${getResponseBodyRetrievalText(responseVariableNameToUse)}`
230
- ] : isResponseBodyVariableRedefinitionNeeded ? [
231
- `const ${redefineResponseBodyVariableName} = ${getResponseBodyRetrievalText(responseVariableNameToUse)}`
232
- ] : [],
233
- // eslint-disable-next-line no-nested-ternary
234
- ...destructuringResponseStatusVariable ? [
235
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
236
- `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${destructuringResponseStatusVariable.type === AST_NODE_TYPES.ObjectPattern ? sourceCode.getText(destructuringResponseStatusVariable) : destructuringResponseStatusVariable.name} = ${getResponseStatusRetrievalText(responseVariableNameToUse)}`
237
- ] : isResponseStatusVariableRedefinitionNeeded ? [
238
- `const ${redefineResponseStatusVariableName} = ${getResponseStatusRetrievalText(responseVariableNameToUse)}`
239
- ] : [],
240
- // eslint-disable-next-line no-nested-ternary
241
- ...destructuringResponseHeadersVariable ? (
242
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
243
- destructuringResponseHeadersVariable.type === AST_NODE_TYPES.ObjectPattern ? destructuringResponseHeadersVariable.properties.map((property) => {
244
- assert.ok(property.type === AST_NODE_TYPES.Property);
245
- assert.ok(property.value.type === AST_NODE_TYPES.Identifier);
246
- return `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${property.value.name} = ${getResponseHeadersRetrievalText(responseVariableNameToUse)}.get(${property.key.type === AST_NODE_TYPES.Literal ? sourceCode.getText(property.key) : `'${sourceCode.getText(property.key)}'`})`;
247
- }) : [
248
- `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${destructuringResponseHeadersVariable.name} = ${getResponseHeadersRetrievalText(responseVariableNameToUse)}`
249
- ]
250
- ) : isResponseHeadersVariableRedefinitionNeeded ? [
251
- `const ${redefineResponseHeadersVariableName} = ${getResponseHeadersRetrievalText(responseVariableNameToUse)}`
252
- ] : []
253
- ] : [];
254
- const { statusAssertion, nonStatusAssertions } = createResponseAssertions(
255
- fixtureCallInformation,
256
- sourceCode,
257
- responseVariableNameToUse,
258
- destructuringResponseHeadersVariable
259
- );
260
- const fetchCallText = sourceCode.getText(fixtureFunction);
261
- const fetchStatementText = !isResponseVariableRedefinitionNeeded ? fetchCallText : `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${responseVariableNameToUse} = await ${fetchCallText}`;
262
- const nodeToReplace = isResponseVariableRedefinitionNeeded ? fixtureCallInformation.rootNode : fixtureCallInformation.fixtureNode;
263
- const appendingAssignmentAndAssertionText = [
264
- "",
265
- ...statusAssertion !== void 0 ? [statusAssertion] : [],
266
- ...responseBodyHeadersVariableRedefineLines,
267
- ...nonStatusAssertions
268
- ].join(`;
269
- ${indentation}`);
270
- context.report({
271
- node: supertestCall,
272
- messageId: "preferNativeFetch",
273
- *fix(fixer) {
274
- if (fixtureCallInformation.inlineStatementNode) {
275
- const preInlineDeclaration = [
276
- fetchStatementText,
277
- `${appendingAssignmentAndAssertionText};
278
- ${indentation}`
279
- ].join(``);
280
- yield fixer.insertTextBefore(fixtureCallInformation.inlineStatementNode, preInlineDeclaration);
281
- } else {
282
- yield fixer.replaceText(nodeToReplace, fetchStatementText);
283
- const needEndingSemiColon = sourceCode.getText(nodeToReplace).endsWith(";");
284
- yield fixer.insertTextAfter(
285
- nodeToReplace,
286
- needEndingSemiColon ? `${appendingAssignmentAndAssertionText};` : appendingAssignmentAndAssertionText
287
- );
288
- }
289
- for (const responseBodyReference of responseBodyReferences) {
290
- yield fixer.replaceText(
291
- responseBodyReference,
292
- isResponseBodyVariableRedefinitionNeeded || !isResponseBodyRedefinition(responseBodyReference) ? redefineResponseBodyVariableName : getResponseBodyRetrievalText(responseVariableNameToUse)
293
- );
294
- }
295
- if (fixtureCallInformation.inlineBodyReference) {
296
- yield fixer.replaceText(fixtureCallInformation.inlineBodyReference, redefineResponseBodyVariableName);
297
- }
298
- for (const responseHeadersReference of responseHeadersReferences) {
299
- const parent = getParent(responseHeadersReference);
300
- assert.ok(parent);
301
- let headerName;
302
- if (parent.type === AST_NODE_TYPES.MemberExpression) {
303
- const headerNameNode = parent.property;
304
- headerName = parent.computed ? sourceCode.getText(headerNameNode) : `'${sourceCode.getText(headerNameNode)}'`;
305
- } else if (parent.type === AST_NODE_TYPES.CallExpression) {
306
- const headerNameNode = parent.arguments[0];
307
- headerName = sourceCode.getText(headerNameNode);
308
- }
309
- assert.ok(headerName !== void 0);
310
- yield fixer.replaceText(parent, `${responseVariableNameToUse}.headers.get(${headerName})`);
311
- }
312
- for (const responseStatusReference of responseStatusReferences) {
313
- if (responseStatusReference.property.type === AST_NODE_TYPES.Identifier && responseStatusReference.property.name === "statusCode") {
314
- yield fixer.replaceText(responseStatusReference.property, `status`);
315
- }
316
- }
317
- if (fixtureCallInformation.rootNode.type === AST_NODE_TYPES.ReturnStatement && fixtureCallInformation.assertions !== void 0) {
318
- yield fixer.insertTextAfter(
319
- fixtureCallInformation.rootNode,
320
- `
321
- ${indentation}return ${responseVariableNameToUse};`
322
- );
323
- }
324
- }
325
- });
326
- } catch (error) {
327
- console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
328
- context.report({
329
- node: supertestCall,
330
- messageId: "unknownError",
331
- data: {
332
- fileName: context.filename,
333
- error: error instanceof Error ? error.toString() : JSON.stringify(error)
334
- }
335
- });
336
- }
337
- }
338
- };
339
- }
340
- });
341
- var no_supertest_default = rule;
342
- export {
343
- no_supertest_default as default,
344
- ruleId
345
- };
346
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L25vLXN1cGVydGVzdC50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxTQUFTLFVBQVUsY0FBYztBQUVqQyxTQUFTLGdCQUFnQixtQkFBNkI7QUFJdEQ7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxPQUFPLHlCQUF5QjtBQUNoQyxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLGlDQUFpQztBQUMxQyxTQUFTLDhCQUE4QixpQ0FBaUMsc0NBQXNDO0FBRXZHLElBQU0sU0FBUztBQXFCdEIsU0FBUyxtQkFBbUIsTUFBK0IsU0FBaUMsWUFBd0I7QUFDbEgsUUFBTSxTQUFTLFVBQVUsSUFBSTtBQUM3QixTQUFPLEdBQUcsUUFBUSxxREFBcUQ7QUFFdkUsTUFBSTtBQUNKLE1BQUksT0FBTyxTQUFTLGVBQWUsaUJBQWlCO0FBRWxELFlBQVEsY0FBYztBQUN0QixZQUFRLFdBQVc7QUFBQSxFQUNyQixXQUNFLE9BQU8sU0FBUyxlQUFlLG1CQUMvQixPQUFPLFNBQVMsZUFBZSxrQkFDL0IsT0FBTyxTQUFTLGVBQWUseUJBQy9CO0FBRUEsWUFBUSxjQUFjO0FBQ3RCLFlBQVEsV0FBVztBQUFBLEVBQ3JCLFdBQVcsT0FBTyxTQUFTLGVBQWUsaUJBQWlCO0FBQ3pELFlBQVEsY0FBYztBQUN0QixVQUFNLHFCQUFxQixzQkFBc0IsTUFBTTtBQUN2RCxXQUFPLEdBQUcsa0JBQWtCO0FBQzVCLFVBQU0sY0FBYyxVQUFVLE1BQU07QUFDcEMsUUFBSSxhQUFhLFNBQVMsZUFBZSxrQkFBa0I7QUFDekQsY0FBUSxXQUFXO0FBQ25CLGNBQVEsc0JBQXNCO0FBQzlCLFVBQUksWUFBWSxTQUFTLFNBQVMsZUFBZSxjQUFjLFlBQVksU0FBUyxTQUFTLFFBQVE7QUFDbkcsZ0JBQVEsc0JBQXNCO0FBQUEsTUFDaEM7QUFDQSxVQUNFLFlBQVksU0FBUyxTQUFTLGVBQWUsZUFDNUMsWUFB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