@checkdigit/eslint-plugin 7.5.0-PR.75-0252 → 7.5.0-PR.93-b62d

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 (71) hide show
  1. package/dist-mjs/index.mjs +4 -146
  2. package/dist-mjs/require-fixed-services-import.mjs +1 -1
  3. package/dist-mjs/require-resolve-full-response.mjs +1 -1
  4. package/dist-types/index.d.ts +1 -1
  5. package/package.json +1 -1
  6. package/src/index.ts +2 -144
  7. package/src/require-fixed-services-import.ts +1 -1
  8. package/src/require-resolve-full-response.ts +0 -2
  9. package/dist-mjs/agent/add-assert-import.mjs +0 -58
  10. package/dist-mjs/agent/add-base-path-const.mjs +0 -65
  11. package/dist-mjs/agent/add-base-path-import.mjs +0 -60
  12. package/dist-mjs/agent/add-url-domain.mjs +0 -61
  13. package/dist-mjs/agent/agent-test-wiring.mjs +0 -221
  14. package/dist-mjs/agent/fetch-response-body-json.mjs +0 -146
  15. package/dist-mjs/agent/fetch-response-header-getter.mjs +0 -117
  16. package/dist-mjs/agent/fetch-response-status.mjs +0 -66
  17. package/dist-mjs/agent/fetch-then.mjs +0 -269
  18. package/dist-mjs/agent/fetch.mjs +0 -38
  19. package/dist-mjs/agent/file.mjs +0 -43
  20. package/dist-mjs/agent/fix-function-call-arguments.mjs +0 -153
  21. package/dist-mjs/agent/no-fixture.mjs +0 -361
  22. package/dist-mjs/agent/no-mapped-response.mjs +0 -75
  23. package/dist-mjs/agent/no-service-wrapper.mjs +0 -185
  24. package/dist-mjs/agent/no-status-code.mjs +0 -59
  25. package/dist-mjs/agent/no-unused-function-argument.mjs +0 -79
  26. package/dist-mjs/agent/no-unused-imports.mjs +0 -81
  27. package/dist-mjs/agent/no-unused-service-variable.mjs +0 -74
  28. package/dist-mjs/agent/response-reference.mjs +0 -70
  29. package/dist-mjs/agent/url.mjs +0 -32
  30. package/dist-types/agent/add-assert-import.d.ts +0 -4
  31. package/dist-types/agent/add-base-path-const.d.ts +0 -4
  32. package/dist-types/agent/add-base-path-import.d.ts +0 -4
  33. package/dist-types/agent/add-url-domain.d.ts +0 -4
  34. package/dist-types/agent/agent-test-wiring.d.ts +0 -4
  35. package/dist-types/agent/fetch-response-body-json.d.ts +0 -4
  36. package/dist-types/agent/fetch-response-header-getter.d.ts +0 -4
  37. package/dist-types/agent/fetch-response-status.d.ts +0 -4
  38. package/dist-types/agent/fetch-then.d.ts +0 -4
  39. package/dist-types/agent/fetch.d.ts +0 -5
  40. package/dist-types/agent/file.d.ts +0 -7
  41. package/dist-types/agent/fix-function-call-arguments.d.ts +0 -9
  42. package/dist-types/agent/no-fixture.d.ts +0 -4
  43. package/dist-types/agent/no-mapped-response.d.ts +0 -4
  44. package/dist-types/agent/no-service-wrapper.d.ts +0 -4
  45. package/dist-types/agent/no-status-code.d.ts +0 -4
  46. package/dist-types/agent/no-unused-function-argument.d.ts +0 -4
  47. package/dist-types/agent/no-unused-imports.d.ts +0 -4
  48. package/dist-types/agent/no-unused-service-variable.d.ts +0 -4
  49. package/dist-types/agent/response-reference.d.ts +0 -16
  50. package/dist-types/agent/url.d.ts +0 -4
  51. package/src/agent/add-assert-import.ts +0 -74
  52. package/src/agent/add-base-path-const.ts +0 -81
  53. package/src/agent/add-base-path-import.ts +0 -69
  54. package/src/agent/add-url-domain.ts +0 -76
  55. package/src/agent/agent-test-wiring.ts +0 -273
  56. package/src/agent/fetch-response-body-json.ts +0 -197
  57. package/src/agent/fetch-response-header-getter.ts +0 -148
  58. package/src/agent/fetch-response-status.ts +0 -87
  59. package/src/agent/fetch-then.ts +0 -357
  60. package/src/agent/fetch.ts +0 -57
  61. package/src/agent/file.ts +0 -42
  62. package/src/agent/fix-function-call-arguments.ts +0 -200
  63. package/src/agent/no-fixture.ts +0 -521
  64. package/src/agent/no-mapped-response.ts +0 -84
  65. package/src/agent/no-service-wrapper.ts +0 -241
  66. package/src/agent/no-status-code.ts +0 -72
  67. package/src/agent/no-unused-function-argument.ts +0 -98
  68. package/src/agent/no-unused-imports.ts +0 -103
  69. package/src/agent/no-unused-service-variable.ts +0 -93
  70. package/src/agent/response-reference.ts +0 -129
  71. package/src/agent/url.ts +0 -32
