@checkdigit/eslint-plugin 6.6.0-PR.75-e80b → 6.6.0-PR.75-b2d2

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.
@@ -33,9 +33,30 @@
33
33
  ],
34
34
  "format": "esm"
35
35
  },
36
+ "src/ast/tree.ts": {
37
+ "bytes": 885,
38
+ "imports": [],
39
+ "format": "esm"
40
+ },
41
+ "src/ast/format.ts": {
42
+ "bytes": 532,
43
+ "imports": [
44
+ {
45
+ "path": "node:assert",
46
+ "kind": "import-statement",
47
+ "external": true
48
+ }
49
+ ],
50
+ "format": "esm"
51
+ },
36
52
  "src/no-fixture.ts": {
37
- "bytes": 17450,
53
+ "bytes": 19194,
38
54
  "imports": [
55
+ {
56
+ "path": "src/ast/tree.ts",
57
+ "kind": "import-statement",
58
+ "original": "./ast/tree"
59
+ },
39
60
  {
40
61
  "path": "node:assert",
41
62
  "kind": "import-statement",
@@ -45,6 +66,11 @@
45
66
  "path": "src/get-documentation-url.ts",
46
67
  "kind": "import-statement",
47
68
  "original": "./get-documentation-url"
69
+ },
70
+ {
71
+ "path": "src/ast/format.ts",
72
+ "kind": "import-statement",
73
+ "original": "./ast/format"
48
74
  }
49
75
  ],
50
76
  "format": "esm"
@@ -175,6 +201,11 @@
175
201
  "outputs": {
176
202
  "dist-cjs/index.cjs": {
177
203
  "imports": [
204
+ {
205
+ "path": "node:assert",
206
+ "kind": "require-call",
207
+ "external": true
208
+ },
178
209
  {
179
210
  "path": "node:assert",
180
211
  "kind": "require-call",
@@ -196,8 +227,14 @@
196
227
  "src/invalid-json-stringify.ts": {
197
228
  "bytesInOutput": 2471
198
229
  },
230
+ "src/ast/tree.ts": {
231
+ "bytesInOutput": 457
232
+ },
233
+ "src/ast/format.ts": {
234
+ "bytesInOutput": 320
235
+ },
199
236
  "src/no-fixture.ts": {
200
- "bytesInOutput": 14478
237
+ "bytesInOutput": 15604
201
238
  },
202
239
  "src/no-promise-instance-method.ts": {
203
240
  "bytesInOutput": 1275
@@ -230,7 +267,7 @@
230
267
  "bytesInOutput": 3362
231
268
  }
232
269
  },
233
- "bytes": 81184
270
+ "bytes": 84405
234
271
  }
235
272
  }
236
273
  }
@@ -0,0 +1,13 @@
1
+ // src/ast/format.ts
2
+ import { strict as assert } from "node:assert";
3
+ function getIndentation(node, sourceCode) {
4
+ assert.ok(node.loc);
5
+ const line = sourceCode.lines[node.loc.start.line - 1];
6
+ assert.ok(line);
7
+ const indentMatch = line.match(/^\s*/u);
8
+ return indentMatch ? indentMatch[0] : "";
9
+ }
10
+ export {
11
+ getIndentation
12
+ };
13
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FzdC9mb3JtYXQudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBVUEsU0FBUyxVQUFVLGNBQWM7QUFFMUIsU0FBUyxlQUFlLE1BQVksWUFBd0I7QUFDakUsU0FBTyxHQUFHLEtBQUssR0FBRztBQUNsQixRQUFNLE9BQU8sV0FBVyxNQUFNLEtBQUssSUFBSSxNQUFNLE9BQU8sQ0FBQztBQUNyRCxTQUFPLEdBQUcsSUFBSTtBQUNkLFFBQU0sY0FBYyxLQUFLLE1BQU0sT0FBTztBQUN0QyxTQUFPLGNBQWMsWUFBWSxDQUFDLElBQUk7QUFDeEM7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,20 @@
1
+ // src/ast/tree.ts
2
+ function getParent(node) {
3
+ return node.parent;
4
+ }
5
+ function getAncestor(node, matcher, typeToExit) {
6
+ const parent = getParent(node);
7
+ if (!parent || typeToExit !== void 0 && parent.type === typeToExit) {
8
+ return void 0;
9
+ } else if (typeof matcher === "string" && parent.type === matcher) {
10
+ return parent;
11
+ } else if (typeof matcher === "function" && matcher(parent)) {
12
+ return parent;
13
+ }
14
+ return getAncestor(parent, matcher, typeToExit);
15
+ }
16
+ export {
17
+ getAncestor,
18
+ getParent
19
+ };
20
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FzdC90cmVlLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQWdCTyxTQUFTLFVBQVUsTUFBcUM7QUFDN0QsU0FBUSxLQUF3QztBQUNsRDtBQUVPLFNBQVMsWUFBWSxNQUFZLFNBQWlELFlBQXFCO0FBQzVHLFFBQU0sU0FBUyxVQUFVLElBQUk7QUFDN0IsTUFBSSxDQUFDLFVBQVcsZUFBZSxVQUFhLE9BQU8sU0FBUyxZQUFhO0FBQ3ZFLFdBQU87QUFBQSxFQUNULFdBQVcsT0FBTyxZQUFZLFlBQVksT0FBTyxTQUFTLFNBQVM7QUFDakUsV0FBTztBQUFBLEVBQ1QsV0FBVyxPQUFPLFlBQVksY0FBYyxRQUFRLE1BQU0sR0FBRztBQUMzRCxXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU8sWUFBWSxRQUFRLFNBQVMsVUFBVTtBQUNoRDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -1,16 +1,25 @@
1
1
  // src/no-fixture.ts
2
+ import { getAncestor, getParent } from "./ast/tree.mjs";
2
3
  import { strict as assert } from "node:assert";
3
4
  import getDocumentationUrl from "./get-documentation-url.mjs";
5
+ import { getIndentation } from "./ast/format.mjs";
4
6
  var ruleId = "no-fixture";
5
- function getParent(node) {
6
- return node.parent;
7
- }
8
- function analyze(call, results) {
7
+ function analyzeFixtureCall(call, results) {
9
8
  const parent = getParent(call);
10
9
  assert.ok(parent, "parent should exist for fixture/supertest call node");
11
10
  let nextCall;
12
- if (parent.type === "AwaitExpression" || parent.type === "ReturnStatement") {
13
- results.root = parent;
11
+ if (parent.type === "ReturnStatement") {
12
+ results.fixtureNode = call;
13
+ results.rootNode = parent;
14
+ } else if (parent.type === "AwaitExpression") {
15
+ results.fixtureNode = call;
16
+ const variableDeclaration = getAncestor(parent, "VariableDeclaration", "FunctionDeclaration");
17
+ if (variableDeclaration?.type === "VariableDeclaration") {
18
+ results.variableDeclaration = variableDeclaration;
19
+ results.rootNode = variableDeclaration;
20
+ } else {
21
+ results.rootNode = parent;
22
+ }
14
23
  } else if (parent.type === "MemberExpression" && parent.property.type === "Identifier") {
15
24
  if (parent.property.name === "expect") {
16
25
  const assertionCall = getParent(parent);
@@ -33,29 +42,73 @@ function analyze(call, results) {
33
42
  throw new Error(`Unexpected expression in fixture/supertest call ${String(parent)}`);
34
43
  }
35
44
  if (nextCall) {
36
- analyze(nextCall, results);
45
+ analyzeFixtureCall(nextCall, results);
37
46
  }
38
47
  }
48
+ function analyzeResponseReferences(fixtureInformation, scopeManager) {
49
+ const results = {
50
+ bodyReferences: [],
51
+ headersReferences: [],
52
+ statusReferences: []
53
+ };
54
+ if (fixtureInformation.variableDeclaration) {
55
+ const responseVariables = scopeManager.getDeclaredVariables(fixtureInformation.variableDeclaration);
56
+ for (const responseVariable of responseVariables) {
57
+ const identifier = responseVariable.identifiers[0];
58
+ assert.ok(identifier);
59
+ const identifierParent = getParent(identifier);
60
+ assert.ok(identifierParent);
61
+ if (identifierParent.type === "VariableDeclarator") {
62
+ results.variable = responseVariable;
63
+ results.bodyReferences = responseVariable.references.map((responseBodyReference) => getParent(responseBodyReference.identifier)).filter(
64
+ (node) => node !== null && node !== void 0 && node.type === "MemberExpression" && node.property.type === "Identifier" && node.property.name === "body"
65
+ );
66
+ results.headersReferences = responseVariable.references.map((responseHeadersReference) => getParent(responseHeadersReference.identifier)).filter(
67
+ (node) => node !== null && node !== void 0 && node.type === "MemberExpression" && node.property.type === "Identifier" && (node.property.name === "header" || node.property.name === "headers" || node.property.name === "get")
68
+ );
69
+ results.statusReferences = responseVariable.references.map((responseHeadersReference) => getParent(responseHeadersReference.identifier)).filter(
70
+ (node) => node !== null && node !== void 0 && node.type === "MemberExpression" && node.property.type === "Identifier" && (node.property.name === "status" || node.property.name === "statusCode")
71
+ );
72
+ } else if (
73
+ // body reference through destruction/renaming, e.g. "const { body } = ..."
74
+ identifierParent.type === "Property" && identifierParent.key.type === "Identifier" && identifierParent.key.name === "body"
75
+ ) {
76
+ results.spreadBodyVariable = responseVariable;
77
+ } else if (
78
+ // header reference through destruction/renaming, e.g. "const { headers } = ..."
79
+ identifierParent.type === "Property" && identifierParent.key.type === "Identifier" && identifierParent.key.name === "headers"
80
+ ) {
81
+ results.spreadHeadersVariable = responseVariable;
82
+ } else {
83
+ throw new Error(`Unknown response variable reference: ${responseVariable.name}`);
84
+ }
85
+ }
86
+ }
87
+ return results;
88
+ }
39
89
  function replaceEndpointUrlPrefixWithBasePath(url) {
40
90
  return url.replace(/`\/\w+(?<parts>-\w+)*\/v\d+\//u, "`${BASE_PATH}/");
41
91
  }
42
92
  function isValidPropertyName(name) {
43
93
  return typeof name === "string" && /^[a-zA-Z_$][a-zA-Z_$0-9]*$/u.test(name);
44
94
  }
45
- function appendAssertions(expects, sourceCode, variableName) {
46
- const assertions = [];
47
- for (const expectArguments of expects) {
95
+ function createResponseAssertions(fixtureCallInformation, sourceCode, variableName) {
96
+ let statusAssertion;
97
+ const nonStatusAssertions = [];
98
+ for (const expectArguments of fixtureCallInformation.assertions ?? []) {
48
99
  if (expectArguments.length === 1) {
49
100
  const [assertionArgument] = expectArguments;
50
101
  assert.ok(assertionArgument);
51
102
  if (assertionArgument.type === "MemberExpression" && assertionArgument.object.type === "Identifier" && assertionArgument.object.name === "StatusCodes" || assertionArgument.type === "Literal") {
52
- assertions.push(`assert.equal(${variableName}.status, ${sourceCode.getText(assertionArgument)})`);
103
+ statusAssertion = `assert.equal(${variableName}.status, ${sourceCode.getText(assertionArgument)})`;
53
104
  } else if (assertionArgument.type === "ArrowFunctionExpression") {
54
- assertions.push(`assert.ok(${sourceCode.getText(assertionArgument)})`);
105
+ nonStatusAssertions.push(`assert.ok(${sourceCode.getText(assertionArgument)})`);
55
106
  } else if (assertionArgument.type === "Identifier") {
56
- assertions.push(`assert.ok(${sourceCode.getText(assertionArgument)}(${variableName}))`);
107
+ nonStatusAssertions.push(`assert.ok(${sourceCode.getText(assertionArgument)}(${variableName}))`);
57
108
  } else if (assertionArgument.type === "ObjectExpression" || assertionArgument.type === "CallExpression") {
58
- assertions.push(`assert.deepEqual(await ${variableName}.json(), ${sourceCode.getText(assertionArgument)})`);
109
+ nonStatusAssertions.push(
110
+ `assert.deepEqual(await ${variableName}.json(), ${sourceCode.getText(assertionArgument)})`
111
+ );
59
112
  } else {
60
113
  throw new Error(`Unexpected Supertest assertion argument: ".expect(${sourceCode.getText(assertionArgument)})`);
61
114
  }
@@ -63,63 +116,52 @@ function appendAssertions(expects, sourceCode, variableName) {
63
116
  const [headerName, headerValue] = expectArguments;
64
117
  assert.ok(headerName && headerValue);
65
118
  if (headerValue.type === "Literal" && headerValue.value instanceof RegExp) {
66
- assertions.push(
119
+ nonStatusAssertions.push(
67
120
  `assert.ok(${variableName}.headers.get(${sourceCode.getText(headerName)}).match(${sourceCode.getText(headerValue)}))`
68
121
  );
69
122
  } else {
70
- assertions.push(
123
+ nonStatusAssertions.push(
71
124
  `assert.equal(${variableName}.headers.get(${sourceCode.getText(headerName)}), ${sourceCode.getText(headerValue)})`
72
125
  );
73
126
  }
74
127
  }
75
128
  }
76
- return assertions;
129
+ return {
130
+ statusAssertion,
131
+ nonStatusAssertions
132
+ };
77
133
  }
78
- function getAncestor(node, matchType, quitType) {
79
- const parent = getParent(node);
80
- if (!parent || parent.type === quitType) {
81
- return void 0;
82
- } else if (parent.type === matchType) {
83
- return parent;
134
+ function getResponseVariableNameToUse(scopeManager, fixtureCallInformation, scopeVariablesMap) {
135
+ if (fixtureCallInformation.variableDeclaration) {
136
+ const firstDeclaration = fixtureCallInformation.variableDeclaration.declarations[0];
137
+ if (firstDeclaration && firstDeclaration.id.type === "Identifier") {
138
+ return firstDeclaration.id.name;
139
+ }
84
140
  }
85
- return getAncestor(parent, matchType, quitType);
86
- }
87
- function analyzeReferences(fixtureCall, scopeManager) {
88
- const results = {
89
- responseBodyReferences: [],
90
- responseHeadersReferences: []
91
- };
92
- const variableDeclaration = getAncestor(fixtureCall, "VariableDeclaration", "FunctionDeclaration");
93
- if (variableDeclaration && variableDeclaration.type === "VariableDeclaration") {
94
- const responseVariables = scopeManager.getDeclaredVariables(variableDeclaration);
95
- for (const responseVariable of responseVariables) {
96
- const identifier = responseVariable.identifiers[0];
97
- assert.ok(identifier);
98
- const identifierParent = getParent(identifier);
99
- assert.ok(identifierParent);
100
- if (identifierParent.type === "VariableDeclarator") {
101
- results.responseVariable = responseVariable;
102
- results.responseBodyReferences = responseVariable.references.map((responseBodyReference) => getParent(responseBodyReference.identifier)).filter(
103
- (node) => node !== null && node !== void 0 && node.type === "MemberExpression" && node.property.type === "Identifier" && node.property.name === "body"
104
- );
105
- results.responseHeadersReferences = responseVariable.references.map((responseHeadersReference) => getParent(responseHeadersReference.identifier)).filter(
106
- (node) => node !== null && node !== void 0 && node.type === "MemberExpression" && node.property.type === "Identifier" && (node.property.name === "header" || node.property.name === "headers" || node.property.name === "get")
107
- );
108
- } else if (identifierParent.type === "Property" && identifierParent.key.type === "Identifier" && identifierParent.key.name === "body") {
109
- results.spreadResponseBodyVariable = responseVariable;
110
- } else if (identifierParent.type === "Property" && identifierParent.key.type === "Identifier" && identifierParent.key.name === "headers") {
111
- results.spreadResponseHeadersVariable = responseVariable;
112
- }
141
+ const closestFunctionExpression = getAncestor(
142
+ fixtureCallInformation.rootNode,
143
+ (node) => ["FunctionExpression", "ArrowFunctionExpression"].includes(node.type)
144
+ );
145
+ scopeManager.getDeclaredVariables(fixtureCallInformation.rootNode);
146
+ assert.ok(closestFunctionExpression);
147
+ const scope = scopeManager.acquire(closestFunctionExpression);
148
+ assert.ok(scope !== null);
149
+ let scopeVariables = scopeVariablesMap.get(scope);
150
+ if (!scopeVariables) {
151
+ scopeVariables = [...scope.set.keys()];
152
+ scopeVariablesMap.set(scope, scopeVariables);
153
+ }
154
+ let responseVariableCounter = 0;
155
+ let responseVariableNameToUse;
156
+ while (responseVariableNameToUse === void 0) {
157
+ responseVariableCounter++;
158
+ responseVariableNameToUse = `response${responseVariableCounter === 1 ? "" : responseVariableCounter.toString()}`;
159
+ if (scopeVariables.includes(responseVariableNameToUse)) {
160
+ responseVariableNameToUse = void 0;
113
161
  }
114
162
  }
115
- return results;
116
- }
117
- function getIndentation(node, sourceCode) {
118
- assert.ok(node.loc);
119
- const line = sourceCode.lines[node.loc.start.line - 1];
120
- assert.ok(line);
121
- const indentMatch = line.match(/^\s*/u);
122
- return indentMatch ? indentMatch[0] : "";
163
+ scopeVariables.push(responseVariableNameToUse);
164
+ return responseVariableNameToUse;
123
165
  }
124
166
  var rule = {
125
167
  meta: {
@@ -138,98 +180,84 @@ var rule = {
138
180
  create(context) {
139
181
  const sourceCode = context.sourceCode;
140
182
  const scopeManager = sourceCode.scopeManager;
141
- let variableCounter = 0;
183
+ const scopeVariablesMap = /* @__PURE__ */ new Map();
142
184
  return {
143
185
  'CallExpression[callee.object.object.name="fixture"][callee.object.property.name="api"]': (fixtureCall) => {
144
186
  try {
145
187
  assert.ok(fixtureCall.type === "CallExpression");
146
188
  const fixtureFunction = fixtureCall.callee;
147
189
  assert.ok(fixtureFunction.type === "MemberExpression");
148
- const methodNode = fixtureFunction.property;
149
- assert.ok(methodNode.type === "Identifier");
150
190
  const indentation = getIndentation(fixtureCall, sourceCode);
151
191
  const [urlArgumentNode] = fixtureCall.arguments;
152
192
  assert.ok(urlArgumentNode !== void 0);
153
193
  const fixtureCallInformation = {};
154
- analyze(fixtureCall, fixtureCallInformation);
194
+ analyzeFixtureCall(fixtureCall, fixtureCallInformation);
155
195
  const {
156
- responseVariable,
157
- responseBodyReferences,
158
- responseHeadersReferences,
159
- spreadResponseBodyVariable,
160
- spreadResponseHeadersVariable
161
- } = analyzeReferences(fixtureCallInformation.root, scopeManager);
162
- let variableNameToUse;
163
- let isResponseVariableDeclared = false;
164
- if (responseVariable === void 0) {
165
- variableNameToUse = `response${variableCounter === 0 ? "" : variableCounter.toString()}`;
166
- variableCounter++;
167
- } else {
168
- isResponseVariableDeclared = true;
169
- variableNameToUse = responseVariable.name;
170
- }
171
- const fixtureApiCallText = sourceCode.getText(fixtureCall);
172
- const fixtureMethodText = sourceCode.getText(fixtureFunction);
173
- const fetchStatementStart = fixtureCallInformation.root.type === "ReturnStatement" && fixtureCallInformation.assertions === void 0 ? "return" : "await";
174
- let replacedText = fixtureApiCallText.replace(fixtureMethodText, `${fetchStatementStart} fetch`);
175
- const fixtureArgumentText = sourceCode.getText(urlArgumentNode);
176
- let fetchArgumentText = replaceEndpointUrlPrefixWithBasePath(fixtureArgumentText);
177
- if (methodNode.name !== "get" || fixtureCallInformation.requestBody !== void 0 || fixtureCallInformation.requestHeaders !== void 0) {
178
- fetchArgumentText += [
179
- ", {",
180
- ` method: '${methodNode.name.toUpperCase()}',`,
181
- ...fixtureCallInformation.requestBody ? [` body: JSON.stringify(${sourceCode.getText(fixtureCallInformation.requestBody)}),`] : [],
182
- ...fixtureCallInformation.requestHeaders ? [
183
- ` headers: {`,
184
- ...fixtureCallInformation.requestHeaders.map(
185
- ({ name, value }) => (
186
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions, no-nested-ternary, sonarjs/no-nested-template-literals
187
- ` ${name.type === "Literal" ? isValidPropertyName(name.value) ? name.value : `'${name.value}'` : `[${sourceCode.getText(name)}]`}: ${sourceCode.getText(value)},`
188
- )
189
- ),
190
- ` },`
191
- ] : [],
192
- "}"
193
- ].join(`
194
- ${indentation}`);
195
- }
196
- replacedText = replacedText.replace(fixtureArgumentText, fetchArgumentText);
197
- const needVariableRedefine = spreadResponseBodyVariable !== void 0 || (responseVariable === void 0 && fixtureCallInformation.assertions) !== void 0;
198
- if (needVariableRedefine) {
199
- replacedText = [
200
- replacedText,
201
- ...spreadResponseBodyVariable ? [`const ${spreadResponseBodyVariable.name} = await ${variableNameToUse}.json()`] : [],
202
- ...spreadResponseHeadersVariable ? [`const ${spreadResponseHeadersVariable.name} = ${variableNameToUse}.headers`] : []
203
- ].join(`;
196
+ variable: responseVariable,
197
+ bodyReferences: responseBodyReferences,
198
+ headersReferences: responseHeadersReferences,
199
+ statusReferences: responseStatusReferences,
200
+ spreadBodyVariable: spreadResponseBodyVariable,
201
+ spreadHeadersVariable: spreadResponseHeadersVariable
202
+ } = analyzeResponseReferences(fixtureCallInformation, scopeManager);
203
+ const originalUrlArgumentText = sourceCode.getText(urlArgumentNode);
204
+ const fetchUrlArgumentText = replaceEndpointUrlPrefixWithBasePath(originalUrlArgumentText);
205
+ const methodNode = fixtureFunction.property;
206
+ assert.ok(methodNode.type === "Identifier");
207
+ const fetchRequestArgumentLines = [
208
+ "{",
209
+ ` method: '${methodNode.name.toUpperCase()}',`,
210
+ ...fixtureCallInformation.requestBody ? [` body: JSON.stringify(${sourceCode.getText(fixtureCallInformation.requestBody)}),`] : [],
211
+ ...fixtureCallInformation.requestHeaders ? [
212
+ ` headers: {`,
213
+ ...fixtureCallInformation.requestHeaders.map(
214
+ ({ name, value }) => (
215
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions, no-nested-ternary, sonarjs/no-nested-template-literals
216
+ ` ${name.type === "Literal" ? isValidPropertyName(name.value) ? name.value : `'${name.value}'` : `[${sourceCode.getText(name)}]`}: ${sourceCode.getText(value)},`
217
+ )
218
+ ),
219
+ ` },`
220
+ ] : [],
221
+ "}"
222
+ ].join(`
204
223
  ${indentation}`);
205
- }
206
- if (fixtureCallInformation.assertions) {
207
- if (!isResponseVariableDeclared) {
208
- replacedText = `const ${variableNameToUse} = ${replacedText}`;
209
- }
210
- replacedText = [
211
- replacedText,
212
- ...appendAssertions(fixtureCallInformation.assertions, sourceCode, variableNameToUse)
213
- ].join(`;
224
+ const responseVariableNameToUse = getResponseVariableNameToUse(
225
+ scopeManager,
226
+ fixtureCallInformation,
227
+ scopeVariablesMap
228
+ );
229
+ const needResponseVariableRedefine = spreadResponseBodyVariable !== void 0 || responseVariable === void 0 && fixtureCallInformation.assertions !== void 0;
230
+ const responseBodyHeadersVariableRedefineLines = needResponseVariableRedefine ? [
231
+ ...spreadResponseBodyVariable ? [`const ${spreadResponseBodyVariable.name} = await ${responseVariableNameToUse}.json()`] : [],
232
+ ...spreadResponseHeadersVariable ? [`const ${spreadResponseHeadersVariable.name} = ${responseVariableNameToUse}.headers`] : []
233
+ ] : [];
234
+ const { statusAssertion, nonStatusAssertions } = createResponseAssertions(
235
+ fixtureCallInformation,
236
+ sourceCode,
237
+ responseVariableNameToUse
238
+ );
239
+ const fetchCallText = `fetch(${fetchUrlArgumentText}, ${fetchRequestArgumentLines})`;
240
+ const fetchStatementText = !needResponseVariableRedefine ? fetchCallText : `const ${responseVariableNameToUse} = await ${fetchCallText}`;
241
+ const nodeToReplace = needResponseVariableRedefine ? fixtureCallInformation.rootNode : fixtureCallInformation.fixtureNode;
242
+ const appendingAssignmentAndAssertionText = [
243
+ "",
244
+ ...statusAssertion !== void 0 ? [statusAssertion] : [],
245
+ ...responseBodyHeadersVariableRedefineLines,
246
+ ...nonStatusAssertions
247
+ ].join(`;
214
248
  ${indentation}`);
215
- }
216
249
  context.report({
217
250
  node: fixtureCall,
218
251
  messageId: "preferNativeFetch",
219
252
  *fix(fixer) {
220
- let replacementRootNode = fixtureCallInformation.root;
221
- if (spreadResponseBodyVariable) {
222
- const identifier = spreadResponseBodyVariable.identifiers[0];
223
- assert.ok(identifier);
224
- const variableDeclaration = getAncestor(identifier, "VariableDeclaration", "FunctionDeclaration");
225
- assert.ok(variableDeclaration);
226
- replacementRootNode = variableDeclaration;
227
- } else if (fixtureCallInformation.assertions !== void 0 && responseVariable === void 0) {
228
- replacementRootNode = getAncestor(fixtureCallInformation.root, "VariableDeclaration", "FunctionDeclaration") ?? fixtureCallInformation.root;
229
- }
230
- yield fixer.replaceText(replacementRootNode, replacedText);
253
+ yield fixer.replaceText(nodeToReplace, fetchStatementText);
254
+ const needEndingSemiColon = sourceCode.getText(nodeToReplace).endsWith(";");
255
+ yield fixer.insertTextAfter(
256
+ nodeToReplace,
257
+ needEndingSemiColon ? `${appendingAssignmentAndAssertionText};` : appendingAssignmentAndAssertionText
258
+ );
231
259
  for (const responseBodyReference of responseBodyReferences) {
232
- yield fixer.replaceText(responseBodyReference, `await ${variableNameToUse}.json()`);
260
+ yield fixer.replaceText(responseBodyReference, `await ${responseVariableNameToUse}.json()`);
233
261
  }
234
262
  for (const responseHeadersReference of responseHeadersReferences) {
235
263
  const parent = getParent(responseHeadersReference);
@@ -244,23 +272,19 @@ ${indentation}`);
244
272
  headerName = sourceCode.getText(headerNameNode);
245
273
  }
246
274
  assert.ok(headerName);
247
- yield fixer.replaceText(parent, `${variableNameToUse}.headers.get(${headerName})`);
248
- }
249
- if (fixtureCallInformation.root.type === "ReturnStatement" && fixtureCallInformation.assertions !== void 0) {
250
- yield fixer.insertTextAfter(
251
- fixtureCallInformation.root,
252
- `;
253
- ${indentation}return ${variableNameToUse};`
254
- );
275
+ yield fixer.replaceText(parent, `${responseVariableNameToUse}.headers.get(${headerName})`);
255
276
  }
256
- function* statusCodeReplacer(reference) {
257
- const parent = getParent(reference.identifier);
258
- if (parent?.type === "MemberExpression" && parent.property.type === "Identifier" && parent.property.name === "statusCode") {
259
- yield fixer.replaceText(parent.property, "status");
277
+ for (const responseStatusReference of responseStatusReferences) {
278
+ if (responseStatusReference.property.type === "Identifier" && responseStatusReference.property.name === "statusCode") {
279
+ yield fixer.replaceText(responseStatusReference.property, `status`);
260
280
  }
261
281
  }
262
- for (const reference of responseVariable?.references ?? []) {
263
- yield* statusCodeReplacer(reference);
282
+ if (fixtureCallInformation.rootNode.type === "ReturnStatement" && fixtureCallInformation.assertions !== void 0) {
283
+ yield fixer.insertTextAfter(
284
+ fixtureCallInformation.rootNode,
285
+ `
286
+ ${indentation}return ${responseVariableNameToUse};`
287
+ );
264
288
  }
265
289
  }
266
290
  });
@@ -283,4 +307,4 @@ export {
283
307
  no_fixture_default as default,
284
308
  ruleId
285
309
  };
286
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL25vLWZpeHR1cmUudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBbUJBLFNBQVMsVUFBVSxjQUFjO0FBQ2pDLE9BQU8seUJBQXlCO0FBRXpCLElBQU0sU0FBUztBQWV0QixTQUFTLFVBQVUsTUFBcUM7QUFDdEQsU0FBUSxLQUF3QztBQUNsRDtBQUVBLFNBQVMsUUFBUSxNQUE0QixTQUFpQztBQUM1RSxRQUFNLFNBQVMsVUFBVSxJQUFJO0FBQzdCLFNBQU8sR0FBRyxRQUFRLHFEQUFxRDtBQUV2RSxNQUFJO0FBQ0osTUFBSSxPQUFPLFNBQVMscUJBQXFCLE9BQU8sU0FBUyxtQkFBbUI7QUFFMUUsWUFBUSxPQUFPO0FBQUEsRUFDakIsV0FBVyxPQUFPLFNBQVMsc0JBQXNCLE9BQU8sU0FBUyxTQUFTLGNBQWM7QUFDdEYsUUFBSSxPQUFPLFNBQVMsU0FBUyxVQUFVO0FBQ3JDLFlBQU0sZ0JBQWdCLFVBQVUsTUFBTTtBQUN0QyxhQUFPLEdBQUcsaUJBQWlCLGNBQWMsU0FBUyxnQkFBZ0I7QUFDbEUsY0FBUSxhQUFhLENBQUMsR0FBSSxRQUFRLGNBQWMsQ0FBQyxHQUFJLGNBQWMsU0FBeUI7QUFDNUYsaUJBQVc7QUFBQSxJQUNiLFdBQVcsT0FBTyxTQUFTLFNBQVMsUUFBUTtBQUMxQyxZQUFNLHNCQUFzQixVQUFVLE1BQU07QUFDNUMsYUFBTyxHQUFHLHVCQUF1QixvQkFBb0IsU0FBUyxnQkFBZ0I7QUFDOUUsY0FBUSxjQUFjLG9CQUFvQixVQUFVLENBQUM7QUFDckQsaUJBQVc7QUFBQSxJQUNiLFdBQVcsT0FBTyxTQUFTLFNBQVMsT0FBTztBQUN6QyxZQUFNLHVCQUF1QixVQUFVLE1BQU07QUFDN0MsYUFBTyxHQUFHLHdCQUF3QixxQkFBcUIsU0FBUyxnQkFBZ0I7QUFDaEYsWUFBTSxDQUFDLE1BQU0sS0FBSyxJQUFJLHFCQUFxQjtBQUMzQyxjQUFRLGlCQUFpQixDQUFDLEdBQUksUUFBUSxrQkFBa0IsQ0FBQyxHQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUUsaUJBQVc7QUFBQSxJQUNiO0FBQUEsRUFDRixPQUFPO0FBQ0wsVUFBTSxJQUFJLE1BQU0sbURBQW1ELE9BQU8sTUFBTSxDQUFDLEVBQUU7QUFBQSxFQUNyRjtBQUNBLE1BQUksVUFBVTtBQUNaLFlBQVEsVUFBVSxPQUFPO0FBQUEsRUFDM0I7QUFDRjtBQUVBLFNBQVMscUNBQXFDLEtBQWE7QUFFekQsU0FBTyxJQUFJLFFBQVEsa0NBQWtDLGdCQUFnQjtBQUN2RTtBQUVBLFNBQVMsb0JBQW9CLE1BQWU7QUFDMUMsU0FBTyxPQUFPLFNBQVMsWUFBWSw4QkFBOEIsS0FBSyxJQUFJO0FBQzVFO0FBRUEsU0FBUyxpQkFBaUIsU0FBeUIsWUFBd0IsY0FBc0I7QUFDL0YsUUFBTSxhQUF1QixDQUFDO0FBQzlCLGFBQVcsbUJBQW1CLFNBQVM7QUFDckMsUUFBSSxnQkFBZ0IsV0FBVyxHQUFHO0FBQ2hDLFlBQU0sQ0FBQyxpQkFBaUIsSUFBSTtBQUM1QixhQUFPLEdBQUcsaUJBQWlCO0FBQzNCLFVBQ0csa0JBQWtCLFNBQVMsc0JBQzFCLGtCQUFrQixPQUFPLFNBQVMsZ0JBQ2xDLGtCQUFrQixPQUFPLFNBQVMsaUJBQ3BDLGtCQUFrQixTQUFTLFdBQzNCO0FBRUEsbUJBQVcsS0FBSyxnQkFBZ0IsWUFBWSxZQUFZLFdBQVcsUUFBUSxpQkFBaUIsQ0FBQyxHQUFHO0FBQUEsTUFDbEcsV0FBVyxrQkFBa0IsU0FBUywyQkFBMkI7QUFFL0QsbUJBQVcsS0FBSyxhQUFhLFdBQVcsUUFBUSxpQkFBaUIsQ0FBQyxHQUFHO0FBQUEsTUFDdkUsV0FBVyxrQkFBa0IsU0FBUyxjQUFjO0FBRWxELG1CQUFXLEtBQUssYUFBYSxXQUFXLFFBQVEsaUJBQWlCLENBQUMsSUFBSSxZQUFZLElBQUk7QUFBQSxNQUN4RixXQUFXLGtCQUFrQixTQUFTLHNCQUFzQixrQkFBa0IsU0FBUyxrQkFBa0I7QUFFdkcsbUJBQVcsS0FBSywwQkFBMEIsWUFBWSxZQUFZLFdBQVcsUUFBUSxpQkFBaUIsQ0FBQyxHQUFHO0FBQUEsTUFDNUcsT0FBTztBQUNMLGNBQU0sSUFBSSxNQUFNLHFEQUFxRCxXQUFXLFFBQVEsaUJBQWlCLENBQUMsR0FBRztBQUFBLE1BQy9HO0FBQUEsSUFDRixXQUFXLGdCQUFnQixXQUFXLEdBQUc7QUFFdkMsWUFBTSxDQUFDLFlBQVksV0FBVyxJQUFJO0FBQ2xDLGFBQU8sR0FBRyxjQUFjLFdBQVc7QUFDbkMsVUFBSSxZQUFZLFNBQVMsYUFBYSxZQUFZLGlCQUFpQixRQUFRO0FBQ3pFLG1CQUFXO0FBQUEsVUFDVCxhQUFhLFlBQVksZ0JBQWdCLFdBQVcsUUFBUSxVQUFVLENBQUMsV0FBVyxXQUFXLFFBQVEsV0FBVyxDQUFDO0FBQUEsUUFDbkg7QUFBQSxNQUNGLE9BQU87QUFDTCxtQkFBVztBQUFBLFVBQ1QsZ0JBQWdCLFlBQVksZ0JBQWdCLFdBQVcsUUFBUSxVQUFVLENBQUMsTUFBTSxXQUFXLFFBQVEsV0FBVyxDQUFDO0FBQUEsUUFDakg7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLFlBQVksTUFBWSxXQUFtQixVQUFrQjtBQUNwRSxRQUFNLFNBQVMsVUFBVSxJQUFJO0FBQzdCLE1BQUksQ0FBQyxVQUFVLE9BQU8sU0FBUyxVQUFVO0FBQ3ZDLFdBQU87QUFBQSxFQUNULFdBQVcsT0FBTyxTQUFTLFdBQVc7QUFDcEMsV0FBTztBQUFBLEVBQ1Q7QUFDQSxTQUFPLFlBQVksUUFBUSxXQUFXLFFBQVE7QUFDaEQ7QUFFQSxTQUFTLGtCQUFrQixhQUFnRCxjQUFrQztBQUMzRyxRQUFNLFVBTUY7QUFBQSxJQUNGLHdCQUF3QixDQUFDO0FBQUEsSUFDekIsMkJBQTJCLENBQUM7QUFBQSxFQUM5QjtBQUVBLFFBQU0sc0JBQXNCLFlBQVksYUFBYSx1QkFBdUIscUJBQXFCO0FBQ2pHLE1BQUksdUJBQXVCLG9CQUFvQixTQUFTLHVCQUF1QjtBQUM3RSxVQUFNLG9CQUFvQixhQUFhLHFCQUFxQixtQkFBbUI7QUFDL0UsZUFBVyxvQkFBb0IsbUJBQW1CO0FBQ2hELFlBQU0sYUFBYSxpQkFBaUIsWUFBWSxDQUFDO0FBQ2pELGFBQU8sR0FBRyxVQUFVO0FBQ3BCLFlBQU0sbUJBQW1CLFVBQVUsVUFBVTtBQUM3QyxhQUFPLEdBQUcsZ0JBQWdCO0FBQzFCLFVBQUksaUJBQWlCLFNBQVMsc0JBQXNCO0FBRWxELGdCQUFRLG1CQUFtQjtBQUMzQixnQkFBUSx5QkFBeUIsaUJBQWlCLFdBQy9DLElBQUksQ0FBQywwQkFBMEIsVUFBVSxzQkFBc0IsVUFBVSxDQUFDLEVBQzFFO0FBQUEsVUFDQyxDQUFDLFNBQ0MsU0FBUyxRQUNULFNBQVMsVUFDVCxLQUFLLFNBQVMsc0JBQ2QsS0FBSyxTQUFTLFNBQVMsZ0JBQ3ZCLEtBQUssU0FBUyxTQUFTO0FBQUEsUUFDM0I7QUFDRixnQkFBUSw0QkFBNEIsaUJBQWlCLFdBQ2xELElBQUksQ0FBQyw2QkFBNkIsVUFBVSx5QkFBeUIsVUFBVSxDQUFDLEVBQ2hGO0FBQUEsVUFDQyxDQUFDLFNBQ0MsU0FBUyxRQUNULFNBQVMsVUFDVCxLQUFLLFNBQVMsc0JBQ2QsS0FBSyxTQUFTLFNBQVMsaUJBQ3RCLEtBQUssU0FBUyxTQUFTLFlBQVksS0FBSyxTQUFTLFNBQVMsYUFBYSxLQUFLLFNBQVMsU0FBUztBQUFBLFFBQ25HO0FBQUEsTUFDSixXQUNFLGlCQUFpQixTQUFTLGNBQzFCLGlCQUFpQixJQUFJLFNBQVMsZ0JBQzlCLGlCQUFpQixJQUFJLFNBQVMsUUFDOUI7QUFDQSxnQkFBUSw2QkFBNkI7QUFBQSxNQUN2QyxXQUNFLGlCQUFpQixTQUFTLGNBQzFCLGlCQUFpQixJQUFJLFNBQVMsZ0JBQzlCLGlCQUFpQixJQUFJLFNBQVMsV0FDOUI7QUFDQSxnQkFBUSxnQ0FBZ0M7QUFBQSxNQUMxQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBRUEsU0FBUyxlQUFlLE1BQVksWUFBd0I7QUFDMUQsU0FBTyxHQUFHLEtBQUssR0FBRztBQUNsQixRQUFNLE9BQU8sV0FBVyxNQUFNLEtBQUssSUFBSSxNQUFNLE9BQU8sQ0FBQztBQUNyRCxTQUFPLEdBQUcsSUFBSTtBQUNkLFFBQU0sY0FBYyxLQUFLLE1BQU0sT0FBTztBQUN0QyxTQUFPLGNBQWMsWUFBWSxDQUFDLElBQUk7QUFDeEM7QUFFQSxJQUFNLE9BQXdCO0FBQUEsRUFDNUIsTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLE1BQ2IsS0FBSyxvQkFBb0IsTUFBTTtBQUFBLElBQ2pDO0FBQUEsSUFDQSxVQUFVO0FBQUEsTUFDUixtQkFBbUI7QUFBQSxNQUNuQixjQUNFO0FBQUEsSUFDSjtBQUFBLElBQ0EsU0FBUztBQUFBLElBQ1QsUUFBUSxDQUFDO0FBQUEsRUFDWDtBQUFBLEVBQ0EsT0FBTyxTQUFTO0FBQ2QsVUFBTSxhQUFhLFFBQVE7QUFDM0IsVUFBTSxlQUFlLFdBQVc7QUFDaEMsUUFBSSxrQkFBa0I7QUFFdEIsV0FBTztBQUFBLE1BQ0wsMEZBQTBGLENBQUMsZ0JBQXNCO0FBQy9HLFlBQUk7QUFDRixpQkFBTyxHQUFHLFlBQVksU0FBUyxnQkFBZ0I7QUFDL0MsZ0JBQU0sa0JBQWtCLFlBQVk7QUFDcEMsaUJBQU8sR0FBRyxnQkFBZ0IsU0FBUyxrQkFBa0I7QUFDckQsZ0JBQU0sYUFBYSxnQkFBZ0I7QUFDbkMsaUJBQU8sR0FBRyxXQUFXLFNBQVMsWUFBWTtBQUMxQyxnQkFBTSxjQUFjLGVBQWUsYUFBYSxVQUFVO0FBRTFELGdCQUFNLENBQUMsZUFBZSxJQUFJLFlBQVk7QUFDdEMsaUJBQU8sR0FBRyxvQkFBb0IsTUFBUztBQUV2QyxnQkFBTSx5QkFBeUIsQ0FBQztBQUNoQyxrQkFBUSxhQUFhLHNCQUFzQjtBQUUzQyxnQkFBTTtBQUFBLFlBQ0o7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsVUFDRixJQUFJLGtCQUFrQix1QkFBdUIsTUFBTSxZQUFZO0FBQy9ELGNBQUk7QUFDSixjQUFJLDZCQUE2QjtBQUNqQyxjQUFJLHFCQUFxQixRQUFXO0FBQ2xDLGdDQUFvQixXQUFXLG9CQUFvQixJQUFJLEtBQUssZ0JBQWdCLFNBQVMsQ0FBQztBQUN0RjtBQUFBLFVBQ0YsT0FBTztBQUNMLHlDQUE2QjtBQUM3QixnQ0FBb0IsaUJBQWlCO0FBQUEsVUFDdkM7QUFHQSxnQkFBTSxxQkFBcUIsV0FBVyxRQUFRLFdBQVc7QUFDekQsZ0JBQU0sb0JBQW9CLFdBQVcsUUFBUSxlQUFlO0FBRTVELGdCQUFNLHNCQUNKLHVCQUF1QixLQUFLLFNBQVMscUJBQXFCLHVCQUF1QixlQUFlLFNBQzVGLFdBQ0E7QUFDTixjQUFJLGVBQWUsbUJBQW1CLFFBQVEsbUJBQW1CLEdBQUcsbUJBQW1CLFFBQVE7QUFHL0YsZ0JBQU0sc0JBQXNCLFdBQVcsUUFBUSxlQUFlO0FBQzlELGNBQUksb0JBQW9CLHFDQUFxQyxtQkFBbUI7QUFHaEYsY0FDRSxXQUFXLFNBQVMsU0FDcEIsdUJBQXVCLGdCQUFnQixVQUN2Qyx1QkFBdUIsbUJBQW1CLFFBQzFDO0FBQ0EsaUNBQXFCO0FBQUEsY0FDbkI7QUFBQSxjQUNBLGNBQWMsV0FBVyxLQUFLLFlBQVksQ0FBQztBQUFBLGNBQzNDLEdBQUksdUJBQXVCLGNBQ3ZCLENBQUMsMEJBQTBCLFdBQVcsUUFBUSx1QkFBdUIsV0FBVyxDQUFDLElBQUksSUFDckYsQ0FBQztBQUFBLGNBQ0wsR0FBSSx1QkFBdUIsaUJBQ3ZCO0FBQUEsZ0JBQ0U7QUFBQSxnQkFDQSxHQUFHLHVCQUF1QixlQUFlO0FBQUEsa0JBQ3ZDLENBQUMsRUFBRSxNQUFNLE1BQU07QUFBQTtBQUFBLG9CQUViLE9BQU8sS0FBSyxTQUFTLFlBQWEsb0JBQW9CLEtBQUssS0FBSyxJQUFJLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxNQUFPLElBQUksV0FBVyxRQUFRLElBQUksQ0FBQyxHQUFHLEtBQUssV0FBVyxRQUFRLEtBQUssQ0FBQztBQUFBO0FBQUEsZ0JBQ3ZLO0FBQUEsZ0JBQ0E7QUFBQSxjQUNGLElBQ0EsQ0FBQztBQUFBLGNBQ0w7QUFBQSxZQUNGLEVBQUUsS0FBSztBQUFBLEVBQUssV0FBVyxFQUFFO0FBQUEsVUFDM0I7QUFFQSx5QkFBZSxhQUFhLFFBQVEscUJBQXFCLGlCQUFpQjtBQUUxRSxnQkFBTSx1QkFDSiwrQkFBK0IsV0FDOUIscUJBQXFCLFVBQWEsdUJBQXVCLGdCQUFnQjtBQUU1RSxjQUFJLHNCQUFzQjtBQUN4QiwyQkFBZTtBQUFBLGNBQ2I7QUFBQSxjQUNBLEdBQUksNkJBQ0EsQ0FBQyxTQUFTLDJCQUEyQixJQUFJLFlBQVksaUJBQWlCLFNBQVMsSUFDL0UsQ0FBQztBQUFBLGNBQ0wsR0FBSSxnQ0FDQSxDQUFDLFNBQVMsOEJBQThCLElBQUksTUFBTSxpQkFBaUIsVUFBVSxJQUM3RSxDQUFDO0FBQUEsWUFDUCxFQUFFLEtBQUs7QUFBQSxFQUFNLFdBQVcsRUFBRTtBQUFBLFVBQzVCO0FBRUEsY0FBSSx1QkFBdUIsWUFBWTtBQUVyQyxnQkFBSSxDQUFDLDRCQUE0QjtBQUMvQiw2QkFBZSxTQUFTLGlCQUFpQixNQUFNLFlBQVk7QUFBQSxZQUM3RDtBQUVBLDJCQUFlO0FBQUEsY0FDYjtBQUFBLGNBQ0EsR0FBRyxpQkFBaUIsdUJBQXVCLFlBQVksWUFBWSxpQkFBaUI7QUFBQSxZQUN0RixFQUFFLEtBQUs7QUFBQSxFQUFNLFdBQVcsRUFBRTtBQUFBLFVBQzVCO0FBRUEsa0JBQVEsT0FBTztBQUFBLFlBQ2IsTUFBTTtBQUFBLFlBQ04sV0FBVztBQUFBLFlBQ1gsQ0FBQyxJQUFJLE9BQU87QUFDVixrQkFBSSxzQkFBZ0UsdUJBQXVCO0FBQzNGLGtCQUFJLDRCQUE0QjtBQUM5QixzQkFBTSxhQUFhLDJCQUEyQixZQUFZLENBQUM7QUFDM0QsdUJBQU8sR0FBRyxVQUFVO0FBQ3BCLHNCQUFNLHNCQUFzQixZQUFZLFlBQVksdUJBQXVCLHFCQUFxQjtBQUNoRyx1QkFBTyxHQUFHLG1CQUFtQjtBQUM3QixzQ0FBc0I7QUFBQSxjQUN4QixXQUFXLHVCQUF1QixlQUFlLFVBQWEscUJBQXFCLFFBQVc7QUFDNUYsc0NBQ0UsWUFBWSx1QkFBdUIsTUFBTSx1QkFBdUIscUJBQXFCLEtBQ3JGLHVCQUF1QjtBQUFBLGNBQzNCO0FBQ0Esb0JBQU0sTUFBTSxZQUFZLHFCQUFxQixZQUFZO0FBR3pELHlCQUFXLHlCQUF5Qix3QkFBd0I7QUFDMUQsc0JBQU0sTUFBTSxZQUFZLHVCQUF1QixTQUFTLGlCQUFpQixTQUFTO0FBQUEsY0FDcEY7QUFHQSx5QkFBVyw0QkFBNEIsMkJBQTJCO0FBQ2hFLHNCQUFNLFNBQVMsVUFBVSx3QkFBd0I7QUFDakQsdUJBQU8sR0FBRyxNQUFNO0FBQ2hCLG9CQUFJO0FBQ0osb0JBQUksT0FBTyxTQUFTLG9CQUFvQjtBQUN0Qyx3QkFBTSxpQkFBaUIsT0FBTztBQUM5QjtBQUFBLGtCQUVFLE9BQU8sV0FBVyxXQUFXLFFBQVEsY0FBYyxJQUFJLElBQUksV0FBVyxRQUFRLGNBQWMsQ0FBQztBQUFBLGdCQUNqRyxXQUFXLE9BQU8sU0FBUyxrQkFBa0I7QUFDM0Msd0JBQU0saUJBQWlCLE9BQU8sVUFBVSxDQUFDO0FBQ3pDLCtCQUFhLFdBQVcsUUFBUSxjQUFjO0FBQUEsZ0JBQ2hEO0FBQ0EsdUJBQU8sR0FBRyxVQUFVO0FBQ3BCLHNCQUFNLE1BQU0sWUFBWSxRQUFRLEdBQUcsaUJBQWlCLGdCQUFnQixVQUFVLEdBQUc7QUFBQSxjQUNuRjtBQUdBLGtCQUNFLHVCQUF1QixLQUFLLFNBQVMscUJBQ3JDLHVCQUF1QixlQUFlLFFBQ3RDO0FBQ0Esc0JBQU0sTUFBTTtBQUFBLGtCQUNWLHVCQUF1QjtBQUFBLGtCQUN2QjtBQUFBLEVBQU0sV0FBVyxVQUFVLGlCQUFpQjtBQUFBLGdCQUM5QztBQUFBLGNBQ0Y7QUFHQSx3QkFBVSxtQkFBbUIsV0FBNEI7QUFDdkQsc0JBQU0sU0FBUyxVQUFVLFVBQVUsVUFBVTtBQUM3QyxvQkFDRSxRQUFRLFNBQVMsc0JBQ2pCLE9BQU8sU0FBUyxTQUFTLGdCQUN6QixPQUFPLFNBQVMsU0FBUyxjQUN6QjtBQUNBLHdCQUFNLE1BQU0sWUFBWSxPQUFPLFVBQVUsUUFBUTtBQUFBLGdCQUNuRDtBQUFBLGNBQ0Y7QUFDQSx5QkFBVyxhQUFhLGtCQUFrQixjQUFjLENBQUMsR0FBRztBQUMxRCx1QkFBTyxtQkFBbUIsU0FBUztBQUFBLGNBQ3JDO0FBQUEsWUFDRjtBQUFBLFVBQ0YsQ0FBQztBQUFBLFFBQ0gsU0FBUyxPQUFPO0FBQ2Qsa0JBQVEsTUFBTSxtQkFBbUIsTUFBTSxpQkFBaUIsS0FBSztBQUM3RCxrQkFBUSxPQUFPO0FBQUEsWUFDYixNQUFNO0FBQUEsWUFDTixXQUFXO0FBQUEsWUFDWCxNQUFNO0FBQUEsY0FDSixPQUFPLE9BQU8sS0FBSztBQUFBLFlBQ3JCO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBQ0EsSUFBTyxxQkFBUTsiLAogICJuYW1lcyI6IFtdCn0K
310
+ //# sourceMappingURL=data:application/json;base64,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
@@ -0,0 +1,3 @@
1
+ import type { Node } from 'estree';
2
+ import type { SourceCode } from 'eslint';
3
+ export declare function getIndentation(node: Node, sourceCode: SourceCode): string;
@@ -0,0 +1,3 @@
1
+ import type { Node } from 'estree';
2
+ export declare function getParent(node: Node): Node | undefined | null;
3
+ export declare function getAncestor(node: Node, matcher: string | ((testNode: Node) => boolean), typeToExit?: string): import("estree").Property | import("estree").CatchClause | import("estree").ClassDeclaration | import("estree").ClassExpression | import("estree").ClassBody | import("estree").Identifier | import("estree").SimpleLiteral | import("estree").RegExpLiteral | import("estree").BigIntLiteral | import("estree").ArrayExpression | import("estree").ArrowFunctionExpression | import("estree").AssignmentExpression | import("estree").AwaitExpression | import("estree").BinaryExpression | import("estree").SimpleCallExpression | import("estree").NewExpression | import("estree").ChainExpression | import("estree").ConditionalExpression | import("estree").FunctionExpression | import("estree").ImportExpression | import("estree").LogicalExpression | import("estree").MemberExpression | import("estree").MetaProperty | import("estree").ObjectExpression | import("estree").SequenceExpression | import("estree").TaggedTemplateExpression | import("estree").TemplateLiteral | import("estree").ThisExpression | import("estree").UnaryExpression | import("estree").UpdateExpression | import("estree").YieldExpression | import("estree").FunctionDeclaration | import("estree").MethodDefinition | import("estree").ImportDeclaration | import("estree").ExportNamedDeclaration | import("estree").ExportDefaultDeclaration | import("estree").ExportAllDeclaration | import("estree").ImportSpecifier | import("estree").ImportDefaultSpecifier | import("estree").ImportNamespaceSpecifier | import("estree").ExportSpecifier | import("estree").ObjectPattern | import("estree").ArrayPattern | import("estree").RestElement | import("estree").AssignmentPattern | import("estree").PrivateIdentifier | import("estree").Program | import("estree").PropertyDefinition | import("estree").SpreadElement | import("estree").ExpressionStatement | import("estree").BlockStatement | import("estree").StaticBlock | import("estree").EmptyStatement | import("estree").DebuggerStatement | import("estree").WithStatement | import("estree").ReturnStatement | import("estree").LabeledStatement | import("estree").BreakStatement | import("estree").ContinueStatement | import("estree").IfStatement | import("estree").SwitchStatement | import("estree").ThrowStatement | import("estree").TryStatement | import("estree").WhileStatement | import("estree").DoWhileStatement | import("estree").ForStatement | import("estree").ForInStatement | import("estree").ForOfStatement | import("estree").VariableDeclaration | import("estree").Super | import("estree").SwitchCase | import("estree").TemplateElement | import("estree").VariableDeclarator | undefined;
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@checkdigit/eslint-plugin","version":"6.6.0-PR.75-e80b","description":"Check Digit eslint plugins","keywords":["eslint","eslintplugin"],"homepage":"https://github.com/checkdigit/eslint-plugin#readme","bugs":{"url":"https://github.com/checkdigit/eslint-plugin/issues"},"repository":{"type":"git","url":"https://github.com/checkdigit/eslint-plugin"},"license":"MIT","author":"Check Digit, LLC","sideEffects":false,"type":"module","exports":{".":{"types":"./dist-types/index.d.ts","require":"./dist-cjs/index.cjs","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-cjs","dist-mjs","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-cjs/**/*.test.cjs","!dist-cjs/**/*.spec.cjs","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-cjs":"rimraf dist-cjs && npx builder --type=commonjs --sourceMap --entryPoint=index.ts --outDir=dist-cjs --outFile=index.cjs && echo \"module.exports = module.exports.default;\" >> dist-cjs/index.cjs && node dist-cjs/index.cjs","build:dist-mjs":"rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs","build:dist-types":"rimraf dist-types && npx builder --type=types --outDir=dist-types","ci:compile":"tsc --noEmit","ci:coverage":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true","ci:lint":"npm run lint","ci:style":"npm run prettier","ci:test":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","lint":"eslint --max-warnings 0 --ignore-path .gitignore .","lint:fix":"eslint --ignore-path .gitignore . --fix","prepublishOnly":"npm run build:dist-types && npm run build:dist-cjs && npm run build:dist-mjs","prettier":"prettier --ignore-path .gitignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"},"prettier":"@checkdigit/prettier-config","jest":{"preset":"@checkdigit/jest-config"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^5.5.0","@checkdigit/typescript-config":"6.0.0","@types/eslint":"^8.56.10","@typescript-eslint/eslint-plugin":"^7.16.1","@typescript-eslint/parser":"^7.16.1","eslint-config-prettier":"^9.1.0","eslint-plugin-eslint-plugin":"^6.2.0","eslint-plugin-import":"^2.29.1","eslint-plugin-no-only-tests":"^3.1.0","eslint-plugin-no-secrets":"^1.0.2","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"0.24.0"},"peerDependencies":{"eslint":">=8 <9"},"engines":{"node":">=20.14"}}
1
+ {"name":"@checkdigit/eslint-plugin","version":"6.6.0-PR.75-b2d2","description":"Check Digit eslint plugins","keywords":["eslint","eslintplugin"],"homepage":"https://github.com/checkdigit/eslint-plugin#readme","bugs":{"url":"https://github.com/checkdigit/eslint-plugin/issues"},"repository":{"type":"git","url":"https://github.com/checkdigit/eslint-plugin"},"license":"MIT","author":"Check Digit, LLC","sideEffects":false,"type":"module","exports":{".":{"types":"./dist-types/index.d.ts","require":"./dist-cjs/index.cjs","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-cjs","dist-mjs","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-cjs/**/*.test.cjs","!dist-cjs/**/*.spec.cjs","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-cjs":"rimraf dist-cjs && npx builder --type=commonjs --sourceMap --entryPoint=index.ts --outDir=dist-cjs --outFile=index.cjs && echo \"module.exports = module.exports.default;\" >> dist-cjs/index.cjs && node dist-cjs/index.cjs","build:dist-mjs":"rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs","build:dist-types":"rimraf dist-types && npx builder --type=types --outDir=dist-types","ci:compile":"tsc --noEmit","ci:coverage":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true","ci:lint":"npm run lint","ci:style":"npm run prettier","ci:test":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","lint":"eslint --max-warnings 0 --ignore-path .gitignore .","lint:fix":"eslint --ignore-path .gitignore . --fix","prepublishOnly":"npm run build:dist-types && npm run build:dist-cjs && npm run build:dist-mjs","prettier":"prettier --ignore-path .gitignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"},"prettier":"@checkdigit/prettier-config","jest":{"preset":"@checkdigit/jest-config"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^5.5.0","@checkdigit/typescript-config":"6.0.0","@types/eslint":"^8.56.10","@typescript-eslint/eslint-plugin":"^7.16.1","@typescript-eslint/parser":"^7.16.1","eslint-config-prettier":"^9.1.0","eslint-plugin-eslint-plugin":"^6.2.0","eslint-plugin-import":"^2.29.1","eslint-plugin-no-only-tests":"^3.1.0","eslint-plugin-no-secrets":"^1.0.2","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"0.24.0"},"peerDependencies":{"eslint":">=8 <9"},"engines":{"node":">=20.14"}}
@@ -0,0 +1,19 @@
1
+ // format.ts
2
+
3
+ /*
4
+ * Copyright (c) 2021-2024 Check Digit, LLC
5
+ *
6
+ * This code is licensed under the MIT license (see LICENSE.txt for details).
7
+ */
8
+
9
+ import type { Node } from 'estree';
10
+ import type { SourceCode } from 'eslint';
11
+ import { strict as assert } from 'node:assert';
12
+
13
+ export function getIndentation(node: Node, sourceCode: SourceCode) {
14
+ assert.ok(node.loc);
15
+ const line = sourceCode.lines[node.loc.start.line - 1];
16
+ assert.ok(line);
17
+ const indentMatch = line.match(/^\s*/u);
18
+ return indentMatch ? indentMatch[0] : '';
19
+ }