@checkdigit/eslint-plugin 6.6.0-PR.75-0fc6 → 6.6.0-PR.77-885a

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 (64) hide show
  1. package/dist-cjs/index.cjs +779 -2464
  2. package/dist-cjs/metafile.json +203 -795
  3. package/dist-mjs/index.mjs +3 -77
  4. package/dist-mjs/require-resolve-full-response.mjs +5 -2
  5. package/dist-types/index.d.ts +1 -51
  6. package/dist-types/require-resolve-full-response.d.ts +3 -1
  7. package/package.json +1 -1
  8. package/src/index.ts +0 -74
  9. package/src/library/format.ts +1 -1
  10. package/src/library/tree.ts +1 -1
  11. package/src/library/ts-tree.ts +1 -1
  12. package/src/library/variable.ts +1 -1
  13. package/src/require-resolve-full-response.ts +2 -1
  14. package/dist-mjs/agent/add-url-domain.mjs +0 -61
  15. package/dist-mjs/agent/fetch-response-body-json.mjs +0 -63
  16. package/dist-mjs/agent/fetch-response-header-getter.mjs +0 -117
  17. package/dist-mjs/agent/fetch-then.mjs +0 -269
  18. package/dist-mjs/agent/fetch.mjs +0 -34
  19. package/dist-mjs/agent/no-fixture.mjs +0 -328
  20. package/dist-mjs/agent/no-full-response.mjs +0 -67
  21. package/dist-mjs/agent/no-mapped-response.mjs +0 -75
  22. package/dist-mjs/agent/no-service-wrapper.mjs +0 -184
  23. package/dist-mjs/agent/no-status-code.mjs +0 -59
  24. package/dist-mjs/agent/no-unused-function-argument.mjs +0 -79
  25. package/dist-mjs/agent/no-unused-service-variable.mjs +0 -75
  26. package/dist-mjs/agent/response-reference.mjs +0 -56
  27. package/dist-mjs/agent/url.mjs +0 -26
  28. package/dist-mjs/no-duplicated-imports.mjs +0 -87
  29. package/dist-mjs/require-fixed-services-import.mjs +0 -46
  30. package/dist-mjs/require-type-out-of-type-only-imports.mjs +0 -48
  31. package/dist-types/agent/add-url-domain.d.ts +0 -4
  32. package/dist-types/agent/fetch-response-body-json.d.ts +0 -4
  33. package/dist-types/agent/fetch-response-header-getter.d.ts +0 -4
  34. package/dist-types/agent/fetch-then.d.ts +0 -4
  35. package/dist-types/agent/fetch.d.ts +0 -4
  36. package/dist-types/agent/no-fixture.d.ts +0 -4
  37. package/dist-types/agent/no-full-response.d.ts +0 -4
  38. package/dist-types/agent/no-mapped-response.d.ts +0 -4
  39. package/dist-types/agent/no-service-wrapper.d.ts +0 -4
  40. package/dist-types/agent/no-status-code.d.ts +0 -4
  41. package/dist-types/agent/no-unused-function-argument.d.ts +0 -4
  42. package/dist-types/agent/no-unused-service-variable.d.ts +0 -4
  43. package/dist-types/agent/response-reference.d.ts +0 -16
  44. package/dist-types/agent/url.d.ts +0 -5
  45. package/dist-types/no-duplicated-imports.d.ts +0 -4
  46. package/dist-types/require-fixed-services-import.d.ts +0 -4
  47. package/dist-types/require-type-out-of-type-only-imports.d.ts +0 -4
  48. package/src/agent/add-url-domain.ts +0 -75
  49. package/src/agent/fetch-response-body-json.ts +0 -76
  50. package/src/agent/fetch-response-header-getter.ts +0 -148
  51. package/src/agent/fetch-then.ts +0 -354
  52. package/src/agent/fetch.ts +0 -52
  53. package/src/agent/no-fixture.ts +0 -453
  54. package/src/agent/no-full-response.ts +0 -75
  55. package/src/agent/no-mapped-response.ts +0 -84
  56. package/src/agent/no-service-wrapper.ts +0 -238
  57. package/src/agent/no-status-code.ts +0 -71
  58. package/src/agent/no-unused-function-argument.ts +0 -96
  59. package/src/agent/no-unused-service-variable.ts +0 -92
  60. package/src/agent/response-reference.ts +0 -100
  61. package/src/agent/url.ts +0 -23
  62. package/src/no-duplicated-imports.ts +0 -116
  63. package/src/require-fixed-services-import.ts +0 -52
  64. package/src/require-type-out-of-type-only-imports.ts +0 -63