@@ -1,361 +0,0 @@
1
- // src/agent/no-fixture.ts
2
- import { strict as assert } from "node:assert";
3
- import "eslint";
4
- import {
5
- getEnclosingFunction,
6
- getEnclosingScopeNode,
7
- getEnclosingStatement,
8
- getParent,
9
- isUsedInArrayOrAsArgument
10
- } from "../library/tree.mjs";
11
- import getDocumentationUrl from "../get-documentation-url.mjs";
12
- import { getIndentation } from "../library/format.mjs";
13
- import { isValidPropertyName } from "../library/variable.mjs";
14
- import { analyzeResponseReferences } from "./response-reference.mjs";
15
- import { getResponseBodyRetrievalText, getResponseHeadersRetrievalText, hasAssertions } from "./fetch.mjs";
16
- import { replaceEndpointUrlPrefixWithBasePath } from "./url.mjs";
17
- var ruleId = "no-fixture";
18
- function analyzeFixtureCall(call, results, sourceCode) {
19
- const parent = getParent(call);
20
- assert.ok(parent, "parent should exist for fixture/supertest call node");
21
- let nextCall;
22
- if (parent.type === "ReturnStatement") {
23
- results.fixtureNode = call;
24
- results.rootNode = parent;
25
- } else if (parent.type === "ArrayExpression" || parent.type === "CallExpression" || parent.type === "ArrowFunctionExpression") {
26
- results.fixtureNode = call;
27
- results.rootNode = call;
28
- } else if (parent.type === "AwaitExpression") {
29
- results.fixtureNode = call;
30
- const enclosingStatement = getEnclosingStatement(parent);
31
- assert.ok(enclosingStatement);
32
- const awaitParent = getParent(parent);
33
- if (awaitParent?.type === "MemberExpression") {
34
- results.rootNode = parent;
35
- results.inlineStatementNode = enclosingStatement;
36
- if (awaitParent.property.type === "Identifier" && awaitParent.property.name === "body") {
37
- results.inlineBodyReference = awaitParent;
38
- }
39
- if (awaitParent.property.type === "Identifier" && (awaitParent.property.name === "header" || awaitParent.property.name === "headers")) {
40
- results.inlineHeadersReference = awaitParent;
41
- }
42
- } else if (enclosingStatement.type === "VariableDeclaration") {
43
- results.variableDeclaration = enclosingStatement;
44
- results.rootNode = enclosingStatement;
45
- } else if (enclosingStatement.type === "ExpressionStatement" && enclosingStatement.expression.type === "AssignmentExpression") {
46
- results.variableAssignment = enclosingStatement;
47
- results.rootNode = enclosingStatement;
48
- } else {
49
- results.rootNode = parent;
50
- }
51
- } else if (parent.type === "MemberExpression" && parent.property.type === "Identifier") {
52
- if (parent.property.name === "expect") {
53
- const assertionCall = getParent(parent);
54
- assert.ok(assertionCall && assertionCall.type === "CallExpression");
55
- results.assertions = [...results.assertions ?? [], assertionCall.arguments];
56
- nextCall = assertionCall;
57
- } else if (parent.property.name === "send") {
58
- const sendRequestBodyCall = getParent(parent);
59
- assert.ok(sendRequestBodyCall && sendRequestBodyCall.type === "CallExpression");
60
- results.requestBody = sendRequestBodyCall.arguments[0];
61
- nextCall = sendRequestBodyCall;
62
- } else if (parent.property.name === "set") {
63
- const setRequestHeaderCall = getParent(parent);
64
- assert.ok(setRequestHeaderCall && setRequestHeaderCall.type === "CallExpression");
65
- const [arg1, arg2] = setRequestHeaderCall.arguments;
66
- if (arg1.type === "ObjectExpression") {
67
- results.requestHeadersObjectLiteral = arg1;
68
- } else {
69
- results.requestHeaders = [...results.requestHeaders ?? [], { name: arg1, value: arg2 }];
70
- }
71
- nextCall = setRequestHeaderCall;
72
- }
73
- } else {
74
- throw new Error(`Unexpected expression in fixture/supertest call ${sourceCode.getText(parent)}.`);
75
- }
76
- if (nextCall) {
77
- analyzeFixtureCall(nextCall, results, sourceCode);
78
- }
79
- }
80
- function createResponseAssertions(fixtureCallInformation, sourceCode, responseVariableName, destructuringResponseHeadersVariable) {
81
- let statusAssertion;
82
- const nonStatusAssertions = [];
83
- for (const expectArguments of fixtureCallInformation.assertions ?? []) {
84
- if (expectArguments.length === 1) {
85
- const [assertionArgument] = expectArguments;
86
- assert.ok(assertionArgument);
87
- if (assertionArgument.type === "MemberExpression" && assertionArgument.object.type === "Identifier" && assertionArgument.object.name === "StatusCodes" || assertionArgument.type === "Literal" || sourceCode.getText(assertionArgument).includes("StatusCodes.")) {
88
- statusAssertion = `assert.equal(${responseVariableName}.status, ${sourceCode.getText(assertionArgument)})`;
89
- } else if (assertionArgument.type === "ArrowFunctionExpression") {
90
- let functionBody = sourceCode.getText(assertionArgument.body);
91
- const [originalResponseArgument] = assertionArgument.params;
92
- assert.ok(originalResponseArgument?.type === "Identifier");
93
- const originalResponseArgumentName = originalResponseArgument.name;
94
- if (originalResponseArgumentName !== responseVariableName) {
95
- functionBody = functionBody.replace(
96
- new RegExp(`\\b${originalResponseArgumentName}\\b`, "ug"),
97
- responseVariableName
98
- );
99
- }
100
- nonStatusAssertions.push(`assert.doesNotThrow(()=>${functionBody})`);
101
- } else if (assertionArgument.type === "Identifier") {
102
- nonStatusAssertions.push(
103
- `assert.doesNotThrow(()=>${sourceCode.getText(assertionArgument)}(${responseVariableName}))`
104
- );
105
- } else if (assertionArgument.type === "ObjectExpression" || assertionArgument.type === "CallExpression") {
106
- nonStatusAssertions.push(
107
- `assert.deepEqual(await ${responseVariableName}.json(), ${sourceCode.getText(assertionArgument)})`
108
- );
109
- } else {
110
- throw new Error(`Unexpected Supertest assertion argument: ".expect(${sourceCode.getText(assertionArgument)})`);
111
- }
112
- } else if (expectArguments.length === 2) {
113
- const [headerName, headerValue] = expectArguments;
114
- assert.ok(headerName && headerValue);
115
- const headersReference = destructuringResponseHeadersVariable !== void 0 ? destructuringResponseHeadersVariable.name : `${responseVariableName}.headers`;
116
- if (headerValue.type === "Literal" && headerValue.value instanceof RegExp) {
117
- nonStatusAssertions.push(
118
- `assert.ok(${headersReference}.get(${sourceCode.getText(headerName)}).match(${sourceCode.getText(headerValue)}))`
119
- );
120
- } else {
121
- nonStatusAssertions.push(
122
- `assert.equal(${headersReference}.get(${sourceCode.getText(headerName)}), ${sourceCode.getText(headerValue)})`
123
- );
124
- }
125
- }
126
- }
127
- return {
128
- statusAssertion,
129
- nonStatusAssertions
130
- };
131
- }
132
- function getResponseVariableNameToUse(scopeManager, fixtureCallInformation, scopeVariablesMap) {
133
- if (fixtureCallInformation.variableAssignment) {
134
- assert.ok(
135
- fixtureCallInformation.variableAssignment.expression.type === "AssignmentExpression" && fixtureCallInformation.variableAssignment.expression.left.type === "Identifier"
136
- );
137
- return fixtureCallInformation.variableAssignment.expression.left.name;
138
- }
139
- if (fixtureCallInformation.variableDeclaration) {
140
- const firstDeclaration = fixtureCallInformation.variableDeclaration.declarations[0];
141
- if (firstDeclaration && firstDeclaration.id.type === "Identifier") {
142
- return firstDeclaration.id.name;
143
- }
144
- }
145
- const enclosingScopeNode = getEnclosingScopeNode(fixtureCallInformation.rootNode);
146
- scopeManager.getDeclaredVariables(fixtureCallInformation.rootNode);
147
- assert.ok(enclosingScopeNode);
148
- const scope = scopeManager.acquire(enclosingScopeNode);
149
- assert.ok(scope !== null);
150
- let scopeVariables = scopeVariablesMap.get(scope);
151
- if (!scopeVariables) {
152
- scopeVariables = [...scope.set.keys()];
153
- scopeVariablesMap.set(scope, scopeVariables);
154
- }
155
- let responseVariableCounter = 0;
156
- let responseVariableNameToUse;
157
- while (responseVariableNameToUse === void 0) {
158
- responseVariableCounter++;
159
- responseVariableNameToUse = `response${responseVariableCounter === 1 ? "" : responseVariableCounter.toString()}`;
160
- if (scopeVariables.includes(responseVariableNameToUse)) {
161
- responseVariableNameToUse = void 0;
162
- }
163
- }
164
- scopeVariables.push(responseVariableNameToUse);
165
- return responseVariableNameToUse;
166
- }
167
- function isResponseBodyRedefinition(responseBodyReference) {
168
- const parent = getParent(responseBodyReference);
169
- return parent?.type === "VariableDeclarator" && parent.id.type === "Identifier";
170
- }
171
- var rule = {
172
- meta: {
173
- type: "suggestion",
174
- docs: {
175
- description: "Prefer native fetch API over customized fixture API.",
176
- url: getDocumentationUrl(ruleId)
177
- },
178
- messages: {
179
- preferNativeFetch: "Prefer native fetch API over customized fixture API.",
180
- unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
181
- },
182
- fixable: "code",
183
- schema: []
184
- },
185
- // eslint-disable-next-line max-lines-per-function
186
- create(context) {
187
- const sourceCode = context.sourceCode;
188
- const scopeManager = sourceCode.scopeManager;
189
- const scopeVariablesMap = /* @__PURE__ */ new Map();
190
- return {
191
- // eslint-disable-next-line max-lines-per-function
192
- 'CallExpression[callee.object.object.name="fixture"][callee.object.property.name="api"]': (fixtureCall) => {
193
- try {
194
- if (hasAssertions(fixtureCall) && (isUsedInArrayOrAsArgument(fixtureCall) || getEnclosingFunction(fixtureCall)?.async === false)) {
195
- return;
196
- }
197
- assert.ok(fixtureCall.type === "CallExpression");
198
- const fixtureFunction = fixtureCall.callee;
199
- assert.ok(fixtureFunction.type === "MemberExpression");
200
- const indentation = getIndentation(fixtureCall, sourceCode);
201
- const [urlArgumentNode] = fixtureCall.arguments;
202
- assert.ok(urlArgumentNode !== void 0);
203
- const fixtureCallInformation = {};
204
- analyzeFixtureCall(fixtureCall, fixtureCallInformation, sourceCode);
205
- const {
206
- variable: responseVariable,
207
- bodyReferences: responseBodyReferences,
208
- headersReferences: responseHeadersReferences,
209
- statusReferences: responseStatusReferences,
210
- destructuringBodyVariable: destructuringResponseBodyVariable,
211
- destructuringHeadersVariable: destructuringResponseHeadersVariable
212
- } = analyzeResponseReferences(fixtureCallInformation.variableDeclaration, scopeManager);
213
- const originalUrlArgumentText = sourceCode.getText(urlArgumentNode);
214
- const fetchUrlArgumentText = replaceEndpointUrlPrefixWithBasePath(originalUrlArgumentText);
215
- const methodNode = fixtureFunction.property;
216
- assert.ok(methodNode.type === "Identifier");
217
- const methodName = methodNode.name.toUpperCase();
218
- const fetchRequestArgumentLines = [
219
- "{",
220
- ` method: '${methodName === "DEL" ? "DELETE" : methodName}',`,
221
- ...fixtureCallInformation.requestBody ? [` body: JSON.stringify(${sourceCode.getText(fixtureCallInformation.requestBody)}),`] : [],
222
- // eslint-disable-next-line no-nested-ternary
223
- ...fixtureCallInformation.requestHeadersObjectLiteral ? [` headers: ${sourceCode.getText(fixtureCallInformation.requestHeadersObjectLiteral)},`] : fixtureCallInformation.requestHeaders ? [
224
- ` headers: {`,
225
- ...fixtureCallInformation.requestHeaders.map(
226
- ({ name, value }) => (
227
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions, no-nested-ternary, sonarjs/no-nested-template-literals
228
- ` ${name.type === "Literal" ? isValidPropertyName(name.value) ? name.value : `'${name.value}'` : `[${sourceCode.getText(name)}]`}: ${sourceCode.getText(value)},`
229
- )
230
- ),
231
- ` },`
232
- ] : [],
233
- "}"
234
- ].join(`
235
- ${indentation}`);
236
- const responseVariableNameToUse = getResponseVariableNameToUse(
237
- scopeManager,
238
- fixtureCallInformation,
239
- scopeVariablesMap
240
- );
241
- const isResponseBodyVariableRedefinitionNeeded = destructuringResponseBodyVariable !== void 0 || fixtureCallInformation.inlineBodyReference !== void 0 || responseBodyReferences.length > 0 && !responseBodyReferences.some(isResponseBodyRedefinition);
242
- const redefineResponseBodyVariableName = `${responseVariableNameToUse}Body`;
243
- const isResponseHeadersVariableRedefinitionNeeded = destructuringResponseHeadersVariable !== void 0 && // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
244
- destructuringResponseHeadersVariable.type === "ObjectPattern" || fixtureCallInformation.inlineHeadersReference !== void 0;
245
- const redefineResponseHeadersVariableName = `${responseVariableNameToUse}Headers`;
246
- const isResponseVariableRedefinitionNeeded = fixtureCallInformation.variableAssignment === void 0 && responseVariable === void 0 && fixtureCallInformation.assertions !== void 0 || isResponseBodyVariableRedefinitionNeeded || isResponseHeadersVariableRedefinitionNeeded;
247
- const responseBodyHeadersVariableRedefineLines = isResponseVariableRedefinitionNeeded ? [
248
- // eslint-disable-next-line no-nested-ternary
249
- ...destructuringResponseBodyVariable ? [
250
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
251
- `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${destructuringResponseBodyVariable.type === "ObjectPattern" ? sourceCode.getText(destructuringResponseBodyVariable) : destructuringResponseBodyVariable.name} = ${getResponseBodyRetrievalText(responseVariableNameToUse)}`
252
- ] : isResponseBodyVariableRedefinitionNeeded ? [
253
- `const ${redefineResponseBodyVariableName} = ${getResponseBodyRetrievalText(responseVariableNameToUse)}`
254
- ] : [],
255
- // eslint-disable-next-line no-nested-ternary
256
- ...destructuringResponseHeadersVariable ? (
257
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
258
- destructuringResponseHeadersVariable.type === "ObjectPattern" ? destructuringResponseHeadersVariable.properties.map((property) => {
259
- assert.ok(property.type === "Property");
260
- assert.equal(property.value.type, "Identifier");
261
- return `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${property.value.name} = ${getResponseHeadersRetrievalText(responseVariableNameToUse)}.get(${property.key.type === "Literal" ? sourceCode.getText(property.key) : `'${sourceCode.getText(property.key)}'`})`;
262
- }) : [
263
- `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${destructuringResponseHeadersVariable.name} = ${getResponseHeadersRetrievalText(responseVariableNameToUse)}`
264
- ]
265
- ) : isResponseHeadersVariableRedefinitionNeeded ? [
266
- `const ${redefineResponseHeadersVariableName} = ${getResponseHeadersRetrievalText(responseVariableNameToUse)}`
267
- ] : []
268
- ] : [];
269
- const { statusAssertion, nonStatusAssertions } = createResponseAssertions(
270
- fixtureCallInformation,
271
- sourceCode,
272
- responseVariableNameToUse,
273
- destructuringResponseHeadersVariable
274
- );
275
- const fetchCallText = `fetch(${fetchUrlArgumentText}, ${fetchRequestArgumentLines})`;
276
- const fetchStatementText = !isResponseVariableRedefinitionNeeded ? fetchCallText : `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${responseVariableNameToUse} = await ${fetchCallText}`;
277
- const nodeToReplace = isResponseVariableRedefinitionNeeded ? fixtureCallInformation.rootNode : fixtureCallInformation.fixtureNode;
278
- const appendingAssignmentAndAssertionText = [
279
- "",
280
- ...statusAssertion !== void 0 ? [statusAssertion] : [],
281
- ...responseBodyHeadersVariableRedefineLines,
282
- ...nonStatusAssertions
283
- ].join(`;
284
- ${indentation}`);
285
- context.report({
286
- node: fixtureCall,
287
- messageId: "preferNativeFetch",
288
- *fix(fixer) {
289
- if (fixtureCallInformation.inlineStatementNode) {
290
- const preInlineDeclaration = [
291
- fetchStatementText,
292
- `${appendingAssignmentAndAssertionText};
293
- ${indentation}`
294
- ].join(``);
295
- yield fixer.insertTextBefore(fixtureCallInformation.inlineStatementNode, preInlineDeclaration);
296
- } else {
297
- yield fixer.replaceText(nodeToReplace, fetchStatementText);
298
- const needEndingSemiColon = sourceCode.getText(nodeToReplace).endsWith(";");
299
- yield fixer.insertTextAfter(
300
- nodeToReplace,
301
- needEndingSemiColon ? `${appendingAssignmentAndAssertionText};` : appendingAssignmentAndAssertionText
302
- );
303
- }
304
- for (const responseBodyReference of responseBodyReferences) {
305
- yield fixer.replaceText(
306
- responseBodyReference,
307
- isResponseBodyVariableRedefinitionNeeded || !isResponseBodyRedefinition(responseBodyReference) ? redefineResponseBodyVariableName : getResponseBodyRetrievalText(responseVariableNameToUse)
308
- );
309
- }
310
- if (fixtureCallInformation.inlineBodyReference) {
311
- yield fixer.replaceText(fixtureCallInformation.inlineBodyReference, redefineResponseBodyVariableName);
312
- }
313
- for (const responseHeadersReference of responseHeadersReferences) {
314
- const parent = getParent(responseHeadersReference);
315
- assert.ok(parent);
316
- let headerName;
317
- if (parent.type === "MemberExpression") {
318
- const headerNameNode = parent.property;
319
- headerName = parent.computed ? sourceCode.getText(headerNameNode) : `'${sourceCode.getText(headerNameNode)}'`;
320
- } else if (parent.type === "CallExpression") {
321
- const headerNameNode = parent.arguments[0];
322
- headerName = sourceCode.getText(headerNameNode);
323
- }
324
- assert.ok(headerName !== void 0);
325
- yield fixer.replaceText(parent, `${responseVariableNameToUse}.headers.get(${headerName})`);
326
- }
327
- for (const responseStatusReference of responseStatusReferences) {
328
- if (responseStatusReference.property.type === "Identifier" && responseStatusReference.property.name === "statusCode") {
329
- yield fixer.replaceText(responseStatusReference.property, `status`);
330
- }
331
- }
332
- if (fixtureCallInformation.rootNode.type === "ReturnStatement" && fixtureCallInformation.assertions !== void 0) {
333
- yield fixer.insertTextAfter(
334
- fixtureCallInformation.rootNode,
335
- `
336
- ${indentation}return ${responseVariableNameToUse};`
337
- );
338
- }
339
- }
340
- });
341
- } catch (error) {
342
- console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
343
- context.report({
344
- node: fixtureCall,
345
- messageId: "unknownError",
346
- data: {
347
- fileName: context.filename,
348
- error: error instanceof Error ? error.toString() : JSON.stringify(error)
349
- }
350
- });
351
- }
352
- }
353
- };
354
- }
355
- };
356
- var no_fixture_default = rule;
357
- export {
358
- no_fixture_default as default,
359
- ruleId
360
- };
361
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L25vLWZpeHR1cmUudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBUUEsU0FBUyxVQUFVLGNBQWM7QUFlakMsT0FBa0Q7QUFFbEQ7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxPQUFPLHlCQUF5QjtBQUNoQyxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLGlDQUFpQztBQUMxQyxTQUFTLDhCQUE4QixpQ0FBaUMscUJBQXFCO0FBQzdGLFNBQVMsNENBQTRDO0FBRTlDLElBQU0sU0FBUztBQWtCdEIsU0FBUyxtQkFBbUIsTUFBNEIsU0FBaUMsWUFBd0I7QUFDL0csUUFBTSxTQUFTLFVBQVUsSUFBSTtBQUM3QixTQUFPLEdBQUcsUUFBUSxxREFBcUQ7QUFFdkUsTUFBSTtBQUNKLE1BQUksT0FBTyxTQUFTLG1CQUFtQjtBQUVyQyxZQUFRLGNBQWM7QUFDdEIsWUFBUSxXQUFXO0FBQUEsRUFDckIsV0FDRSxPQUFPLFNBQVMscUJBQ2hCLE9BQU8sU0FBUyxvQkFDaEIsT0FBTyxTQUFTLDJCQUNoQjtBQUVBLFlBQVEsY0FBYztBQUN0QixZQUFRLFdBQVc7QUFBQSxFQUNyQixXQUFXLE9BQU8sU0FBUyxtQkFBbUI7QUFDNUMsWUFBUSxjQUFjO0FBQ3RCLFVBQU0scUJBQXFCLHNCQUFzQixNQUFNO0FBQ3ZELFdBQU8sR0FBRyxrQkFBa0I7QUFDNUIsVUFBTSxjQUFjLFVBQVUsTUFBTTtBQUNwQyxRQUFJLGFBQWEsU0FBUyxvQkFBb0I7QUFDNUMsY0FBUSxXQUFXO0FBQ25CLGNBQVEsc0JBQXNCO0FBQzlCLFVBQUksWUFBWSxTQUFTLFNBQVMsZ0JBQWdCLFlBQVksU0FBUyxTQUFTLFFBQVE7QUFDdEYsZ0JBQVEsc0JBQXNCO0FBQUEsTUFDaEM7QUFDQSxVQUNFLFlBQVksU0FBUyxTQUFTLGlCQUM3QixZQUFZLFNBQVMsU0FBUyxZQUFZ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
@@ -1,75 +0,0 @@
1
- // src/agent/no-mapped-response.ts
2
- import { ESLintUtils } from "@typescript-eslint/utils";
3
- import getDocumentationUrl from "../get-documentation-url.mjs";
4
- var ruleId = "no-mapped-response";
5
- var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
6
- var rule = createRule({
7
- name: ruleId,
8
- meta: {
9
- type: "suggestion",
10
- docs: {
11
- description: "Replace the usage of MappedResponse type with FetchResponse."
12
- },
13
- messages: {
14
- replaceFullResponseWithFetchResponse: "Replace the usage of FullResponse type with FetchResponse.",
15
- unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
16
- },
17
- fixable: "code",
18
- schema: []
19
- },
20
- defaultOptions: [],
21
- create(context) {
22
- const sourceCode = context.sourceCode;
23
- return {
24
- 'TSTypeReference[typeName.name="MappedResponse"]': (typeReference) => {
25
- try {
26
- context.report({
27
- messageId: "replaceFullResponseWithFetchResponse",
28
- node: typeReference,
29
- fix(fixer) {
30
- const typeParams = sourceCode.getText(typeReference.typeArguments);
31
- return fixer.replaceText(typeReference, `FetchResponse${typeParams || ""}`);
32
- }
33
- });
34
- } catch (error) {
35
- console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
36
- context.report({
37
- node: typeReference,
38
- messageId: "unknownError",
39
- data: {
40
- fileName: context.filename,
41
- error: error instanceof Error ? error.toString() : JSON.stringify(error)
42
- }
43
- });
44
- }
45
- },
46
- 'ImportSpecifier[imported.name="MappedResponse"]': (importSpecifier) => {
47
- try {
48
- context.report({
49
- messageId: "replaceFullResponseWithFetchResponse",
50
- node: importSpecifier.imported,
51
- fix(fixer) {
52
- return fixer.replaceText(importSpecifier.imported, "FetchResponse");
53
- }
54
- });
55
- } catch (error) {
56
- console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
57
- context.report({
58
- node: importSpecifier.imported,
59
- messageId: "unknownError",
60
- data: {
61
- fileName: context.filename,
62
- error: error instanceof Error ? error.toString() : JSON.stringify(error)
63
- }
64
- });
65
- }
66
- }
67
- };
68
- }
69
- });
70
- var no_mapped_response_default = rule;
71
- export {
72
- no_mapped_response_default as default,
73
- ruleId
74
- };
75
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L25vLW1hcHBlZC1yZXNwb25zZS50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxTQUFTLG1CQUE2QjtBQUN0QyxPQUFPLHlCQUF5QjtBQUV6QixJQUFNLFNBQVM7QUFFdEIsSUFBTSxhQUFhLFlBQVksWUFBWSxDQUFDLFNBQVMsb0JBQW9CLElBQUksQ0FBQztBQUU5RSxJQUFNLE9BQXdGLFdBQVc7QUFBQSxFQUN2RyxNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsTUFDSixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1Isc0NBQXNDO0FBQUEsTUFDdEMsY0FBYztBQUFBLElBQ2hCO0FBQUEsSUFDQSxTQUFTO0FBQUEsSUFDVCxRQUFRLENBQUM7QUFBQSxFQUNYO0FBQUEsRUFDQSxnQkFBZ0IsQ0FBQztBQUFBLEVBQ2pCLE9BQU8sU0FBUztBQUNkLFVBQU0sYUFBYSxRQUFRO0FBRTNCLFdBQU87QUFBQSxNQUNMLG1EQUFtRCxDQUFDLGtCQUE0QztBQUM5RixZQUFJO0FBQ0Ysa0JBQVEsT0FBTztBQUFBLFlBQ2IsV0FBVztBQUFBLFlBQ1gsTUFBTTtBQUFBLFlBQ04sSUFBSSxPQUFPO0FBQ1Qsb0JBQU0sYUFBYSxXQUFXLFFBQVEsY0FBYyxhQUFhO0FBQ2pFLHFCQUFPLE1BQU0sWUFBWSxlQUFlLGdCQUFnQixjQUFjLEVBQUUsRUFBRTtBQUFBLFlBQzVFO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSCxTQUFTLE9BQU87QUFFZCxrQkFBUSxNQUFNLG1CQUFtQixNQUFNLG1CQUFtQixRQUFRLFFBQVEsTUFBTSxLQUFLO0FBQ3JGLGtCQUFRLE9BQU87QUFBQSxZQUNiLE1BQU07QUFBQSxZQUNOLFdBQVc7QUFBQSxZQUNYLE1BQU07QUFBQSxjQUNKLFVBQVUsUUFBUTtBQUFBLGNBQ2xCLE9BQU8saUJBQWlCLFFBQVEsTUFBTSxTQUFTLElBQUksS0FBSyxVQUFVLEtBQUs7QUFBQSxZQUN6RTtBQUFBLFVBQ0YsQ0FBQztBQUFBLFFBQ0g7QUFBQSxNQUNGO0FBQUEsTUFDQSxtREFBbUQsQ0FBQyxvQkFBOEM7QUFDaEcsWUFBSTtBQUNGLGtCQUFRLE9BQU87QUFBQSxZQUNiLFdBQVc7QUFBQSxZQUNYLE1BQU0sZ0JBQWdCO0FBQUEsWUFDdEIsSUFBSSxPQUFPO0FBQ1QscUJBQU8sTUFBTSxZQUFZLGdCQUFnQixVQUFVLGVBQWU7QUFBQSxZQUNwRTtBQUFBLFVBQ0YsQ0FBQztBQUFBLFFBQ0gsU0FBUyxPQUFPO0FBRWQsa0JBQVEsTUFBTSxtQkFBbUIsTUFBTSxtQkFBbUIsUUFBUSxRQUFRLE1BQU0sS0FBSztBQUNyRixrQkFBUSxPQUFPO0FBQUEsWUFDYixNQUFNLGdCQUFnQjtBQUFBLFlBQ3RCLFdBQVc7QUFBQSxZQUNYLE1BQU07QUFBQSxjQUNKLFVBQVUsUUFBUTtBQUFBLGNBQ2xCLE9BQU8saUJBQWlCLFFBQVEsTUFBTSxTQUFTLElBQUksS0FBSyxVQUFVLEtBQUs7QUFBQSxZQUN6RTtBQUFBLFVBQ0YsQ0FBQztBQUFBLFFBQ0g7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRixDQUFDO0FBRUQsSUFBTyw2QkFBUTsiLAogICJuYW1lcyI6IFtdCn0K
@@ -1,185 +0,0 @@
1
- // src/agent/no-service-wrapper.ts
2
- import { strict as assert } from "node:assert";
3
- import { DefinitionType } from "@typescript-eslint/scope-manager";
4
- import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
5
- import getDocumentationUrl from "../get-documentation-url.mjs";
6
- import { getEnclosingScopeNode } from "../library/ts-tree.mjs";
7
- import { getIndentation } from "../library/format.mjs";
8
- import { isServiceApiCallUrl, replaceEndpointUrlPrefixWithDomain } from "./url.mjs";
9
- var ruleId = "no-service-wrapper";
10
- var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
11
- var rule = createRule({
12
- name: ruleId,
13
- meta: {
14
- type: "suggestion",
15
- docs: {
16
- description: "Prefer native fetch over customized service wrapper."
17
- },
18
- messages: {
19
- preferNativeFetch: "Prefer native fetch over customized service wrapper.",
20
- invalidOptions: '"options" argument should be provided with "resolveWithFullResponse" property set as "true". Otherwise, it indicates that the response body will be obtained without status code assertion which could result in unexpected issue. Please manually convert the usage of customized service wrapper call to native fetch.',
21
- unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}. Please manually convert the usage of customized service wrapper call to native fetch.'
22
- },
23
- fixable: "code",
24
- schema: []
25
- },
26
- defaultOptions: [],
27
- create(context) {
28
- const sourceCode = context.sourceCode;
29
- const scopeManager = sourceCode.scopeManager;
30
- const parserService = ESLintUtils.getParserServices(context);
31
- const typeChecker = parserService.program.getTypeChecker();
32
- function isUrlArgumentValid(urlArgument, scope) {
33
- if (urlArgument?.type === AST_NODE_TYPES.Literal && typeof urlArgument.value === "string" || urlArgument?.type === AST_NODE_TYPES.TemplateLiteral) {
34
- const urlText = sourceCode.getText(urlArgument);
35
- return isServiceApiCallUrl(urlText);
36
- }
37
- if (urlArgument?.type === AST_NODE_TYPES.Identifier) {
38
- const foundVariable = scope.variables.find((variable) => variable.name === urlArgument.name);
39
- if (foundVariable) {
40
- const variableDefinition = foundVariable.defs.find((def) => def.type === DefinitionType.Variable);
41
- if (variableDefinition !== void 0) {
42
- const variableDefinitionNode = variableDefinition.node;
43
- assert.ok(variableDefinitionNode.init, "Variable definition node has no init property");
44
- return isUrlArgumentValid(variableDefinitionNode.init, scope);
45
- }
46
- return true;
47
- }
48
- }
49
- return false;
50
- }
51
- function getType(identifier) {
52
- const variable = parserService.esTreeNodeToTSNodeMap.get(identifier);
53
- const variableType = typeChecker.getTypeAtLocation(variable);
54
- return typeChecker.typeToString(variableType);
55
- }
56
- function isServiceLikeName(name) {
57
- return /.*[Ss]ervice$/u.test(name);
58
- }
59
- function isCalleeServiceWrapper(serviceCall) {
60
- const callee = serviceCall.callee;
61
- if (callee.type !== AST_NODE_TYPES.MemberExpression) {
62
- return false;
63
- }
64
- const endpoint = callee.object;
65
- if (endpoint.type === AST_NODE_TYPES.Identifier) {
66
- return getType(endpoint) === "Endpoint" || isServiceLikeName(endpoint.name);
67
- }
68
- if (endpoint.type !== AST_NODE_TYPES.CallExpression) {
69
- return false;
70
- }
71
- const [contextArgument] = endpoint.arguments;
72
- if (contextArgument?.type !== AST_NODE_TYPES.Identifier) {
73
- return false;
74
- }
75
- if (contextArgument.name !== "EMPTY_CONTEXT" && getType(contextArgument) !== "InboundContext") {
76
- return false;
77
- }
78
- const service = endpoint.callee;
79
- if (service.type === AST_NODE_TYPES.Identifier) {
80
- return getType(service) === "ResolvedService";
81
- }
82
- if (service.type !== AST_NODE_TYPES.MemberExpression) {
83
- return false;
84
- }
85
- const services = service.object;
86
- if (services.type === AST_NODE_TYPES.Identifier) {
87
- return getType(services) === "ResolvedServices";
88
- }
89
- if (services.type !== AST_NODE_TYPES.MemberExpression) {
90
- return false;
91
- }
92
- const configuration = services.object;
93
- if (configuration.type === AST_NODE_TYPES.Identifier) {
94
- return ["Configuration", "Configuration<ResolvedServices>"].includes(getType(configuration));
95
- }
96
- if (configuration.type !== AST_NODE_TYPES.MemberExpression) {
97
- return false;
98
- }
99
- const fixture = configuration.object;
100
- if (fixture.type === AST_NODE_TYPES.Identifier) {
101
- return fixture.name === "fixture" || getType(fixture) === "Fixture";
102
- }
103
- return false;
104
- }
105
- return {
106
- "CallExpression[callee.property.name=/^(head|get|put|post|del|patch)$/]": (serviceCall) => {
107
- try {
108
- if (!isCalleeServiceWrapper(serviceCall)) {
109
- return;
110
- }
111
- const enclosingScopeNode = getEnclosingScopeNode(serviceCall);
112
- assert.ok(enclosingScopeNode, "enclosingScopeNode is undefined");
113
- const scope = scopeManager?.acquire(enclosingScopeNode);
114
- assert.ok(scope, "scope is undefined");
115
- const urlArgument = serviceCall.arguments[0];
116
- if (!isUrlArgumentValid(urlArgument, scope)) {
117
- return;
118
- }
119
- assert.ok(serviceCall.callee.type === AST_NODE_TYPES.MemberExpression);
120
- assert.ok(serviceCall.callee.property.type === AST_NODE_TYPES.Identifier);
121
- const method = serviceCall.callee.property.name;
122
- let requestBodyProperty = ["put", "post", "options"].includes(method) ? serviceCall.arguments[1] : void 0;
123
- if (requestBodyProperty !== void 0 && requestBodyProperty.type === AST_NODE_TYPES.Identifier && requestBodyProperty.name === "undefined") {
124
- requestBodyProperty = void 0;
125
- }
126
- const optionsArgument = ["get", "head", "del"].includes(method) ? serviceCall.arguments[1] : serviceCall.arguments[2];
127
- if (optionsArgument === void 0 || optionsArgument.type !== AST_NODE_TYPES.ObjectExpression) {
128
- context.report({
129
- node: serviceCall,
130
- messageId: "invalidOptions"
131
- });
132
- return;
133
- }
134
- const resolveWithFullResponseProperty = optionsArgument.properties.find(
135
- (property) => property.type === AST_NODE_TYPES.Property && property.key.type === AST_NODE_TYPES.Identifier && property.key.name === "resolveWithFullResponse"
136
- );
137
- if (resolveWithFullResponseProperty?.type !== AST_NODE_TYPES.Property || resolveWithFullResponseProperty.value.type !== AST_NODE_TYPES.Literal || resolveWithFullResponseProperty.value.value !== true) {
138
- context.report({
139
- node: optionsArgument,
140
- messageId: "invalidOptions"
141
- });
142
- return;
143
- }
144
- const requestHeadersProperty = optionsArgument.properties.find(
145
- (property) => property.type === AST_NODE_TYPES.Property && property.key.type === AST_NODE_TYPES.Identifier && property.key.name === "headers"
146
- );
147
- context.report({
148
- messageId: "preferNativeFetch",
149
- node: serviceCall,
150
- fix(fixer) {
151
- const url = sourceCode.getText(urlArgument);
152
- const replacedUrl = replaceEndpointUrlPrefixWithDomain(url);
153
- const indentation = getIndentation(serviceCall, sourceCode);
154
- const fetchText = [
155
- `fetch(${replacedUrl}, {`,
156
- ` method: '${method.toLowerCase() === "del" ? "DELETE" : method.toUpperCase()}',`,
157
- ...requestHeadersProperty ? [` ${sourceCode.getText(requestHeadersProperty)},`] : [],
158
- ...requestBodyProperty ? [` body: JSON.stringify(${sourceCode.getText(requestBodyProperty)}),`] : [],
159
- "})"
160
- ].join(`
161
- ${indentation}`);
162
- return fixer.replaceText(serviceCall, fetchText);
163
- }
164
- });
165
- } catch (error) {
166
- console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
167
- context.report({
168
- node: serviceCall,
169
- messageId: "unknownError",
170
- data: {
171
- fileName: context.filename,
172
- error: error instanceof Error ? error.toString() : JSON.stringify(error)
173
- }
174
- });
175
- }
176
- }
177
- };
178
- }
179
- });
180
- var no_service_wrapper_default = rule;
181
- export {
182
- no_service_wrapper_default as default,
183
- ruleId
184
- };
185
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L25vLXNlcnZpY2Utd3JhcHBlci50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxTQUFTLFVBQVUsY0FBYztBQUVqQyxTQUFTLHNCQUFrQztBQUMzQyxTQUFTLGdCQUFnQixtQkFBNkI7QUFFdEQsT0FBTyx5QkFBeUI7QUFDaEMsU0FBUyw2QkFBNkI7QUFDdEMsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxxQkFBcUIsMENBQTBDO0FBRWpFLElBQU0sU0FBUztBQUV0QixJQUFNLGFBQWEsWUFBWSxZQUFZLENBQUMsU0FBUyxvQkFBb0IsSUFBSSxDQUFDO0FBRTlFLElBQU0sT0FBd0YsV0FBVztBQUFBLEVBQ3ZHLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxJQUNKLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxNQUNKLGFBQWE7QUFBQSxJQUNmO0FBQUEsSUFDQSxVQUFVO0FBQUEsTUFDUixtQkFBbUI7QUFBQSxNQUNuQixnQkFDRTtBQUFBLE1BQ0YsY0FDRTtBQUFBLElBQ0o7QUFBQSxJQUNBLFNBQVM7QUFBQSxJQUNULFFBQVEsQ0FBQztBQUFBLEVBQ1g7QUFBQSxFQUNBLGdCQUFnQixDQUFDO0FBQUEsRUFDakIsT0FBTyxTQUFTO0FBQ2QsVUFBTSxhQUFhLFFBQVE7QUFDM0IsVUFBTSxlQUFlLFdBQVc7QUFDaEMsVUFBTSxnQkFBZ0IsWUFBWSxrQkFBa0IsT0FBTztBQUMzRCxVQUFNLGNBQWMsY0FBYyxRQUFRLGVBQWU7QUFFekQsYUFBUyxtQkFBbUIsYUFBd0MsT0FBYztBQUNoRixVQUNHLGFBQWEsU0FBUyxlQUFlLFdBQVcsT0FBTyxZQUFZLFVBQVUsWUFDOUUsYUFBYSxTQUFTLGVBQWUsaUJBQ3JDO0FBQ0EsY0FBTSxVQUFVLFdBQVcsUUFBUSxXQUFXO0FBQzlDLGVBQU8sb0JBQW9CLE9BQU87QUFBQSxNQUNwQztBQUVBLFVBQUksYUFBYSxTQUFTLGVBQWUsWUFBWTtBQUNuRCxjQUFNLGdCQUFnQixNQUFNLFVBQVUsS0FBSyxDQUFDLGFBQWEsU0FBUyxTQUFTLFlBQVksSUFBSTtBQUMzRixZQUFJLGVBQWU7QUFDakIsZ0JBQU0scUJBQXFCLGNBQWMsS0FBSyxLQUFLLENBQUMsUUFBUSxJQUFJLFNBQVMsZUFBZSxRQUFRO0FBQ2hHLGNBQUksdUJBQXVCLFFBQVc7QUFDcEMsa0JBQU0seUJBQXlCLG1CQUFtQjtBQUNsRCxtQkFBTyxHQUFHLHVCQUF1QixNQUFNLCtDQUErQztBQUN0RixtQkFBTyxtQkFBbUIsdUJBQXVCLE1BQU0sS0FBSztBQUFBLFVBQzlEO0FBQ0EsaUJBQU87QUFBQSxRQUNUO0FBQUEsTUFDRjtBQUVBLGFBQU87QUFBQSxJQUNUO0FBRUEsYUFBUyxRQUFRLFlBQWlDO0FBQ2hELFlBQU0sV0FBVyxjQUFjLHNCQUFzQixJQUFJLFVBQVU7QUFDbkUsWUFBTSxlQUFlLFlBQVksa0JBQWtCLFFBQVE7QUFDM0QsYUFBTyxZQUFZLGFBQWEsWUFBWTtBQUFBLElBQzlDO0FBRUEsYUFBUyxrQkFBa0IsTUFBYztBQUN2QyxhQUFPLGlCQUFpQixLQUFLLElBQUk7QUFBQSxJQUNuQztBQUVBLGFBQVMsdUJBQXVCLGFBQXNDO0FBQ3BFLFlBQU0sU0FBUyxZQUFZO0FBQzNCLFVBQUksT0FBTyxTQUFTLGVBQWUsa0JBQWtCO0FBQ25ELGVBQU87QUFBQSxNQUNUO0FBRUEsWUFBTSxXQUFXLE9BQU87QUFDeEIsVUFBSSxTQUFTLFNBQVMsZUFBZSxZQUFZO0FBQy9DLGVBQU8sUUFBUSxRQUFRLE1BQU0sY0FBYyxrQkFBa0IsU0FBUyxJQUFJO0FBQUEsTUFDNUU7QUFDQSxVQUFJLFNBQVMsU0FBUyxlQUFlLGdCQUFnQjtBQUNuRCxlQUFPO0FBQUEsTUFDVDtBQUVBLFlBQU0sQ0FBQyxlQUFlLElBQUksU0FBUztBQUNuQyxVQUFJLGlCQUFpQixTQUFTLGVBQWUsWUFBWTtBQUN2RCxlQUFPO0FBQUEsTUFDVDtBQUNBLFVBQUksZ0JBQWdCLFNBQVMsbUJBQW1CLFFBQVEsZUFBZSxNQUFNLGtCQUFrQjtBQUM3RixlQUFPO0FBQUEsTUFDVDtBQUNBLFlBQU0sVUFBVSxTQUFTO0FBQ3pCLFVBQUksUUFBUSxTQUFTLGVBQWUsWUFBWTtBQUM5QyxlQUFPLFFBQVEsT0FBTyxNQUFNO0FBQUEsTUFDOUI7QUFFQSxVQUFJLFFBQVEsU0FBUyxlQUFlLGtCQUFrQjtBQUNwRCxlQUFPO0FBQUEsTUFDVDtBQUNBLFlBQU0sV0FBVyxRQUFRO0FBQ3pCLFVBQUksU0FBUyxTQUFTLGVBQWUsWUFBWTtBQUMvQyxlQUFPLFFBQVEsUUFBUSxNQUFNO0FBQUEsTUFDL0I7QUFFQSxVQUFJLFNBQVMsU0FBUyxlQUFlLGtCQUFrQjtBQUNyRCxlQUFPO0FBQUEsTUFDVDtBQUNBLFlBQU0sZ0JBQWdCLFNBQVM7QUFDL0IsVUFBSSxjQUFjLFNBQVMsZUFBZSxZQUFZO0FBQ3BELGVBQU8sQ0FBQyxpQkFBaUIsaUNBQWlDLEVBQUUsU0FBUyxRQUFRLGFBQWEsQ0FBQztBQUFBLE1BQzdGO0FBR0EsVUFBSSxjQUFjLFNBQVMsZUFBZSxrQkFBa0I7QUFDMUQsZUFBTztBQUFBLE1BQ1Q7QUFDQSxZQUFNLFVBQVUsY0FBYztBQUM5QixVQUFJLFFBQVEsU0FBUyxlQUFlLFlBQVk7QUFDOUMsZUFBTyxRQUFRLFNBQVMsYUFBYSxRQUFRLE9BQU8sTUFBTTtBQUFBLE1BQzVEO0FBRUEsYUFBTztBQUFBLElBQ1Q7QUFFQSxXQUFPO0FBQUEsTUFDTCwwRUFBMEUsQ0FDeEUsZ0JBQ0c7QUFDSCxZQUFJO0FBQ0YsY0FBSSxDQUFDLHVCQUF1QixXQUFXLEdBQUc7QUFDeEM7QUFBQSxVQUNGO0FBRUEsZ0JBQU0scUJBQXFCLHNCQUFzQixXQUFXO0FBQzVELGlCQUFPLEdBQUcsb0JBQW9CLGlDQUFpQztBQUMvRCxnQkFBTSxRQUFRLGNBQWMsUUFBUSxrQkFBa0I7QUFDdEQsaUJBQU8sR0FBRyxPQUFPLG9CQUFvQjtBQUNyQyxnQkFBTSxjQUFjLFlBQVksVUFBVSxDQUFDO0FBQzNDLGNBQUksQ0FBQyxtQkFBbUIsYUFBYSxLQUFLLEdBQUc7QUFDM0M7QUFBQSxVQUNGO0FBRUEsaUJBQU8sR0FBRyxZQUFZLE9BQU8sU0FBUyxlQUFlLGdCQUFnQjtBQUNyRSxpQkFBTyxHQUFHLFlBQVksT0FBTyxTQUFTLFNBQVMsZUFBZSxVQUFVO0FBR3hFLGdCQUFNLFNBQVMsWUFBWSxPQUFPLFNBQVM7QUFHM0MsY0FBSSxzQkFBc0IsQ0FBQyxPQUFPLFFBQVEsU0FBUyxFQUFFLFNBQVMsTUFBTSxJQUFJLFlBQVksVUFBVSxDQUFDLElBQUk7QUFDbkcsY0FDRSx3QkFBd0IsVUFDeEIsb0JBQW9CLFNBQVMsZUFBZSxjQUM1QyxvQkFBb0IsU0FBUyxhQUM3QjtBQUNBLGtDQUFzQjtBQUFBLFVBQ3hCO0FBRUEsZ0JBQU0sa0JBQWtCLENBQUMsT0FBTyxRQUFRLEtBQUssRUFBRSxTQUFTLE1BQU0sSUFDMUQsWUFBWSxVQUFVLENBQUMsSUFDdkIsWUFBWSxVQUFVLENBQUM7QUFDM0IsY0FBSSxvQkFBb0IsVUFBYSxnQkFBZ0IsU0FBUyxlQUFlLGtCQUFrQjtBQUM3RixvQkFBUSxPQUFPO0FBQUEsY0FDYixNQUFNO0FBQUEsY0FDTixXQUFXO0FBQUEsWUFDYixDQUFDO0FBQ0Q7QUFBQSxVQUNGO0FBQ0EsZ0JBQU0sa0NBQWtDLGdCQUFnQixXQUFXO0FBQUEsWUFDakUsQ0FBQyxhQUNDLFNBQVMsU0FBUyxlQUFlLFlBQ2pDLFNBQVMsSUFBSSxTQUFTLGVBQWUsY0FDckMsU0FBUyxJQUFJLFNBQVM7QUFBQSxVQUMxQjtBQUNBLGNBQ0UsaUNBQWlDLFNBQVMsZUFBZSxZQUN6RCxnQ0FBZ0MsTUFBTSxTQUFTLGVBQWUsV0FDOUQsZ0NBQWdDLE1BQU0sVUFBVSxNQUNoRDtBQUNBLG9CQUFRLE9BQU87QUFBQSxjQUNiLE1BQU07QUFBQSxjQUNOLFdBQVc7QUFBQSxZQUNiLENBQUM7QUFDRDtBQUFBLFVBQ0Y7QUFHQSxnQkFBTSx5QkFBeUIsZ0JBQWdCLFdBQVc7QUFBQSxZQUN4RCxDQUFDLGFBQ0MsU0FBUyxTQUFTLGVBQWUsWUFDakMsU0FBUyxJQUFJLFNBQVMsZUFBZSxjQUNyQyxTQUFTLElBQUksU0FBUztBQUFBLFVBQzFCO0FBRUEsa0JBQVEsT0FBTztBQUFBLFlBQ2IsV0FBVztBQUFBLFlBQ1gsTUFBTTtBQUFBLFlBQ04sSUFBSSxPQUFPO0FBQ1Qsb0JBQU0sTUFBTSxXQUFXLFFBQVEsV0FBVztBQUMxQyxvQkFBTSxjQUFjLG1DQUFtQyxHQUFHO0FBQzFELG9CQUFNLGNBQWMsZUFBZSxhQUFhLFVBQVU7QUFFMUQsb0JBQU0sWUFBWTtBQUFBLGdCQUNoQixTQUFTLFdBQVc7QUFBQSxnQkFDcEIsY0FBYyxPQUFPLFlBQVksTUFBTSxRQUFRLFdBQVcsT0FBTyxZQUFZLENBQUM7QUFBQSxnQkFDOUUsR0FBSSx5QkFBeUIsQ0FBQyxLQUFLLFdBQVcsUUFBUSxzQkFBc0IsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUFBLGdCQUNyRixHQUFJLHNCQUFzQixDQUFDLDBCQUEwQixXQUFXLFFBQVEsbUJBQW1CLENBQUMsSUFBSSxJQUFJLENBQUM7QUFBQSxnQkFDckc7QUFBQSxjQUNGLEVBQUUsS0FBSztBQUFBLEVBQUssV0FBVyxFQUFFO0FBQ3pCLHFCQUFPLE1BQU0sWUFBWSxhQUFhLFNBQVM7QUFBQSxZQUNqRDtBQUFBLFVBQ0YsQ0FBQztBQUFBLFFBQ0gsU0FBUyxPQUFPO0FBRWQsa0JBQVEsTUFBTSxtQkFBbUIsTUFBTSxtQkFBbUIsUUFBUSxRQUFRLE1BQU0sS0FBSztBQUNyRixrQkFBUSxPQUFPO0FBQUEsWUFDYixNQUFNO0FBQUEsWUFDTixXQUFXO0FBQUEsWUFDWCxNQUFNO0FBQUEsY0FDSixVQUFVLFFBQVE7QUFBQSxjQUNsQixPQUFPLGlCQUFpQixRQUFRLE1BQU0sU0FBUyxJQUFJLEtBQUssVUFBVSxLQUFLO0FBQUEsWUFDekU7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQztBQUVELElBQU8sNkJBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==