@checkdigit/eslint-plugin 7.6.0-PR.75-4751 → 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.
@@ -14,7 +14,7 @@ var rule = createRule({
14
14
  description: 'Replace "response.body" with "await response.json()".'
15
15
  },
16
16
  messages: {
17
- refactorNeeded: "Please extract the fetch call and check its reponse status code before accessing its response body.",
17
+ refactorNeeded: "Please extract the fetch call and check its response status code before accessing its response body.",
18
18
  replaceBodyWithJson: 'Replace "response.body" with "await response.json()".',
19
19
  unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
20
20
  },
@@ -35,7 +35,7 @@ function hasAssertions(fixtureCall) {
35
35
  return hasAssertions(parent);
36
36
  }
37
37
  function isFetchResponse(type) {
38
- return type.getProperties().some((symbol) => symbol.name === "body") && type.getProperties().some((symbol) => symbol.name === "json");
38
+ return type.getProperties().some((symbol) => symbol.name === "json") && type.getProperties().some((symbol) => symbol.name === "status") && type.getProperties().some((symbol) => symbol.name === "headers") && type.getProperties().some((symbol) => symbol.name === "body");
39
39
  }
40
40
  export {
41
41
  getResponseBodyRetrievalText,
@@ -45,4 +45,4 @@ export {
45
45
  isFetchResponse,
46
46
  isInvalidResponseHeadersAccess
47
47
  };
48
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L2ZldGNoLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLFNBQVMsc0JBQWdDO0FBQ3pDLE9BQWU7QUFFZixTQUFTLFdBQVcsd0JBQXdCO0FBRXJDLFNBQVMsNkJBQTZCLHNCQUE4QjtBQUN6RSxTQUFPLFNBQVMsb0JBQW9CO0FBQ3RDO0FBRU8sU0FBUywrQkFBK0Isc0JBQThCO0FBQzNFLFNBQU8sR0FBRyxvQkFBb0I7QUFDaEM7QUFFTyxTQUFTLGdDQUFnQyxzQkFBOEI7QUFDNUUsU0FBTyxHQUFHLG9CQUFvQjtBQUNoQztBQUVPLFNBQVMsK0JBQStCLHVCQUErQztBQUM1RixRQUFNLDZCQUE2QixVQUFVLHFCQUFxQjtBQUNsRSxNQUFJLDRCQUE0QixTQUFTLGVBQWUsb0JBQW9CO0FBQzFFLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFDRSw0QkFBNEIsU0FBUyxlQUFlLGtCQUNwRCwyQkFBMkIsT0FBTyxTQUFTLGVBQWUsb0JBQzFELDJCQUEyQixPQUFPLFNBQVMsU0FBUyxlQUFlLGNBQ25FLDJCQUEyQixPQUFPLFNBQVMsU0FBUyxPQUNwRDtBQUNBLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxFQUNMLDRCQUE0QixTQUFTLGVBQWUsb0JBQ3BELDJCQUEyQixTQUFTLFNBQVMsZUFBZSxjQUM1RCwyQkFBMkIsU0FBUyxTQUFTO0FBRWpEO0FBRU8sU0FBUyxjQUFjLGFBQXFDO0FBQ2pFLE1BQUksaUJBQWlCLFdBQVcsR0FBRztBQUNqQyxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sU0FBUyxVQUFVLFdBQVc7QUFDcEMsTUFBSSxDQUFDLFFBQVE7QUFDWCxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQ0UsT0FBTyxTQUFTLGVBQWUsb0JBQy9CLE9BQU8sU0FBUyxTQUFTLGVBQWUsY0FDeEMsT0FBTyxTQUFTLFNBQVMsWUFDekIsVUFBVSxNQUFNLEdBQUcsU0FBUyxlQUFlLGdCQUMzQztBQUNBLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxjQUFjLE1BQU07QUFDN0I7QUFFTyxTQUFTLGdCQUFnQixNQUF3QjtBQUN0RCxTQUNFLEtBQUssY0FBYyxFQUFFLEtBQUssQ0FBQyxXQUFXLE9BQU8sU0FBUyxNQUFNLEtBQzVELEtBQUssY0FBYyxFQUFFLEtBQUssQ0FBQyxXQUFXLE9BQU8sU0FBUyxNQUFNO0FBRWhFOyIsCiAgIm5hbWVzIjogW10KfQo=
48
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L2ZldGNoLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLFNBQVMsc0JBQWdDO0FBQ3pDLE9BQWU7QUFFZixTQUFTLFdBQVcsd0JBQXdCO0FBRXJDLFNBQVMsNkJBQTZCLHNCQUE4QjtBQUN6RSxTQUFPLFNBQVMsb0JBQW9CO0FBQ3RDO0FBRU8sU0FBUywrQkFBK0Isc0JBQThCO0FBQzNFLFNBQU8sR0FBRyxvQkFBb0I7QUFDaEM7QUFFTyxTQUFTLGdDQUFnQyxzQkFBOEI7QUFDNUUsU0FBTyxHQUFHLG9CQUFvQjtBQUNoQztBQUVPLFNBQVMsK0JBQStCLHVCQUErQztBQUM1RixRQUFNLDZCQUE2QixVQUFVLHFCQUFxQjtBQUNsRSxNQUFJLDRCQUE0QixTQUFTLGVBQWUsb0JBQW9CO0FBQzFFLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFDRSw0QkFBNEIsU0FBUyxlQUFlLGtCQUNwRCwyQkFBMkIsT0FBTyxTQUFTLGVBQWUsb0JBQzFELDJCQUEyQixPQUFPLFNBQVMsU0FBUyxlQUFlLGNBQ25FLDJCQUEyQixPQUFPLFNBQVMsU0FBUyxPQUNwRDtBQUNBLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxFQUNMLDRCQUE0QixTQUFTLGVBQWUsb0JBQ3BELDJCQUEyQixTQUFTLFNBQVMsZUFBZSxjQUM1RCwyQkFBMkIsU0FBUyxTQUFTO0FBRWpEO0FBRU8sU0FBUyxjQUFjLGFBQXFDO0FBQ2pFLE1BQUksaUJBQWlCLFdBQVcsR0FBRztBQUNqQyxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sU0FBUyxVQUFVLFdBQVc7QUFDcEMsTUFBSSxDQUFDLFFBQVE7QUFDWCxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQ0UsT0FBTyxTQUFTLGVBQWUsb0JBQy9CLE9BQU8sU0FBUyxTQUFTLGVBQWUsY0FDeEMsT0FBTyxTQUFTLFNBQVMsWUFDekIsVUFBVSxNQUFNLEdBQUcsU0FBUyxlQUFlLGdCQUMzQztBQUNBLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxjQUFjLE1BQU07QUFDN0I7QUFFTyxTQUFTLGdCQUFnQixNQUF3QjtBQUN0RCxTQUNFLEtBQUssY0FBYyxFQUFFLEtBQUssQ0FBQyxXQUFXLE9BQU8sU0FBUyxNQUFNLEtBQzVELEtBQUssY0FBYyxFQUFFLEtBQUssQ0FBQyxXQUFXLE9BQU8sU0FBUyxRQUFRLEtBQzlELEtBQUssY0FBYyxFQUFFLEtBQUssQ0FBQyxXQUFXLE9BQU8sU0FBUyxTQUFTLEtBQy9ELEtBQUssY0FBYyxFQUFFLEtBQUssQ0FBQyxXQUFXLE9BQU8sU0FBUyxNQUFNO0FBRWhFOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,394 @@
1
+ // src/agent/no-expect-assertion.ts
2
+ import { strict as assert } from "node:assert";
3
+ import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
4
+ import "typescript";
5
+ import {
6
+ getEnclosingFunction,
7
+ getEnclosingScopeNode,
8
+ getEnclosingStatement,
9
+ getParent,
10
+ isUsedInArrayOrAsArgument
11
+ } from "../library/ts-tree.mjs";
12
+ import getDocumentationUrl from "../get-documentation-url.mjs";
13
+ import { getIndentation } from "../library/format.mjs";
14
+ import { analyzeResponseReferences } from "./response-reference.mjs";
15
+ import {
16
+ getResponseBodyRetrievalText,
17
+ getResponseHeadersRetrievalText,
18
+ getResponseStatusRetrievalText,
19
+ isFetchResponse
20
+ } from "./fetch.mjs";
21
+ var ruleId = "no-expect-assertion";
22
+ function analyzeFixtureCall(call, results, sourceCode) {
23
+ const parent = getParent(call);
24
+ assert.ok(parent, "parent should exist for fixture/supertest call node");
25
+ let nextCall;
26
+ if (parent.type === AST_NODE_TYPES.ReturnStatement) {
27
+ results.fixtureNode = call;
28
+ results.rootNode = parent;
29
+ } else if (parent.type === AST_NODE_TYPES.ArrayExpression || parent.type === AST_NODE_TYPES.CallExpression || parent.type === AST_NODE_TYPES.ArrowFunctionExpression) {
30
+ results.fixtureNode = call;
31
+ results.rootNode = call;
32
+ } else if (parent.type === AST_NODE_TYPES.AwaitExpression) {
33
+ results.fixtureNode = call;
34
+ const enclosingStatement = getEnclosingStatement(parent);
35
+ assert.ok(enclosingStatement);
36
+ const awaitParent = getParent(parent);
37
+ if (awaitParent?.type === AST_NODE_TYPES.MemberExpression) {
38
+ results.rootNode = parent;
39
+ results.inlineStatementNode = enclosingStatement;
40
+ if (awaitParent.property.type === AST_NODE_TYPES.Identifier && awaitParent.property.name === "body") {
41
+ results.inlineBodyReference = awaitParent;
42
+ }
43
+ if (awaitParent.property.type === AST_NODE_TYPES.Identifier && (awaitParent.property.name === "status" || awaitParent.property.name === "statusCode")) {
44
+ results.inlineStatusReference = awaitParent;
45
+ }
46
+ if (awaitParent.property.type === AST_NODE_TYPES.Identifier && (awaitParent.property.name === "header" || awaitParent.property.name === "headers")) {
47
+ results.inlineHeadersReference = awaitParent;
48
+ }
49
+ } else if (enclosingStatement.type === AST_NODE_TYPES.VariableDeclaration) {
50
+ results.variableDeclaration = enclosingStatement;
51
+ results.rootNode = enclosingStatement;
52
+ } else if (enclosingStatement.type === AST_NODE_TYPES.ExpressionStatement && enclosingStatement.expression.type === AST_NODE_TYPES.AssignmentExpression) {
53
+ results.variableAssignment = enclosingStatement;
54
+ results.rootNode = enclosingStatement;
55
+ } else {
56
+ results.rootNode = parent;
57
+ }
58
+ } else if (parent.type === AST_NODE_TYPES.MemberExpression && parent.property.type === AST_NODE_TYPES.Identifier) {
59
+ if (parent.property.name === "expect") {
60
+ const assertionCall = getParent(parent);
61
+ assert.ok(assertionCall && assertionCall.type === AST_NODE_TYPES.CallExpression);
62
+ results.assertions = [...results.assertions ?? [], assertionCall.arguments];
63
+ nextCall = assertionCall;
64
+ }
65
+ } else {
66
+ throw new Error(`Unexpected expression in fixture/supertest call ${sourceCode.getText(parent)}.`);
67
+ }
68
+ if (nextCall) {
69
+ analyzeFixtureCall(nextCall, results, sourceCode);
70
+ }
71
+ }
72
+ function createResponseAssertions(fixtureCallInformation, sourceCode, responseVariableName, destructuringResponseHeadersVariable) {
73
+ let statusAssertion;
74
+ const nonStatusAssertions = [];
75
+ for (const expectArguments of fixtureCallInformation.assertions ?? []) {
76
+ if (expectArguments.length === 1) {
77
+ const [assertionArgument] = expectArguments;
78
+ assert.ok(assertionArgument);
79
+ 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.")) {
80
+ statusAssertion = `assert.equal(${responseVariableName}.status, ${sourceCode.getText(assertionArgument)})`;
81
+ } else if (assertionArgument.type === AST_NODE_TYPES.ArrowFunctionExpression) {
82
+ let functionBody = sourceCode.getText(assertionArgument.body);
83
+ const [originalResponseArgument] = assertionArgument.params;
84
+ assert.ok(originalResponseArgument?.type === AST_NODE_TYPES.Identifier);
85
+ const originalResponseArgumentName = originalResponseArgument.name;
86
+ if (originalResponseArgumentName !== responseVariableName) {
87
+ functionBody = functionBody.replace(
88
+ new RegExp(`\\b${originalResponseArgumentName}\\b`, "ug"),
89
+ responseVariableName
90
+ );
91
+ }
92
+ nonStatusAssertions.push(`assert.doesNotThrow(()=>${functionBody})`);
93
+ } else if (assertionArgument.type === AST_NODE_TYPES.Identifier) {
94
+ nonStatusAssertions.push(
95
+ `assert.doesNotThrow(()=>${sourceCode.getText(assertionArgument)}(${responseVariableName}))`
96
+ );
97
+ } else if (assertionArgument.type === AST_NODE_TYPES.ObjectExpression || assertionArgument.type === AST_NODE_TYPES.CallExpression) {
98
+ nonStatusAssertions.push(
99
+ `assert.deepEqual(await ${responseVariableName}.json(), ${sourceCode.getText(assertionArgument)})`
100
+ );
101
+ } else {
102
+ throw new Error(`Unexpected Supertest assertion argument: ".expect(${sourceCode.getText(assertionArgument)})`);
103
+ }
104
+ } else if (expectArguments.length === 2) {
105
+ const [headerName, headerValue] = expectArguments;
106
+ assert.ok(headerName && headerValue);
107
+ const headersReference = destructuringResponseHeadersVariable !== void 0 ? destructuringResponseHeadersVariable.name : `${responseVariableName}.headers`;
108
+ if (headerValue.type === AST_NODE_TYPES.Literal && headerValue.value instanceof RegExp) {
109
+ nonStatusAssertions.push(
110
+ `assert.ok(${headersReference}.get(${sourceCode.getText(headerName)}).match(${sourceCode.getText(headerValue)}))`
111
+ );
112
+ } else {
113
+ nonStatusAssertions.push(
114
+ `assert.equal(${headersReference}.get(${sourceCode.getText(headerName)}), ${sourceCode.getText(headerValue)})`
115
+ );
116
+ }
117
+ }
118
+ }
119
+ return {
120
+ statusAssertion,
121
+ nonStatusAssertions
122
+ };
123
+ }
124
+ function getResponseVariableNameToUse(fetchFunction, fixtureCallInformation, sourceCode, scopeManager, scopeVariablesMap) {
125
+ if (fixtureCallInformation.variableAssignment) {
126
+ assert.ok(
127
+ fixtureCallInformation.variableAssignment.expression.type === AST_NODE_TYPES.AssignmentExpression && fixtureCallInformation.variableAssignment.expression.left.type === AST_NODE_TYPES.Identifier
128
+ );
129
+ return fixtureCallInformation.variableAssignment.expression.left.name;
130
+ }
131
+ if (fixtureCallInformation.variableDeclaration) {
132
+ const firstDeclaration = fixtureCallInformation.variableDeclaration.declarations[0];
133
+ if (firstDeclaration !== void 0 && firstDeclaration.id.type === AST_NODE_TYPES.Identifier) {
134
+ return firstDeclaration.id.name;
135
+ }
136
+ }
137
+ const enclosingScopeNode = getEnclosingScopeNode(fixtureCallInformation.rootNode);
138
+ assert.ok(enclosingScopeNode);
139
+ const scope = scopeManager.acquire(enclosingScopeNode);
140
+ assert.ok(scope);
141
+ let scopeVariables = scopeVariablesMap.get(scope);
142
+ if (!scopeVariables) {
143
+ scopeVariables = [...scope.set.keys()];
144
+ scopeVariablesMap.set(scope, scopeVariables);
145
+ }
146
+ let responseVariableNameBase;
147
+ if (fetchFunction.callee.type === AST_NODE_TYPES.Identifier && fetchFunction.callee.name === "fetch") {
148
+ const [urlArg, initArg] = fetchFunction.arguments;
149
+ if (urlArg?.type === AST_NODE_TYPES.Literal || urlArg?.type === AST_NODE_TYPES.TemplateLiteral) {
150
+ const urlValue = urlArg.type === AST_NODE_TYPES.Literal ? String(urlArg.value) : sourceCode.getText(urlArg);
151
+ const urlWithoutQuotes = urlValue.replace(/['"`]/gu, "");
152
+ const urlWithoutQuery = urlWithoutQuotes.includes("?") ? urlWithoutQuotes.slice(0, urlWithoutQuotes.indexOf("?")) : urlWithoutQuotes;
153
+ const parts = urlWithoutQuery.startsWith("${") ? urlWithoutQuery.split("/").slice(1) : (
154
+ // eslint-disable-next-line no-magic-numbers
155
+ urlWithoutQuery.split("/").slice(3)
156
+ );
157
+ let methodName;
158
+ if (initArg?.type === AST_NODE_TYPES.ObjectExpression) {
159
+ methodName = /method:\s*['"`](?<method>\w+)['"`]/u.exec(sourceCode.getText(initArg))?.groups?.["method"];
160
+ }
161
+ methodName ??= "GET";
162
+ responseVariableNameBase = [...parts.filter((part) => part !== "tenant"), methodName.toLowerCase()].map((part) => part.split(/[-]/u)).flat().filter((part) => part.trim() !== "" && !/\$\{.*\}/u.test(part)).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join("");
163
+ responseVariableNameBase = `${responseVariableNameBase[0]?.toLowerCase() ?? ""}${responseVariableNameBase.slice(1)}`;
164
+ }
165
+ } else {
166
+ const fullUtilityFunctionReference = sourceCode.getText(fetchFunction.callee);
167
+ responseVariableNameBase = fullUtilityFunctionReference.split(".").pop();
168
+ }
169
+ responseVariableNameBase = responseVariableNameBase === void 0 ? "response" : `${responseVariableNameBase}Response`;
170
+ let responseVariableCounter = 0;
171
+ let responseVariableNameToUse = responseVariableNameBase;
172
+ while (scopeVariables.includes(responseVariableNameToUse)) {
173
+ responseVariableCounter++;
174
+ responseVariableNameToUse = `${responseVariableNameBase}${String(responseVariableCounter)}`;
175
+ }
176
+ scopeVariables.push(responseVariableNameToUse);
177
+ return responseVariableNameToUse;
178
+ }
179
+ function isResponseBodyRedefinition(responseBodyReference) {
180
+ const parent = getParent(responseBodyReference);
181
+ return parent?.type === AST_NODE_TYPES.VariableDeclarator && parent.id.type === AST_NODE_TYPES.Identifier;
182
+ }
183
+ var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
184
+ var rule = createRule({
185
+ name: ruleId,
186
+ meta: {
187
+ type: "suggestion",
188
+ docs: {
189
+ description: "Transform supertest assersions to regular node assertions.",
190
+ url: getDocumentationUrl(ruleId)
191
+ },
192
+ messages: {
193
+ preferNativeFetch: "Transform supertest assersions to regular node assertions.",
194
+ unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
195
+ },
196
+ fixable: "code",
197
+ schema: []
198
+ },
199
+ defaultOptions: [],
200
+ // eslint-disable-next-line max-lines-per-function
201
+ create(context) {
202
+ const sourceCode = context.sourceCode;
203
+ const parserServices = ESLintUtils.getParserServices(context);
204
+ const typeChecker = parserServices.program.getTypeChecker();
205
+ const scopeManager = sourceCode.scopeManager;
206
+ assert.ok(scopeManager !== null);
207
+ const scopeVariablesMap = /* @__PURE__ */ new Map();
208
+ return {
209
+ // eslint-disable-next-line max-lines-per-function
210
+ 'CallExpression[callee.property.name="expect"]': (expectCall) => {
211
+ try {
212
+ if (expectCall.callee.type !== AST_NODE_TYPES.MemberExpression || expectCall.callee.object.type !== AST_NODE_TYPES.CallExpression) {
213
+ return;
214
+ }
215
+ const calleeObject = expectCall.callee.object;
216
+ const calleeObjectTsNode = parserServices.esTreeNodeToTSNodeMap.get(calleeObject);
217
+ const calleeObjectType = typeChecker.getTypeAtLocation(calleeObjectTsNode);
218
+ const calleeObjectTypeSymbol = calleeObjectType.getSymbol();
219
+ if (!calleeObjectTypeSymbol || calleeObjectTypeSymbol.name !== "Promise") {
220
+ return;
221
+ }
222
+ const [calleeObjectPromiseType] = typeChecker.getTypeArguments(calleeObjectType);
223
+ if (calleeObjectPromiseType === void 0 || !isFetchResponse(calleeObjectPromiseType)) {
224
+ return;
225
+ }
226
+ const indentation = getIndentation(expectCall, sourceCode);
227
+ const fixtureCallInformation = {};
228
+ const fetchFunction = expectCall.callee.object;
229
+ analyzeFixtureCall(fetchFunction, fixtureCallInformation, sourceCode);
230
+ const {
231
+ variable: responseVariable,
232
+ bodyReferences: responseBodyReferences,
233
+ // headersReferences: responseHeadersReferences,
234
+ statusReferences: responseStatusReferences,
235
+ destructuringBodyVariable: destructuringResponseBodyVariable,
236
+ destructuringHeadersVariable: destructuringResponseHeadersVariable,
237
+ destructuringStatusVariable: destructuringResponseStatusVariable
238
+ } = analyzeResponseReferences(fixtureCallInformation.variableDeclaration, scopeManager);
239
+ const shouldUsePromiseThen = isUsedInArrayOrAsArgument(expectCall) || getEnclosingFunction(expectCall)?.async === false;
240
+ if (shouldUsePromiseThen) {
241
+ const responseVariableNameToUse = "res";
242
+ const { statusAssertion, nonStatusAssertions } = createResponseAssertions(
243
+ fixtureCallInformation,
244
+ sourceCode,
245
+ responseVariableNameToUse,
246
+ destructuringResponseHeadersVariable
247
+ );
248
+ const fetchCallText = sourceCode.getText(fetchFunction);
249
+ const disableLintComment = "// eslint-disable-next-line @checkdigit/no-promise-instance-method";
250
+ const appendingAssignmentAndAssertionText = [
251
+ ...statusAssertion !== void 0 ? [statusAssertion] : [],
252
+ ...nonStatusAssertions
253
+ ].join(`;
254
+ ${indentation}`);
255
+ const replacementText = fixtureCallInformation.assertions ? [
256
+ disableLintComment,
257
+ `${fetchCallText}.then((${responseVariableNameToUse}) => {`,
258
+ appendingAssignmentAndAssertionText === "" ? "" : ` ${appendingAssignmentAndAssertionText};`,
259
+ ` return ${responseVariableNameToUse};`,
260
+ `})`
261
+ ].join(`
262
+ ${indentation}`) : fetchCallText;
263
+ context.report({
264
+ node: fixtureCallInformation.rootNode,
265
+ messageId: "preferNativeFetch",
266
+ fix(fixer) {
267
+ return fixer.replaceText(fixtureCallInformation.fixtureNode, replacementText);
268
+ }
269
+ });
270
+ } else {
271
+ const responseVariableNameToUse = getResponseVariableNameToUse(
272
+ fetchFunction,
273
+ fixtureCallInformation,
274
+ sourceCode,
275
+ scopeManager,
276
+ scopeVariablesMap
277
+ );
278
+ const isResponseBodyVariableRedefinitionNeeded = destructuringResponseBodyVariable !== void 0 || fixtureCallInformation.inlineBodyReference !== void 0 || responseBodyReferences.length > 0 && !responseBodyReferences.some(isResponseBodyRedefinition);
279
+ const redefineResponseBodyVariableName = `${responseVariableNameToUse}Body`;
280
+ const isResponseStatusVariableRedefinitionNeeded = destructuringResponseStatusVariable !== void 0 || fixtureCallInformation.inlineStatusReference !== void 0;
281
+ const redefineResponseStatusVariableName = `${responseVariableNameToUse}Status`;
282
+ const isResponseHeadersVariableRedefinitionNeeded = destructuringResponseHeadersVariable !== void 0 && // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
283
+ destructuringResponseHeadersVariable.type === AST_NODE_TYPES.ObjectPattern || fixtureCallInformation.inlineHeadersReference !== void 0;
284
+ const redefineResponseHeadersVariableName = `${responseVariableNameToUse}Headers`;
285
+ const isResponseVariableRedefinitionNeeded = fixtureCallInformation.variableAssignment === void 0 && responseVariable === void 0 && fixtureCallInformation.assertions !== void 0 || isResponseBodyVariableRedefinitionNeeded || isResponseStatusVariableRedefinitionNeeded || isResponseHeadersVariableRedefinitionNeeded;
286
+ const responseBodyHeadersVariableRedefineLines = isResponseVariableRedefinitionNeeded ? [
287
+ // eslint-disable-next-line no-nested-ternary
288
+ ...destructuringResponseBodyVariable ? [
289
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
290
+ `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${destructuringResponseBodyVariable.type === AST_NODE_TYPES.ObjectPattern ? sourceCode.getText(destructuringResponseBodyVariable) : destructuringResponseBodyVariable.name} = ${getResponseBodyRetrievalText(responseVariableNameToUse)}`
291
+ ] : isResponseBodyVariableRedefinitionNeeded ? [
292
+ `const ${redefineResponseBodyVariableName} = ${getResponseBodyRetrievalText(responseVariableNameToUse)}`
293
+ ] : [],
294
+ // eslint-disable-next-line no-nested-ternary
295
+ ...destructuringResponseStatusVariable ? [
296
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
297
+ `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${destructuringResponseStatusVariable.type === AST_NODE_TYPES.ObjectPattern ? sourceCode.getText(destructuringResponseStatusVariable) : destructuringResponseStatusVariable.name} = ${getResponseStatusRetrievalText(responseVariableNameToUse)}`
298
+ ] : isResponseStatusVariableRedefinitionNeeded ? [
299
+ `const ${redefineResponseStatusVariableName} = ${getResponseStatusRetrievalText(responseVariableNameToUse)}`
300
+ ] : [],
301
+ // eslint-disable-next-line no-nested-ternary
302
+ ...destructuringResponseHeadersVariable ? (
303
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
304
+ destructuringResponseHeadersVariable.type === AST_NODE_TYPES.ObjectPattern ? destructuringResponseHeadersVariable.properties.map((property) => {
305
+ assert.ok(property.type === AST_NODE_TYPES.Property);
306
+ assert.ok(property.value.type === AST_NODE_TYPES.Identifier);
307
+ 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)}'`})`;
308
+ }) : [
309
+ `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${destructuringResponseHeadersVariable.name} = ${getResponseHeadersRetrievalText(responseVariableNameToUse)}`
310
+ ]
311
+ ) : isResponseHeadersVariableRedefinitionNeeded ? [
312
+ `const ${redefineResponseHeadersVariableName} = ${getResponseHeadersRetrievalText(responseVariableNameToUse)}`
313
+ ] : []
314
+ ] : [];
315
+ const { statusAssertion, nonStatusAssertions } = createResponseAssertions(
316
+ fixtureCallInformation,
317
+ sourceCode,
318
+ responseVariableNameToUse,
319
+ destructuringResponseHeadersVariable
320
+ );
321
+ const fetchCallText = sourceCode.getText(fetchFunction);
322
+ const fetchStatementText = !isResponseVariableRedefinitionNeeded ? fetchCallText : `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${responseVariableNameToUse} = await ${fetchCallText}`;
323
+ const nodeToReplace = isResponseVariableRedefinitionNeeded ? fixtureCallInformation.rootNode : fixtureCallInformation.fixtureNode;
324
+ const appendingAssignmentAndAssertionText = [
325
+ "",
326
+ ...statusAssertion !== void 0 ? [statusAssertion] : [],
327
+ ...responseBodyHeadersVariableRedefineLines,
328
+ ...nonStatusAssertions
329
+ ].join(`;
330
+ ${indentation}`);
331
+ context.report({
332
+ node: expectCall,
333
+ messageId: "preferNativeFetch",
334
+ *fix(fixer) {
335
+ if (fixtureCallInformation.inlineStatementNode) {
336
+ const preInlineDeclaration = [
337
+ fetchStatementText,
338
+ `${appendingAssignmentAndAssertionText};
339
+ ${indentation}`
340
+ ].join(``);
341
+ yield fixer.insertTextBefore(fixtureCallInformation.inlineStatementNode, preInlineDeclaration);
342
+ } else {
343
+ yield fixer.replaceText(nodeToReplace, fetchStatementText);
344
+ const needEndingSemiColon = sourceCode.getText(nodeToReplace).endsWith(";");
345
+ yield fixer.insertTextAfter(
346
+ nodeToReplace,
347
+ needEndingSemiColon ? `${appendingAssignmentAndAssertionText};` : appendingAssignmentAndAssertionText
348
+ );
349
+ }
350
+ for (const responseBodyReference of responseBodyReferences) {
351
+ yield fixer.replaceText(
352
+ responseBodyReference,
353
+ isResponseBodyVariableRedefinitionNeeded || !isResponseBodyRedefinition(responseBodyReference) ? redefineResponseBodyVariableName : getResponseBodyRetrievalText(responseVariableNameToUse)
354
+ );
355
+ }
356
+ if (fixtureCallInformation.inlineBodyReference) {
357
+ yield fixer.replaceText(fixtureCallInformation.inlineBodyReference, redefineResponseBodyVariableName);
358
+ }
359
+ for (const responseStatusReference of responseStatusReferences) {
360
+ if (responseStatusReference.property.type === AST_NODE_TYPES.Identifier && responseStatusReference.property.name === "statusCode") {
361
+ yield fixer.replaceText(responseStatusReference.property, `status`);
362
+ }
363
+ }
364
+ if (fixtureCallInformation.rootNode.type === AST_NODE_TYPES.ReturnStatement && fixtureCallInformation.assertions !== void 0) {
365
+ yield fixer.insertTextAfter(
366
+ fixtureCallInformation.rootNode,
367
+ `
368
+ ${indentation}return ${responseVariableNameToUse};`
369
+ );
370
+ }
371
+ }
372
+ });
373
+ }
374
+ } catch (error) {
375
+ console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
376
+ context.report({
377
+ node: expectCall,
378
+ messageId: "unknownError",
379
+ data: {
380
+ fileName: context.filename,
381
+ error: error instanceof Error ? error.toString() : JSON.stringify(error)
382
+ }
383
+ });
384
+ }
385
+ }
386
+ };
387
+ }
388
+ });
389
+ var no_expect_assertion_default = rule;
390
+ export {
391
+ no_expect_assertion_default as default,
392
+ ruleId
393
+ };
394
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L25vLWV4cGVjdC1hc3NlcnRpb24udHMiXSwKICAibWFwcGluZ3MiOiAiO0FBUUEsU0FBUyxVQUFVLGNBQWM7QUFFakMsU0FBUyxnQkFBZ0IsbUJBQTZCO0FBR3RELE9BQWU7QUFFZjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLE9BQU8seUJBQXlCO0FBQ2hDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsaUNBQWlDO0FBQzFDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFQSxJQUFNLFNBQVM7QUFxQnRCLFNBQVMsbUJBQW1CLE1BQStCLFNBQWlDLFlBQXdCO0FBQ2xILFFBQU0sU0FBUyxVQUFVLElBQUk7QUFDN0IsU0FBTyxHQUFHLFFBQVEscURBQXFEO0FBRXZFLE1BQUk7QUFDSixNQUFJLE9BQU8sU0FBUyxlQUFlLGlCQUFpQjtBQUVsRCxZQUFRLGNBQWM7QUFDdEIsWUFBUSxXQUFXO0FBQUEsRUFDckIsV0FDRSxPQUFPLFNBQVMsZUFBZSxtQkFDL0IsT0FBTyxTQUFTLGVBQWUsa0JBQy9CLE9BQU8sU0FBUyxlQUFlLHlCQUMvQjtBQUVBLFlBQVEsY0FBYztBQUN0QixZQUFRLFdBQVc7QUFBQSxFQUNyQixXQUFXLE9BQU8sU0FBUyxlQUFlLGlCQUFpQjtBQUN6RCxZQUFRLGNBQWM7QUFDdEIsVUFBTSxxQkFBcUIsc0JBQXNCLE1BQU07QUFDdkQsV0FBTyxHQUFHLGtCQUFrQjtBQUM1QixVQUFNLGNBQWMsVUFBVSxNQUFNO0FBQ3BDLFFBQUksYUFBYSxTQUFTLGVBQWUsa0JBQWtCO0FBQ3pELGNBQVEsV0FBVztBQUNuQixjQUFRLHNCQUFzQjtBQUM5QixVQUFJLFlBQVksU0FBUyxTQUFTLGVBQWUsY0FBYyxZQUFZLFNBQVMsU0FBUyxRQUFRO0FBQ25HLGdCQUFRLHNCQUFzQjtBQUFBLE1BQ2hDO0FBQ0EsVUFDRSxZQUFZLFNBQVMsU0FBUyxlQUFlLGVBQzVDLFlBQVksU0FBUyxTQUFTLFlBQVksWUFBWSxTQUFTLFNBQVMsZUFDekU7QUFDQSxnQkFBUSx3QkFBd0I7QUFBQSxNQUNsQztBQUNBLFVBQ0UsWUFBWSxTQUFTLFNBQVMsZUFBZSxlQUM1QyxZQUFZLFNBQVMsU0FBUyxZQUFZLFlBQVksU0FBUyxTQUFTLFlBQ3pFO0FBQ0EsZ0JBQVEseUJBQXlCO0FBQUEsTUFDbkM7QUFBQSxJQUNGLFdBQVcsbUJBQW1CLFNBQVMsZUFBZSxxQkFBcUI7QUFDekUsY0FBUSxzQkFBc0I7QUFDOUIsY0FBUSxXQUFXO0FBQUEsSUFDckIsV0FDRSxtQkFBbUIsU0FBUyxlQUFlLHVCQUMzQyxtQkFBbUIsV0FBVyxTQUFTLGVBQWUsc0JBQ3REO0FBQ0EsY0FBUSxxQkFBcUI7QUFDN0IsY0FBUSxXQUFXO0FBQUEsSUFDckIsT0FBTztBQUNMLGNBQVEsV0FBVztBQUFBLElBQ3JCO0FBQUEsRUFDRixXQUFXLE9BQU8sU0FBUyxlQUFlLG9CQUFvQixPQUFPLFNBQVMsU0FBUyxlQUFlLFlBQVk7QUFDaEgsUUFBSSxPQUFPLFNBQVMsU0FBUyxVQUFVO0FBRXJDLFlBQU0sZ0JBQWdCLFVBQVUsTUFBTTtBQUN0QyxhQUFPLEdBQUcsaUJBQWlCLGNBQWMsU0FBUyxlQUFlLGNBQWM7QUFDL0UsY0FBUSxhQUFhLENBQUMsR0FBSSxRQUFRLGNBQWMsQ0FBQyxHQUFJLGNBQWMsU0FBa0M7QUFDckcsaUJBQVc7QUFBQSxJQUNiO0FBQUEsRUFDRixPQUFPO0FBQ0wsVUFBTSxJQUFJLE1BQU0sbURBQW1ELFdBQVcsUUFBUSxNQUFNLENBQUMsR0FBRztBQUFBLEVBQ2xHO0FBQ0EsTUFBSSxVQUFVO0FBQ1osdUJBQW1CLFVBQVUsU0FBUyxVQUFVO0FBQUEsRUFDbEQ7QUFDRjtBQUdBLFNBQVMseUJBQ1Asd0JBQ0EsWUFDQSxzQkFDQSxzQ0FDQTtBQUNBLE1BQUk7QUFDSixRQUFNLHNCQUFnQyxDQUFDO0FBQ3ZDLGFBQVcsbUJBQW1CLHVCQUF1QixjQUFjLENBQUMsR0FBRztBQUNyRSxRQUFJLGdCQUFnQixXQUFXLEdBQUc7QUFDaEMsWUFBTSxDQUFDLGlCQUFpQixJQUFJO0FBQzVCLGFBQU8sR0FBRyxpQkFBaUI7QUFDM0IsVUFDRyxrQkFBa0IsU0FBUyxlQUFlLG9CQUN6QyxrQkFBa0IsT0FBTyxTQUFTLGVBQWUsY0FDakQsa0JBQWtCLE9BQU8sU0FBUyxpQkFDcEMsa0JBQWtCLFNBQVMsZUFBZSxXQUMxQyxXQUFXLFFBQVEsaUJBQWlCLEVBQUUsU0FBUyxjQUFjLEdBQzdEO0FBRUEsMEJBQWtCLGdCQUFnQixvQkFBb0IsWUFBWSxXQUFXLFFBQVEsaUJBQWlCLENBQUM7QUFBQSxNQUN6RyxXQUFXLGtCQUFrQixTQUFTLGVBQWUseUJBQXlCO0FBRTVFLFlBQUksZUFBZSxXQUFXLFFBQVEsa0JBQWtCLElBQUk7QUFFNUQsY0FBTSxDQUFDLHdCQUF3QixJQUFJLGtCQUFrQjtBQUNyRCxlQUFPLEdBQUcsMEJBQTBCLFNBQVMsZUFBZSxVQUFVO0FBQ3RFLGNBQU0sK0JBQStCLHlCQUF5QjtBQUM5RCxZQUFJLGlDQUFpQyxzQkFBc0I7QUFDekQseUJBQWUsYUFBYTtBQUFBLFlBQzFCLElBQUksT0FBTyxNQUFNLDRCQUE0QixPQUFPLElBQUk7QUFBQSxZQUN4RDtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQ0EsNEJBQW9CLEtBQUssMkJBQTJCLFlBQVksR0FBRztBQUFBLE1BQ3JFLFdBQVcsa0JBQWtCLFNBQVMsZUFBZSxZQUFZO0FBRS9ELDRCQUFvQjtBQUFBLFVBQ2xCLDJCQUEyQixXQUFXLFFBQVEsaUJBQWlCLENBQUMsSUFBSSxvQkFBb0I7QUFBQSxRQUMxRjtBQUFBLE1BQ0YsV0FDRSxrQkFBa0IsU0FBUyxlQUFlLG9CQUMxQyxrQkFBa0IsU0FBUyxlQUFlLGdCQUMxQztBQUVBLDRCQUFvQjtBQUFBLFVBQ2xCLDBCQUEwQixvQkFBb0IsWUFBWSxXQUFXLFFBQVEsaUJBQWlCLENBQUM7QUFBQSxRQUNqRztBQUFBLE1BQ0YsT0FBTztBQUNMLGNBQU0sSUFBSSxNQUFNLHFEQUFxRCxXQUFXLFFBQVEsaUJBQWlCLENBQUMsR0FBRztBQUFBLE1BQy9HO0FBQUEsSUFDRixXQUFXLGdCQUFnQixXQUFXLEdBQUc7QUFFdkMsWUFBTSxDQUFDLFlBQVksV0FBVyxJQUFJO0FBQ2xDLGFBQU8sR0FBRyxjQUFjLFdBQVc7QUFDbkMsWUFBTSxtQkFDSix5Q0FBeUMsU0FDckMscUNBQXFDLE9BQ3JDLEdBQUcsb0JBQW9CO0FBQzdCLFVBQUksWUFBWSxTQUFTLGVBQWUsV0FBVyxZQUFZLGlCQUFpQixRQUFRO0FBQ3RGLDRCQUFvQjtBQUFBLFVBQ2xCLGFBQWEsZ0JBQWdCLFFBQVEsV0FBVyxRQUFRLFVBQVUsQ0FBQyxXQUFXLFdBQVcsUUFBUSxXQUFXLENBQUM7QUFBQSxRQUMvRztBQUFBLE1BQ0YsT0FBTztBQUNMLDRCQUFvQjtBQUFBLFVBQ2xCLGdCQUFnQixnQkFBZ0IsUUFBUSxXQUFXLFFBQVEsVUFBVSxDQUFDLE1BQU0sV0FBVyxRQUFRLFdBQVcsQ0FBQztBQUFBLFFBQzdHO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGO0FBR0EsU0FBUyw2QkFDUCxlQUNBLHdCQUNBLFlBQ0EsY0FDQSxtQkFDQTtBQUVBLE1BQUksdUJBQXVCLG9CQUFvQjtBQUM3QyxXQUFPO0FBQUEsTUFDTCx1QkFBdUIsbUJBQW1CLFdBQVcsU0FBUyxlQUFlLHdCQUMzRSx1QkFBdUIsbUJBQW1CLFdBQVcsS0FBSyxTQUFTLGVBQWU7QUFBQSxJQUN0RjtBQUNBLFdBQU8sdUJBQXVCLG1CQUFtQixXQUFXLEtBQUs7QUFBQSxFQUNuRTtBQUdBLE1BQUksdUJBQXVCLHFCQUFxQjtBQUM5QyxVQUFNLG1CQUFtQix1QkFBdUIsb0JBQW9CLGFBQWEsQ0FBQztBQUVsRixRQUFJLHFCQUFxQixVQUFhLGlCQUFpQixHQUFHLFNBQVMsZUFBZSxZQUFZO0FBQzVGLGFBQU8saUJBQWlCLEdBQUc7QUFBQSxJQUM3QjtBQUFBLEVBQ0Y7QUFHQSxRQUFNLHFCQUFxQixzQkFBc0IsdUJBQXVCLFFBQVE7QUFDaEYsU0FBTyxHQUFHLGtCQUFrQjtBQUM1QixRQUFNLFFBQVEsYUFBYSxRQUFRLGtCQUFrQjtBQUNyRCxTQUFPLEdBQUcsS0FBSztBQUNmLE1BQUksaUJBQWlCLGtCQUFrQixJQUFJLEtBQUs7QUFDaEQsTUFBSSxDQUFDLGdCQUFnQjtBQUNuQixxQkFBaUIsQ0FBQyxHQUFHLE1BQU0sSUFBSSxLQUFLLENBQUM7QUFDckMsc0JBQWtCLElBQUksT0FBTyxjQUFjO0FBQUEsRUFDN0M7QUFFQSxNQUFJO0FBQ0osTUFBSSxjQUFjLE9BQU8sU0FBUyxlQUFlLGNBQWMsY0FBYyxPQUFPLFNBQVMsU0FBUztBQUNwRyxVQUFNLENBQUMsUUFBUSxPQUFPLElBQUksY0FBYztBQUN4QyxRQUFJLFFBQVEsU0FBUyxlQUFlLFdBQVcsUUFBUSxTQUFTLGVBQWUsaUJBQWlCO0FBQzlGLFlBQU0sV0FBVyxPQUFPLFNBQVMsZUFBZSxVQUFVLE9BQU8sT0FBTyxLQUFLLElBQUksV0FBVyxRQUFRLE1BQU07QUFFMUcsWUFBTSxtQkFBbUIsU0FBUyxRQUFRLFdBQVcsRUFBRTtBQUN2RCxZQUFNLGtCQUFrQixpQkFBaUIsU0FBUyxHQUFHLElBQ2pELGlCQUFpQixNQUFNLEdBQUcsaUJBQWlCLFFBQVEsR0FBRyxDQUFDLElBQ3ZEO0FBQ0osWUFBTSxRQUFRLGdCQUFnQixXQUFXLElBQUksSUFDekMsZ0JBQWdCLE1BQU0sR0FBRyxFQUFFLE1BQU0sQ0FBQztBQUFBO0FBQUEsUUFFbEMsZ0JBQWdCLE1BQU0sR0FBRyxFQUFFLE1BQU0sQ0FBQztBQUFBO0FBRXRDLFVBQUk7QUFDSixVQUFJLFNBQVMsU0FBUyxlQUFlLGtCQUFrQjtBQUNyRCxxQkFBYSxzQ0FBc0MsS0FBSyxXQUFXLFFBQVEsT0FBTyxDQUFDLEdBQUcsU0FBUyxRQUFRO0FBQUEsTUFDekc7QUFDQSxxQkFBZTtBQUNmLGlDQUEyQixDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxTQUFTLFFBQVEsR0FBRyxXQUFXLFlBQVksQ0FBQyxFQUMvRixJQUFJLENBQUMsU0FBUyxLQUFLLE1BQU0sTUFBTSxDQUFDLEVBQ2hDLEtBQUssRUFDTCxPQUFPLENBQUMsU0FBUyxLQUFLLEtBQUssTUFBTSxNQUFNLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxFQUM5RCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxHQUFHLFlBQVksS0FBSyxFQUFFLEdBQUcsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQy9ELEtBQUssRUFBRTtBQUNWLGlDQUEyQixHQUFHLHlCQUF5QixDQUFDLEdBQUcsWUFBWSxLQUFLLEVBQUUsR0FBRyx5QkFBeUIsTUFBTSxDQUFDLENBQUM7QUFBQSxJQUNwSDtBQUFBLEVBQ0YsT0FBTztBQUVMLFVBQU0sK0JBQStCLFdBQVcsUUFBUSxjQUFjLE1BQU07QUFDNUUsK0JBQTJCLDZCQUE2QixNQUFNLEdBQUcsRUFBRSxJQUFJO0FBQUEsRUFDekU7QUFDQSw2QkFDRSw2QkFBNkIsU0FBWSxhQUFhLEdBQUcsd0JBQXdCO0FBRW5GLE1BQUksMEJBQTBCO0FBQzlCLE1BQUksNEJBQTRCO0FBQ2hDLFNBQU8sZUFBZSxTQUFTLHlCQUF5QixHQUFHO0FBQ3pEO0FBQ0EsZ0NBQTRCLEdBQUcsd0JBQXdCLEdBQUcsT0FBTyx1QkFBdUIsQ0FBQztBQUFBLEVBQzNGO0FBQ0EsaUJBQWUsS0FBSyx5QkFBeUI7QUFDN0MsU0FBTztBQUNUO0FBRUEsU0FBUywyQkFBMkIsdUJBQTJEO0FBQzdGLFFBQU0sU0FBUyxVQUFVLHFCQUFxQjtBQUM5QyxTQUFPLFFBQVEsU0FBUyxlQUFlLHNCQUFzQixPQUFPLEdBQUcsU0FBUyxlQUFlO0FBQ2pHO0FBRUEsSUFBTSxhQUFhLFlBQVksWUFBWSxDQUFDLFNBQVMsb0JBQW9CLElBQUksQ0FBQztBQUU5RSxJQUFNLE9BQXFFLFdBQVc7QUFBQSxFQUNwRixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsTUFDSixhQUFhO0FBQUEsTUFDYixLQUFLLG9CQUFvQixNQUFNO0FBQUEsSUFDakM7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLG1CQUFtQjtBQUFBLE1BQ25CLGNBQWM7QUFBQSxJQUNoQjtBQUFBLElBQ0EsU0FBUztBQUFBLElBQ1QsUUFBUSxDQUFDO0FBQUEsRUFDWDtBQUFBLEVBQ0EsZ0JBQWdCLENBQUM7QUFBQTtBQUFBLEVBRWpCLE9BQU8sU0FBUztBQUNkLFVBQU0sYUFBYSxRQUFRO0FBQzNCLFVBQU0saUJBQWlCLFlBQVksa0JBQWtCLE9BQU87QUFDNUQsVUFBTSxjQUFjLGVBQWUsUUFBUSxlQUFlO0FBQzFELFVBQU0sZUFBZSxXQUFXO0FBQ2hDLFdBQU8sR0FBRyxpQkFBaUIsSUFBSTtBQUMvQixVQUFNLG9CQUFvQixvQkFBSSxJQUFxQjtBQUVuRCxXQUFPO0FBQUE7QUFBQSxNQUVMLGlEQUFpRCxDQUMvQyxlQUVHO0FBQ0gsWUFBSTtBQUNGLGNBQ0UsV0FBVyxPQUFPLFNBQVMsZUFBZSxvQkFDMUMsV0FBVyxPQUFPLE9BQU8sU0FBUyxlQUFlLGdCQUNqRDtBQUNBO0FBQUEsVUFDRjtBQUdBLGdCQUFNLGVBQWUsV0FBVyxPQUFPO0FBQ3ZDLGdCQUFNLHFCQUFxQixlQUFlLHNCQUFzQixJQUFJLFlBQVk7QUFDaEYsZ0JBQU0sbUJBQW1CLFlBQVksa0JBQWtCLGtCQUFrQjtBQUN6RSxnQkFBTSx5QkFBeUIsaUJBQWlCLFVBQVU7QUFDMUQsY0FBSSxDQUFDLDBCQUEwQix1QkFBdUIsU0FBUyxXQUFXO0FBQ3hFO0FBQUEsVUFDRjtBQUNBLGdCQUFNLENBQUMsdUJBQXVCLElBQUksWUFBWSxpQkFBaUIsZ0JBQW9DO0FBQ25HLGNBQUksNEJBQTRCLFVBQWEsQ0FBQyxnQkFBZ0IsdUJBQXVCLEdBQUc7QUFDdEY7QUFBQSxVQUNGO0FBRUEsZ0JBQU0sY0FBYyxlQUFlLFlBQVksVUFBVTtBQUV6RCxnQkFBTSx5QkFBeUIsQ0FBQztBQUNoQyxnQkFBTSxnQkFBZ0IsV0FBVyxPQUFPO0FBQ3hDLDZCQUFtQixlQUFlLHdCQUF3QixVQUFVO0FBRXBFLGdCQUFNO0FBQUEsWUFDSixVQUFVO0FBQUEsWUFDVixnQkFBZ0I7QUFBQTtBQUFBLFlBRWhCLGtCQUFrQjtBQUFBLFlBQ2xCLDJCQUEyQjtBQUFBLFlBQzNCLDhCQUE4QjtBQUFBLFlBQzlCLDZCQUE2QjtBQUFBLFVBQy9CLElBQUksMEJBQTBCLHVCQUF1QixxQkFBcUIsWUFBWTtBQUV0RixnQkFBTSx1QkFDSiwwQkFBMEIsVUFBVSxLQUFLLHFCQUFxQixVQUFVLEdBQUcsVUFBVTtBQUN2RixjQUFJLHNCQUFzQjtBQUN4QixrQkFBTSw0QkFBNEI7QUFDbEMsa0JBQU0sRUFBRSxpQkFBaUIsb0JBQW9CLElBQUk7QUFBQSxjQUMvQztBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLFlBQ0Y7QUFDQSxrQkFBTSxnQkFBZ0IsV0FBVyxRQUFRLGFBQWE7QUFDdEQsa0JBQU0scUJBQXFCO0FBQzNCLGtCQUFNLHNDQUFzQztBQUFBLGNBQzFDLEdBQUksb0JBQW9CLFNBQVksQ0FBQyxlQUFlLElBQUksQ0FBQztBQUFBLGNBQ3pELEdBQUc7QUFBQSxZQUNMLEVBQUUsS0FBSztBQUFBLEVBQU0sV0FBVyxFQUFFO0FBQzFCLGtCQUFNLGtCQUFrQix1QkFBdUIsYUFDM0M7QUFBQSxjQUNFO0FBQUEsY0FDQSxHQUFHLGFBQWEsVUFBVSx5QkFBeUI7QUFBQSxjQUNuRCx3Q0FBd0MsS0FBSyxLQUFLLEtBQUssbUNBQW1DO0FBQUEsY0FDMUYsWUFBWSx5QkFBeUI7QUFBQSxjQUNyQztBQUFBLFlBQ0YsRUFBRSxLQUFLO0FBQUEsRUFBSyxXQUFXLEVBQUUsSUFDekI7QUFDSixvQkFBUSxPQUFPO0FBQUEsY0FDYixNQUFNLHVCQUF1QjtBQUFBLGNBQzdCLFdBQVc7QUFBQSxjQUNYLElBQUksT0FBTztBQUNULHVCQUFPLE1BQU0sWUFBWSx1QkFBdUIsYUFBYSxlQUFlO0FBQUEsY0FDOUU7QUFBQSxZQUNGLENBQUM7QUFBQSxVQUNILE9BQU87QUFDTCxrQkFBTSw0QkFBNEI7QUFBQSxjQUNoQztBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxZQUNGO0FBRUEsa0JBQU0sMkNBQ0osc0NBQXNDLFVBQ3RDLHVCQUF1Qix3QkFBd0IsVUFDOUMsdUJBQXVCLFNBQVMsS0FBSyxDQUFDLHVCQUF1QixLQUFLLDBCQUEwQjtBQUMvRixrQkFBTSxtQ0FBbUMsR0FBRyx5QkFBeUI7QUFFckUsa0JBQU0sNkNBQ0osd0NBQXdDLFVBQ3hDLHVCQUF1QiwwQkFBMEI7QUFDbkQsa0JBQU0scUNBQXFDLEdBQUcseUJBQXlCO0FBRXZFLGtCQUFNLDhDQUNILHlDQUF5QztBQUFBLFlBRXZDLHFDQUFnRSxTQUMvRCxlQUFlLGlCQUNuQix1QkFBdUIsMkJBQTJCO0FBQ3BELGtCQUFNLHNDQUFzQyxHQUFHLHlCQUF5QjtBQUV4RSxrQkFBTSx1Q0FDSCx1QkFBdUIsdUJBQXVCLFVBQzdDLHFCQUFxQixVQUNyQix1QkFBdUIsZUFBZSxVQUN4Qyw0Q0FDQSw4Q0FDQTtBQUVGLGtCQUFNLDJDQUEyQyx1Q0FDN0M7QUFBQTtBQUFBLGNBRUUsR0FBSSxvQ0FDQTtBQUFBO0FBQUEsZ0JBRUUsR0FBRyx1QkFBdUIscUJBQXFCLFFBQVEsT0FBTyxJQUFLLGtDQUE2RCxTQUFTLGVBQWUsZ0JBQWdCLFdBQVcsUUFBUSxpQ0FBMkQsSUFBSyxrQ0FBK0MsSUFBSSxNQUFNLDZCQUE2Qix5QkFBeUIsQ0FBQztBQUFBLGNBQzdXLElBQ0EsMkNBQ0U7QUFBQSxnQkFDRSxTQUFTLGdDQUFnQyxNQUFNLDZCQUE2Qix5QkFBeUIsQ0FBQztBQUFBLGNBQ3hHLElBQ0EsQ0FBQztBQUFBO0FBQUEsY0FFUCxHQUFJLHNDQUNBO0FBQUE7QUFBQSxnQkFFRSxHQUFHLHVCQUF1QixxQkFBcUIsUUFBUSxPQUFPLElBQUssb0NBQStELFNBQVMsZUFBZSxnQkFBZ0IsV0FBVyxRQUFRLG1DQUE2RCxJQUFLLG9DQUFpRCxJQUFJLE1BQU0sK0JBQStCLHlCQUF5QixDQUFDO0FBQUEsY0FDclgsSUFDQSw2Q0FDRTtBQUFBLGdCQUNFLFNBQVMsa0NBQWtDLE1BQU0sK0JBQStCLHlCQUF5QixDQUFDO0FBQUEsY0FDNUcsSUFDQSxDQUFDO0FBQUE7QUFBQSxjQUVQLEdBQUk7QUFBQTtBQUFBLGdCQUVDLHFDQUFnRSxTQUNqRSxlQUFlLGdCQUNaLHFDQUFnRSxXQUFXLElBQUksQ0FBQyxhQUFhO0FBQzVGLHlCQUFPLEdBQUcsU0FBUyxTQUFTLGVBQWUsUUFBUTtBQUNuRCx5QkFBTyxHQUFHLFNBQVMsTUFBTSxTQUFTLGVBQWUsVUFBVTtBQUUzRCx5QkFBTyxHQUFHLHVCQUF1QixxQkFBcUIsUUFBUSxPQUFPLElBQUksU0FBUyxNQUFNLElBQUksTUFBTSxnQ0FBZ0MseUJBQXlCLENBQUMsUUFBUSxTQUFTLElBQUksU0FBUyxlQUFlLFVBQVUsV0FBVyxRQUFRLFNBQVMsR0FBRyxJQUFJLElBQUksV0FBVyxRQUFRLFNBQVMsR0FBRyxDQUFDLEdBQUc7QUFBQSxnQkFDL1IsQ0FBQyxJQUNEO0FBQUEsa0JBQ0UsR0FBRyx1QkFBdUIscUJBQXFCLFFBQVEsT0FBTyxJQUFLLHFDQUFrRCxJQUFJLE1BQU0sZ0NBQWdDLHlCQUF5QixDQUFDO0FBQUEsZ0JBQzNMO0FBQUEsa0JBQ0YsOENBQ0U7QUFBQSxnQkFDRSxTQUFTLG1DQUFtQyxNQUFNLGdDQUFnQyx5QkFBeUIsQ0FBQztBQUFBLGNBQzlHLElBQ0EsQ0FBQztBQUFBLFlBQ1QsSUFDQSxDQUFDO0FBRUwsa0JBQU0sRUFBRSxpQkFBaUIsb0JBQW9CLElBQUk7QUFBQSxjQUMvQztBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLFlBQ0Y7QUFHQSxrQkFBTSxnQkFBZ0IsV0FBVyxRQUFRLGFBQWE7QUFDdEQsa0JBQU0scUJBQXFCLENBQUMsdUNBQ3hCLGdCQUNBLEdBQUcsdUJBQXVCLHFCQUFxQixRQUFRLE9BQU8sSUFBSSx5QkFBeUIsWUFBWSxhQUFhO0FBRXhILGtCQUFNLGdCQUFnQix1Q0FDbEIsdUJBQXVCLFdBQ3ZCLHVCQUF1QjtBQUMzQixrQkFBTSxzQ0FBc0M7QUFBQSxjQUMxQztBQUFBLGNBQ0EsR0FBSSxvQkFBb0IsU0FBWSxDQUFDLGVBQWUsSUFBSSxDQUFDO0FBQUEsY0FDekQsR0FBRztBQUFBLGNBQ0gsR0FBRztBQUFBLFlBQ0wsRUFBRSxLQUFLO0FBQUEsRUFBTSxXQUFXLEVBQUU7QUFFMUIsb0JBQVEsT0FBTztBQUFBLGNBQ2IsTUFBTTtBQUFBLGNBQ04sV0FBVztBQUFBLGNBRVgsQ0FBQyxJQUFJLE9BQU87QUFDVixvQkFBSSx1QkFBdUIscUJBQXFCO0FBQzlDLHdCQUFNLHVCQUF1QjtBQUFBLG9CQUMzQjtBQUFBLG9CQUNBLEdBQUcsbUNBQW1DO0FBQUEsRUFBTSxXQUFXO0FBQUEsa0JBQ3pELEVBQUUsS0FBSyxFQUFFO0FBQ1Qsd0JBQU0sTUFBTSxpQkFBaUIsdUJBQXVCLHFCQUFxQixvQkFBb0I7QUFBQSxnQkFDL0YsT0FBTztBQUNMLHdCQUFNLE1BQU0sWUFBWSxlQUFlLGtCQUFrQjtBQUV6RCx3QkFBTSxzQkFBc0IsV0FBVyxRQUFRLGFBQWEsRUFBRSxTQUFTLEdBQUc7QUFDMUUsd0JBQU0sTUFBTTtBQUFBLG9CQUNWO0FBQUEsb0JBQ0Esc0JBQ0ksR0FBRyxtQ0FBbUMsTUFDdEM7QUFBQSxrQkFDTjtBQUFBLGdCQUNGO0FBR0EsMkJBQVcseUJBQXlCLHdCQUF3QjtBQUMxRCx3QkFBTSxNQUFNO0FBQUEsb0JBQ1Y7QUFBQSxvQkFDQSw0Q0FBNEMsQ0FBQywyQkFBMkIscUJBQXFCLElBQ3pGLG1DQUNBLDZCQUE2Qix5QkFBeUI7QUFBQSxrQkFDNUQ7QUFBQSxnQkFDRjtBQUNBLG9CQUFJLHVCQUF1QixxQkFBcUI7QUFDOUMsd0JBQU0sTUFBTSxZQUFZLHVCQUF1QixxQkFBcUIsZ0NBQWdDO0FBQUEsZ0JBQ3RHO0FBR0EsMkJBQVcsMkJBQTJCLDBCQUEwQjtBQUM5RCxzQkFDRSx3QkFBd0IsU0FBUyxTQUFTLGVBQWUsY0FDekQsd0JBQXdCLFNBQVMsU0FBUyxjQUMxQztBQUNBLDBCQUFNLE1BQU0sWUFBWSx3QkFBd0IsVUFBVSxRQUFRO0FBQUEsa0JBQ3BFO0FBQUEsZ0JBQ0Y7QUFHQSxvQkFDRSx1QkFBdUIsU0FBUyxTQUFTLGVBQWUsbUJBQ3hELHVCQUF1QixlQUFlLFFBQ3RDO0FBQ0Esd0JBQU0sTUFBTTtBQUFBLG9CQUNWLHVCQUF1QjtBQUFBLG9CQUN2QjtBQUFBLEVBQUssV0FBVyxVQUFVLHlCQUF5QjtBQUFBLGtCQUNyRDtBQUFBLGdCQUNGO0FBQUEsY0FDRjtBQUFBLFlBQ0YsQ0FBQztBQUFBLFVBQ0g7QUFBQSxRQUNGLFNBQVMsT0FBTztBQUVkLGtCQUFRLE1BQU0sbUJBQW1CLE1BQU0sbUJBQW1CLFFBQVEsUUFBUSxNQUFNLEtBQUs7QUFDckYsa0JBQVEsT0FBTztBQUFBLFlBQ2IsTUFBTTtBQUFBLFlBQ04sV0FBVztBQUFBLFlBQ1gsTUFBTTtBQUFBLGNBQ0osVUFBVSxRQUFRO0FBQUEsY0FDbEIsT0FBTyxpQkFBaUIsUUFBUSxNQUFNLFNBQVMsSUFBSSxLQUFLLFVBQVUsS0FBSztBQUFBLFlBQ3pFO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGLENBQUM7QUFFRCxJQUFPLDhCQUFROyIsCiAgIm5hbWVzIjogW10KfQo=