@@ -1,117 +0,0 @@
1
- // src/agent/fetch-response-header-getter.ts
2
- import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
3
- import getDocumentationUrl from "../get-documentation-url.mjs";
4
- var ruleId = "fetch-response-header-getter-ts";
5
- var HEADER_BUILTIN_FUNCTIONS = Object.keys(Headers.prototype);
6
- var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
7
- var rule = createRule({
8
- name: ruleId,
9
- meta: {
10
- type: "suggestion",
11
- docs: {
12
- description: 'Use "get()" method to get header value from the headers object of the fetch response.'
13
- },
14
- messages: {
15
- useGetter: 'Use "get()" method to get header value from the headers object of the fetch response.',
16
- unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
17
- },
18
- fixable: "code",
19
- schema: []
20
- },
21
- defaultOptions: [],
22
- create(context) {
23
- const parserServices = ESLintUtils.getParserServices(context);
24
- const typeChecker = parserServices.program.getTypeChecker();
25
- const sourceCode = context.sourceCode;
26
- return {
27
- MemberExpression: (responseHeadersAccess) => {
28
- try {
29
- if (responseHeadersAccess.property.type === AST_NODE_TYPES.Identifier && HEADER_BUILTIN_FUNCTIONS.includes(responseHeadersAccess.property.name)) {
30
- return;
31
- }
32
- const responseHeadersTsNode = parserServices.esTreeNodeToTSNodeMap.get(responseHeadersAccess.object);
33
- let responseHeadersType = typeChecker.getTypeAtLocation(responseHeadersTsNode);
34
- responseHeadersType = responseHeadersType.isUnion() ? responseHeadersType.types[0] : responseHeadersType;
35
- const responseHeadersTypeName = (
36
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
37
- (responseHeadersType.symbol ?? responseHeadersType.aliasSymbol)?.escapedName
38
- );
39
- if (responseHeadersTypeName !== "Headers" && responseHeadersTypeName !== "HeaderGetter") {
40
- return;
41
- }
42
- let replacementText;
43
- if (!responseHeadersAccess.computed) {
44
- replacementText = `${sourceCode.getText(responseHeadersAccess.object)}.get('${sourceCode.getText(responseHeadersAccess.property)}')`;
45
- } else if (responseHeadersAccess.property.type === AST_NODE_TYPES.Identifier || responseHeadersAccess.property.type === AST_NODE_TYPES.Literal || responseHeadersAccess.property.type === AST_NODE_TYPES.TemplateLiteral) {
46
- replacementText = `${sourceCode.getText(responseHeadersAccess.object)}.get(${sourceCode.getText(responseHeadersAccess.property)})`;
47
- } else {
48
- throw new Error(`Unexpected property type: ${responseHeadersAccess.property.type}`);
49
- }
50
- context.report({
51
- messageId: "useGetter",
52
- node: responseHeadersAccess.property,
53
- fix(fixer) {
54
- return fixer.replaceText(responseHeadersAccess, replacementText);
55
- }
56
- });
57
- } catch (error) {
58
- console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
59
- context.report({
60
- node: responseHeadersAccess,
61
- messageId: "unknownError",
62
- data: {
63
- fileName: context.filename,
64
- error: error instanceof Error ? error.toString() : JSON.stringify(error)
65
- }
66
- });
67
- }
68
- },
69
- // convert response.get() to response.headers.get()
70
- 'CallExpression[callee.property.name="get"]': (responseHeadersAccess) => {
71
- try {
72
- if (responseHeadersAccess.callee.type !== AST_NODE_TYPES.MemberExpression) {
73
- return;
74
- }
75
- if (responseHeadersAccess.callee.object.type !== AST_NODE_TYPES.Identifier || responseHeadersAccess.callee.object.name === "request") {
76
- return;
77
- }
78
- const responseNode = responseHeadersAccess.callee.object;
79
- const responseHeadersTsNode = parserServices.esTreeNodeToTSNodeMap.get(responseNode);
80
- const responseType = typeChecker.getTypeAtLocation(responseHeadersTsNode);
81
- const typeName = typeChecker.typeToString(responseType);
82
- if (typeName === "InboundContext" || typeName.endsWith("RequestType")) {
83
- return;
84
- }
85
- const hasHeadersProperty = responseType.getProperties().some((symbol) => symbol.name === "headers");
86
- if (!hasHeadersProperty) {
87
- return;
88
- }
89
- const replacementText = `${sourceCode.getText(responseNode)}.headers`;
90
- context.report({
91
- messageId: "useGetter",
92
- node: responseHeadersAccess,
93
- fix(fixer) {
94
- return fixer.replaceText(responseNode, replacementText);
95
- }
96
- });
97
- } catch (error) {
98
- console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
99
- context.report({
100
- node: responseHeadersAccess,
101
- messageId: "unknownError",
102
- data: {
103
- fileName: context.filename,
104
- error: error instanceof Error ? error.toString() : JSON.stringify(error)
105
- }
106
- });
107
- }
108
- }
109
- };
110
- }
111
- });
112
- var fetch_response_header_getter_default = rule;
113
- export {
114
- fetch_response_header_getter_default as default,
115
- ruleId
116
- };
117
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L2ZldGNoLXJlc3BvbnNlLWhlYWRlci1nZXR0ZXIudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBUUEsU0FBUyxnQkFBZ0IsbUJBQTZCO0FBQ3RELE9BQU8seUJBQXlCO0FBRXpCLElBQU0sU0FBUztBQUN0QixJQUFNLDJCQUEyQixPQUFPLEtBQUssUUFBUSxTQUFTO0FBRTlELElBQU0sYUFBYSxZQUFZLFlBQVksQ0FBQyxTQUFTLG9CQUFvQixJQUFJLENBQUM7QUFFOUUsSUFBTSxPQUFPLFdBQVc7QUFBQSxFQUN0QixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsTUFDSixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IsV0FBVztBQUFBLE1BQ1gsY0FBYztBQUFBLElBQ2hCO0FBQUEsSUFDQSxTQUFTO0FBQUEsSUFDVCxRQUFRLENBQUM7QUFBQSxFQUNYO0FBQUEsRUFDQSxnQkFBZ0IsQ0FBQztBQUFBLEVBQ2pCLE9BQU8sU0FBUztBQUNkLFVBQU0saUJBQWlCLFlBQVksa0JBQWtCLE9BQU87QUFDNUQsVUFBTSxjQUFjLGVBQWUsUUFBUSxlQUFlO0FBQzFELFVBQU0sYUFBYSxRQUFRO0FBRTNCLFdBQU87QUFBQSxNQUNMLGtCQUFrQixDQUFDLDBCQUFxRDtBQUN0RSxZQUFJO0FBQ0YsY0FDRSxzQkFBc0IsU0FBUyxTQUFTLGVBQWUsY0FDdkQseUJBQXlCLFNBQVMsc0JBQXNCLFNBQVMsSUFBSSxHQUNyRTtBQUVBO0FBQUEsVUFDRjtBQUVBLGdCQUFNLHdCQUF3QixlQUFlLHNCQUFzQixJQUFJLHNCQUFzQixNQUFNO0FBQ25HLGNBQUksc0JBQXNCLFlBQVksa0JBQWtCLHFCQUFxQjtBQUU3RSxnQ0FBc0Isb0JBQW9CLFFBQVEsSUFBSSxvQkFBb0IsTUFBTSxDQUFDLElBQUs7QUFFdEYsZ0JBQU07QUFBQTtBQUFBLGFBQ0gsb0JBQW9CLFVBQVUs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
@@ -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=