@checkdigit/eslint-plugin 7.3.0-PR.75-d748 → 7.3.0-PR.93-561f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-mjs/index.mjs +3 -122
- package/dist-mjs/require-resolve-full-response.mjs +1 -1
- package/package.json +1 -1
- package/src/index.ts +0 -119
- package/src/require-resolve-full-response.ts +1 -3
- package/dist-mjs/agent/add-assert-import.mjs +0 -58
- package/dist-mjs/agent/add-base-path-const.mjs +0 -65
- package/dist-mjs/agent/add-base-path-import.mjs +0 -60
- package/dist-mjs/agent/add-url-domain.mjs +0 -61
- package/dist-mjs/agent/agent-test-wiring.mjs +0 -196
- package/dist-mjs/agent/fetch-response-body-json.mjs +0 -146
- package/dist-mjs/agent/fetch-response-header-getter.mjs +0 -117
- package/dist-mjs/agent/fetch-then.mjs +0 -267
- package/dist-mjs/agent/fetch.mjs +0 -34
- package/dist-mjs/agent/file.mjs +0 -43
- package/dist-mjs/agent/fix-function-call-arguments.mjs +0 -153
- package/dist-mjs/agent/no-fixture.mjs +0 -336
- package/dist-mjs/agent/no-mapped-response.mjs +0 -75
- package/dist-mjs/agent/no-service-wrapper.mjs +0 -185
- package/dist-mjs/agent/no-status-code.mjs +0 -59
- package/dist-mjs/agent/no-unused-function-argument.mjs +0 -79
- package/dist-mjs/agent/no-unused-imports.mjs +0 -81
- package/dist-mjs/agent/no-unused-service-variable.mjs +0 -74
- package/dist-mjs/agent/response-reference.mjs +0 -67
- package/dist-mjs/agent/url.mjs +0 -32
- package/dist-types/agent/add-assert-import.d.ts +0 -4
- package/dist-types/agent/add-base-path-const.d.ts +0 -4
- package/dist-types/agent/add-base-path-import.d.ts +0 -4
- package/dist-types/agent/add-url-domain.d.ts +0 -4
- package/dist-types/agent/agent-test-wiring.d.ts +0 -4
- package/dist-types/agent/fetch-response-body-json.d.ts +0 -4
- package/dist-types/agent/fetch-response-header-getter.d.ts +0 -4
- package/dist-types/agent/fetch-then.d.ts +0 -4
- package/dist-types/agent/fetch.d.ts +0 -4
- package/dist-types/agent/file.d.ts +0 -7
- package/dist-types/agent/fix-function-call-arguments.d.ts +0 -9
- package/dist-types/agent/no-fixture.d.ts +0 -4
- package/dist-types/agent/no-mapped-response.d.ts +0 -4
- package/dist-types/agent/no-service-wrapper.d.ts +0 -4
- package/dist-types/agent/no-status-code.d.ts +0 -4
- package/dist-types/agent/no-unused-function-argument.d.ts +0 -4
- package/dist-types/agent/no-unused-imports.d.ts +0 -4
- package/dist-types/agent/no-unused-service-variable.d.ts +0 -4
- package/dist-types/agent/response-reference.d.ts +0 -16
- package/dist-types/agent/url.d.ts +0 -4
- package/src/agent/add-assert-import.ts +0 -74
- package/src/agent/add-base-path-const.ts +0 -81
- package/src/agent/add-base-path-import.ts +0 -69
- package/src/agent/add-url-domain.ts +0 -76
- package/src/agent/agent-test-wiring.ts +0 -246
- package/src/agent/fetch-response-body-json.ts +0 -197
- package/src/agent/fetch-response-header-getter.ts +0 -148
- package/src/agent/fetch-then.ts +0 -355
- package/src/agent/fetch.ts +0 -53
- package/src/agent/file.ts +0 -42
- package/src/agent/fix-function-call-arguments.ts +0 -200
- package/src/agent/no-fixture.ts +0 -480
- package/src/agent/no-mapped-response.ts +0 -84
- package/src/agent/no-service-wrapper.ts +0 -241
- package/src/agent/no-status-code.ts +0 -72
- package/src/agent/no-unused-function-argument.ts +0 -98
- package/src/agent/no-unused-imports.ts +0 -103
- package/src/agent/no-unused-service-variable.ts +0 -93
- package/src/agent/response-reference.ts +0 -122
- package/src/agent/url.ts +0 -32
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
// src/agent/add-url-domain.ts
|
|
2
|
-
import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
|
|
3
|
-
import getDocumentationUrl from "../get-documentation-url.mjs";
|
|
4
|
-
import { addBasePathUrlDomain } from "./url.mjs";
|
|
5
|
-
var ruleId = "add-url-domain";
|
|
6
|
-
var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
|
|
7
|
-
var rule = createRule({
|
|
8
|
-
name: ruleId,
|
|
9
|
-
meta: {
|
|
10
|
-
type: "suggestion",
|
|
11
|
-
docs: {
|
|
12
|
-
description: "Add HTTP domain to the BASE_PATH like url constant variable."
|
|
13
|
-
},
|
|
14
|
-
messages: {
|
|
15
|
-
addDomain: "Add HTTP domain to the BASE_PATH like url constant variable.",
|
|
16
|
-
unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
|
|
17
|
-
},
|
|
18
|
-
fixable: "code",
|
|
19
|
-
schema: []
|
|
20
|
-
},
|
|
21
|
-
defaultOptions: [],
|
|
22
|
-
create(context) {
|
|
23
|
-
const sourceCode = context.sourceCode;
|
|
24
|
-
return {
|
|
25
|
-
"VariableDeclarator[id.name=/^([A-Z]+_)*BASE_PATH$/]": (basePathDeclarator) => {
|
|
26
|
-
try {
|
|
27
|
-
if (basePathDeclarator.init === null || basePathDeclarator.init.type !== AST_NODE_TYPES.Literal && basePathDeclarator.init.type !== AST_NODE_TYPES.TemplateLiteral) {
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
const urlText = sourceCode.getText(basePathDeclarator.init);
|
|
31
|
-
const replacement = addBasePathUrlDomain(urlText);
|
|
32
|
-
if (replacement !== urlText) {
|
|
33
|
-
context.report({
|
|
34
|
-
messageId: "addDomain",
|
|
35
|
-
node: basePathDeclarator.init,
|
|
36
|
-
fix(fixer) {
|
|
37
|
-
return fixer.replaceText(basePathDeclarator.init, replacement);
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
} catch (error) {
|
|
42
|
-
console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
|
|
43
|
-
context.report({
|
|
44
|
-
node: basePathDeclarator,
|
|
45
|
-
messageId: "unknownError",
|
|
46
|
-
data: {
|
|
47
|
-
fileName: context.filename,
|
|
48
|
-
error: error instanceof Error ? error.toString() : JSON.stringify(error)
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
var add_url_domain_default = rule;
|
|
57
|
-
export {
|
|
58
|
-
add_url_domain_default as default,
|
|
59
|
-
ruleId
|
|
60
|
-
};
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L2FkZC11cmwtZG9tYWluLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFBLFNBQVMsZ0JBQWdCLG1CQUE2QjtBQUV0RCxPQUFPLHlCQUF5QjtBQUNoQyxTQUFTLDRCQUE0QjtBQUU5QixJQUFNLFNBQVM7QUFFdEIsSUFBTSxhQUFhLFlBQVksWUFBWSxDQUFDLFNBQVMsb0JBQW9CLElBQUksQ0FBQztBQUU5RSxJQUFNLE9BQTZELFdBQVc7QUFBQSxFQUM1RSxNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsTUFDSixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IsV0FBVztBQUFBLE1BQ1gsY0FBYztBQUFBLElBQ2hCO0FBQUEsSUFDQSxTQUFTO0FBQUEsSUFDVCxRQUFRLENBQUM7QUFBQSxFQUNYO0FBQUEsRUFDQSxnQkFBZ0IsQ0FBQztBQUFBLEVBQ2pCLE9BQU8sU0FBUztBQUNkLFVBQU0sYUFBYSxRQUFRO0FBRTNCLFdBQU87QUFBQSxNQUNMLHVEQUF1RCxDQUFDLHVCQUFvRDtBQUMxRyxZQUFJO0FBQ0YsY0FDRSxtQkFBbUIsU0FBUyxRQUMzQixtQkFBbUIsS0FBSyxTQUFTLGVBQWUsV0FDL0MsbUJBQW1CLEtBQUssU0FBUyxlQUFlLGlCQUNsRDtBQUNBO0FBQUEsVUFDRjtBQUVBLGdCQUFNLFVBQVUsV0FBVyxRQUFRLG1CQUFtQixJQUFJO0FBQzFELGdCQUFNLGNBQWMscUJBQXFCLE9BQU87QUFFaEQsY0FBSSxnQkFBZ0IsU0FBUztBQUMzQixvQkFBUSxPQUFPO0FBQUEsY0FDYixXQUFXO0FBQUEsY0FDWCxNQUFNLG1CQUFtQjtBQUFBLGNBQ3pCLElBQUksT0FBTztBQUNULHVCQUFPLE1BQU0sWUFBWSxtQkFBbUIsTUFBdUIsV0FBVztBQUFBLGNBQ2hGO0FBQUEsWUFDRixDQUFDO0FBQUEsVUFDSDtBQUFBLFFBQ0YsU0FBUyxPQUFPO0FBRWQsa0JBQVEsTUFBTSxtQkFBbUIsTUFBTSxtQkFBbUIsUUFBUSxRQUFRLE1BQU0sS0FBSztBQUNyRixrQkFBUSxPQUFPO0FBQUEsWUFDYixNQUFNO0FBQUEsWUFDTixXQUFXO0FBQUEsWUFDWCxNQUFNO0FBQUEsY0FDSixVQUFVLFFBQVE7QUFBQSxjQUNsQixPQUFPLGlCQUFpQixRQUFRLE1BQU0sU0FBUyxJQUFJLEtBQUssVUFBVSxLQUFLO0FBQUEsWUFDekU7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQztBQUVELElBQU8seUJBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
// src/agent/agent-test-wiring.ts
|
|
2
|
-
import { strict as assert } from "node:assert";
|
|
3
|
-
import { AST_TOKEN_TYPES, ESLintUtils, TSESTree } from "@typescript-eslint/utils";
|
|
4
|
-
import debug from "debug";
|
|
5
|
-
import getDocumentationUrl from "../get-documentation-url.mjs";
|
|
6
|
-
var ruleId = "agent-test-wiring";
|
|
7
|
-
var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
|
|
8
|
-
var log = debug("eslint-plugin:agent:agent-test-wiring");
|
|
9
|
-
var STATEMENT_FIXTURE_RESET = "fixture.reset()";
|
|
10
|
-
var STATEMENT_FIXTURE_RESET_AWAITED = `await ${STATEMENT_FIXTURE_RESET};`;
|
|
11
|
-
var STATEMENT_AGENT_DECLARATION = "let agent: Agent;";
|
|
12
|
-
var STATEMENT_AGENT_CREATION = "agent = await createAgent();";
|
|
13
|
-
var STATEMENT_AGENT_REGISTER = "agent.register(await fixturePlugin(fixture));";
|
|
14
|
-
var STATEMENT_AGENT_ENABLE = "agent.enable();";
|
|
15
|
-
var STATEMENT_AGENT_DISPOSE = "await agent[Symbol.asyncDispose]();";
|
|
16
|
-
var rule = createRule({
|
|
17
|
-
name: ruleId,
|
|
18
|
-
meta: {
|
|
19
|
-
type: "suggestion",
|
|
20
|
-
docs: {
|
|
21
|
-
description: "Update test wiring."
|
|
22
|
-
},
|
|
23
|
-
messages: {
|
|
24
|
-
updateTestWiring: "Updating test wiring.",
|
|
25
|
-
unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
|
|
26
|
-
},
|
|
27
|
-
fixable: "code",
|
|
28
|
-
schema: []
|
|
29
|
-
},
|
|
30
|
-
defaultOptions: [],
|
|
31
|
-
create(context) {
|
|
32
|
-
log("Processing file:", context.filename);
|
|
33
|
-
const sourceCode = context.sourceCode;
|
|
34
|
-
const importDeclarations = /* @__PURE__ */ new Map();
|
|
35
|
-
let isFixtureUsed = false;
|
|
36
|
-
let beforeAll;
|
|
37
|
-
let afterAll;
|
|
38
|
-
return {
|
|
39
|
-
ImportDeclaration(importDeclaration) {
|
|
40
|
-
const moduleName = importDeclaration.source.value;
|
|
41
|
-
importDeclarations.set(moduleName, importDeclaration);
|
|
42
|
-
if (moduleName === "@checkdigit/fixture" && importDeclaration.specifiers.some(
|
|
43
|
-
(specifier) => specifier.type === TSESTree.AST_NODE_TYPES.ImportSpecifier && specifier.imported.type === TSESTree.AST_NODE_TYPES.Identifier && specifier.imported.name === "createFixture"
|
|
44
|
-
)) {
|
|
45
|
-
isFixtureUsed = true;
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
'CallExpression[callee.name="beforeAll"]': (callExpression) => {
|
|
49
|
-
beforeAll = callExpression;
|
|
50
|
-
},
|
|
51
|
-
'CallExpression[callee.name="afterAll"]': (callExpression) => {
|
|
52
|
-
afterAll = callExpression;
|
|
53
|
-
},
|
|
54
|
-
"Program:exit"(program) {
|
|
55
|
-
if (!isFixtureUsed || beforeAll === void 0) {
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
try {
|
|
59
|
-
let jestImportFixer;
|
|
60
|
-
let agentImportFixer;
|
|
61
|
-
let fixturePluginImportFixer;
|
|
62
|
-
let agentDeclarationFixer;
|
|
63
|
-
let beforeAllFixer;
|
|
64
|
-
let afterAllFixer;
|
|
65
|
-
const lastImportDeclaration = [...importDeclarations.values()].at(-1);
|
|
66
|
-
assert.ok(lastImportDeclaration);
|
|
67
|
-
const jestImportDeclaration = importDeclarations.get("@jest/globals");
|
|
68
|
-
if (jestImportDeclaration && !jestImportDeclaration.specifiers.some(
|
|
69
|
-
(specifier) => specifier.type === TSESTree.AST_NODE_TYPES.ImportSpecifier && specifier.imported.type === TSESTree.AST_NODE_TYPES.Identifier && specifier.imported.name === "afterAll"
|
|
70
|
-
)) {
|
|
71
|
-
const firstImportSpecifier = jestImportDeclaration.specifiers[0];
|
|
72
|
-
assert.ok(firstImportSpecifier);
|
|
73
|
-
jestImportFixer = (fixer) => fixer.insertTextBefore(firstImportSpecifier, "afterAll, ");
|
|
74
|
-
}
|
|
75
|
-
const agentImportDeclaration = importDeclarations.get("@checkdigit/agent");
|
|
76
|
-
if (!agentImportDeclaration) {
|
|
77
|
-
agentImportFixer = (fixer) => fixer.insertTextAfter(
|
|
78
|
-
lastImportDeclaration,
|
|
79
|
-
`
|
|
80
|
-
import createAgent, { type Agent } from '@checkdigit/agent';`
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
const pathLets = context.filename.split("/");
|
|
84
|
-
const currentFileIndex = pathLets.length - 1;
|
|
85
|
-
const pluginFolderIndex = pathLets.lastIndexOf("src") + 1;
|
|
86
|
-
const fixturePluginImportPath = `${"../".repeat(currentFileIndex - pluginFolderIndex)}plugin/fixture.test`;
|
|
87
|
-
if (!importDeclarations.get(fixturePluginImportPath)) {
|
|
88
|
-
fixturePluginImportFixer = (fixer) => fixer.insertTextAfter(lastImportDeclaration, `
|
|
89
|
-
import fixturePlugin from '${fixturePluginImportPath}';`);
|
|
90
|
-
}
|
|
91
|
-
const beforeAllArgument = beforeAll.arguments[0];
|
|
92
|
-
assert.ok(beforeAllArgument !== void 0);
|
|
93
|
-
if (!sourceCode.getText(beforeAllArgument).includes(STATEMENT_AGENT_CREATION)) {
|
|
94
|
-
if (beforeAllArgument.type === TSESTree.AST_NODE_TYPES.ArrowFunctionExpression && beforeAllArgument.body.type === TSESTree.AST_NODE_TYPES.BlockStatement) {
|
|
95
|
-
const fixtureResetStatement = beforeAllArgument.body.body.find(
|
|
96
|
-
(statement) => sourceCode.getText(statement) === STATEMENT_FIXTURE_RESET_AWAITED
|
|
97
|
-
);
|
|
98
|
-
assert.ok(fixtureResetStatement !== void 0);
|
|
99
|
-
beforeAllFixer = (fixer) => fixer.replaceText(
|
|
100
|
-
fixtureResetStatement,
|
|
101
|
-
[
|
|
102
|
-
STATEMENT_AGENT_CREATION,
|
|
103
|
-
STATEMENT_AGENT_REGISTER,
|
|
104
|
-
STATEMENT_AGENT_ENABLE,
|
|
105
|
-
STATEMENT_FIXTURE_RESET_AWAITED
|
|
106
|
-
].join("\n")
|
|
107
|
-
);
|
|
108
|
-
} else {
|
|
109
|
-
beforeAllFixer = (fixer) => fixer.replaceText(
|
|
110
|
-
beforeAllArgument,
|
|
111
|
-
[
|
|
112
|
-
`async () => {`,
|
|
113
|
-
STATEMENT_AGENT_CREATION,
|
|
114
|
-
STATEMENT_AGENT_REGISTER,
|
|
115
|
-
STATEMENT_AGENT_ENABLE,
|
|
116
|
-
STATEMENT_FIXTURE_RESET_AWAITED,
|
|
117
|
-
`}`
|
|
118
|
-
].join("\n")
|
|
119
|
-
);
|
|
120
|
-
}
|
|
121
|
-
agentDeclarationFixer = (fixer) => (
|
|
122
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
123
|
-
fixer.insertTextBefore(beforeAll, `${STATEMENT_AGENT_DECLARATION}
|
|
124
|
-
`)
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
if (afterAll !== void 0) {
|
|
128
|
-
const afterAllArrowFunctionExpression = afterAll.arguments[0];
|
|
129
|
-
assert.ok(
|
|
130
|
-
afterAllArrowFunctionExpression !== void 0 && afterAllArrowFunctionExpression.type === TSESTree.AST_NODE_TYPES.ArrowFunctionExpression
|
|
131
|
-
);
|
|
132
|
-
const arrowFunctionBody = afterAllArrowFunctionExpression.body;
|
|
133
|
-
assert.ok(arrowFunctionBody.type === TSESTree.AST_NODE_TYPES.BlockStatement);
|
|
134
|
-
const afterAllBodyText = sourceCode.getText(arrowFunctionBody);
|
|
135
|
-
if (!afterAllBodyText.includes(STATEMENT_AGENT_DISPOSE)) {
|
|
136
|
-
const lastStatement = arrowFunctionBody.body.at(-1);
|
|
137
|
-
assert.ok(lastStatement);
|
|
138
|
-
afterAllFixer = (fixer) => fixer.insertTextAfter(lastStatement, STATEMENT_AGENT_DISPOSE);
|
|
139
|
-
}
|
|
140
|
-
} else {
|
|
141
|
-
const nextToken = sourceCode.getTokenAfter(beforeAll);
|
|
142
|
-
afterAllFixer = (fixer) => fixer.insertTextAfter(
|
|
143
|
-
nextToken !== null && nextToken.type === AST_TOKEN_TYPES.Punctuator ? nextToken : (
|
|
144
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
145
|
-
beforeAll
|
|
146
|
-
),
|
|
147
|
-
["", `afterAll(async () => {`, STATEMENT_AGENT_DISPOSE, `});`].join("\n")
|
|
148
|
-
);
|
|
149
|
-
}
|
|
150
|
-
if (jestImportFixer !== void 0 || agentImportFixer !== void 0 || fixturePluginImportFixer !== void 0 || agentDeclarationFixer !== void 0 || beforeAllFixer !== void 0 || afterAllFixer !== void 0) {
|
|
151
|
-
context.report({
|
|
152
|
-
messageId: "updateTestWiring",
|
|
153
|
-
node: beforeAll,
|
|
154
|
-
*fix(fixer) {
|
|
155
|
-
if (jestImportFixer !== void 0) {
|
|
156
|
-
yield jestImportFixer(fixer);
|
|
157
|
-
}
|
|
158
|
-
if (agentImportFixer !== void 0) {
|
|
159
|
-
yield agentImportFixer(fixer);
|
|
160
|
-
}
|
|
161
|
-
if (fixturePluginImportFixer !== void 0) {
|
|
162
|
-
yield fixturePluginImportFixer(fixer);
|
|
163
|
-
}
|
|
164
|
-
if (agentDeclarationFixer !== void 0) {
|
|
165
|
-
yield agentDeclarationFixer(fixer);
|
|
166
|
-
}
|
|
167
|
-
if (beforeAllFixer !== void 0) {
|
|
168
|
-
yield beforeAllFixer(fixer);
|
|
169
|
-
}
|
|
170
|
-
if (afterAllFixer !== void 0) {
|
|
171
|
-
yield afterAllFixer(fixer);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
} catch (error) {
|
|
177
|
-
console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
|
|
178
|
-
context.report({
|
|
179
|
-
node: program,
|
|
180
|
-
messageId: "unknownError",
|
|
181
|
-
data: {
|
|
182
|
-
fileName: context.filename,
|
|
183
|
-
error: error instanceof Error ? error.toString() : JSON.stringify(error)
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
var agent_test_wiring_default = rule;
|
|
192
|
-
export {
|
|
193
|
-
agent_test_wiring_default as default,
|
|
194
|
-
ruleId
|
|
195
|
-
};
|
|
196
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L2FnZW50LXRlc3Qtd2lyaW5nLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFBLFNBQVMsVUFBVSxjQUFjO0FBRWpDLFNBQVMsaUJBQWlCLGFBQWEsZ0JBQWdCO0FBRXZELE9BQU8sV0FBVztBQUVsQixPQUFPLHlCQUF5QjtBQUV6QixJQUFNLFNBQVM7QUFDdEIsSUFBTSxhQUFhLFlBQVksWUFBWSxDQUFDLFNBQVMsb0JBQW9CLElBQUksQ0FBQztBQUM5RSxJQUFNLE1BQU0sTUFBTSx1Q0FBdUM7QUFFekQsSUFBTSwwQkFBMEI7QUFDaEMsSUFBTSxrQ0FBa0MsU0FBUyx1QkFBdUI7QUFDeEUsSUFBTSw4QkFBOEI7QUFDcEMsSUFBTSwyQkFBMkI7QUFDakMsSUFBTSwyQkFBMkI7QUFDakMsSUFBTSx5QkFBeUI7QUFDL0IsSUFBTSwwQkFBMEI7QUFFaEMsSUFBTSxPQUFvRSxXQUFXO0FBQUEsRUFDbkYsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLGtCQUFrQjtBQUFBLE1BQ2xCLGNBQWM7QUFBQSxJQUNoQjtBQUFBLElBQ0EsU0FBUztBQUFBLElBQ1QsUUFBUSxDQUFDO0FBQUEsRUFDWDtBQUFBLEVBQ0EsZ0JBQWdCLENBQUM7QUFBQSxFQUNqQixPQUFPLFNBQVM7QUFDZCxRQUFJLG9CQUFvQixRQUFRLFFBQVE7QUFDeEMsVUFBTSxhQUFhLFFBQVE7QUFDM0IsVUFBTSxxQkFBcUIsb0JBQUksSUFBd0M7QUFDdkUsUUFBSSxnQkFBZ0I7QUFDcEIsUUFBSTtBQUNKLFFBQUk7QUFFSixXQUFPO0FBQUEsTUFDTCxrQkFBa0IsbUJBQW1CO0FBQ25DLGNBQU0sYUFBYSxrQkFBa0IsT0FBTztBQUM1QywyQkFBbUIsSUFBSSxZQUFZLGlCQUFpQjtBQUNwRCxZQUNFLGVBQWUseUJBQ2Ysa0JBQWtC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
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
// src/agent/fetch-response-body-json.ts
|
|
2
|
-
import { strict as assert } from "node:assert";
|
|
3
|
-
import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
|
|
4
|
-
import getDocumentationUrl from "../get-documentation-url.mjs";
|
|
5
|
-
import { getAncestor } from "../library/ts-tree.mjs";
|
|
6
|
-
var ruleId = "fetch-response-body-json";
|
|
7
|
-
var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
|
|
8
|
-
var rule = createRule({
|
|
9
|
-
name: ruleId,
|
|
10
|
-
meta: {
|
|
11
|
-
type: "suggestion",
|
|
12
|
-
docs: {
|
|
13
|
-
description: 'Replace "response.body" with "await response.json()".'
|
|
14
|
-
},
|
|
15
|
-
messages: {
|
|
16
|
-
refactorNeeded: "Please extract the fetch call and check its reponse status code before accessing its response body.",
|
|
17
|
-
replaceBodyWithJson: 'Replace "response.body" with "await response.json()".',
|
|
18
|
-
unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
|
|
19
|
-
},
|
|
20
|
-
fixable: "code",
|
|
21
|
-
schema: []
|
|
22
|
-
},
|
|
23
|
-
defaultOptions: [],
|
|
24
|
-
create(context) {
|
|
25
|
-
const parserServices = ESLintUtils.getParserServices(context);
|
|
26
|
-
const typeChecker = parserServices.program.getTypeChecker();
|
|
27
|
-
const allChanges = /* @__PURE__ */ new Map();
|
|
28
|
-
return {
|
|
29
|
-
'MemberExpression[property.name="body"]': (responseBodyNode) => {
|
|
30
|
-
try {
|
|
31
|
-
const responseNode = parserServices.esTreeNodeToTSNodeMap.get(responseBodyNode.object);
|
|
32
|
-
const responseType = typeChecker.getTypeAtLocation(responseNode);
|
|
33
|
-
const shouldReplace = responseType.getProperties().some((symbol) => symbol.name === "body") && responseType.getProperties().some((symbol) => symbol.name === "json");
|
|
34
|
-
if (shouldReplace) {
|
|
35
|
-
if (responseBodyNode.object.type !== AST_NODE_TYPES.Identifier) {
|
|
36
|
-
context.report({
|
|
37
|
-
node: responseBodyNode,
|
|
38
|
-
messageId: "refactorNeeded"
|
|
39
|
-
});
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
const enclosingFunction = getAncestor(
|
|
43
|
-
responseBodyNode,
|
|
44
|
-
(node) => node.type === AST_NODE_TYPES.ArrowFunctionExpression || node.type === AST_NODE_TYPES.FunctionExpression || node.type === AST_NODE_TYPES.FunctionDeclaration
|
|
45
|
-
);
|
|
46
|
-
const enclosingStatement = getAncestor(
|
|
47
|
-
responseBodyNode,
|
|
48
|
-
(node) => (node.type === AST_NODE_TYPES.VariableDeclaration || node.type === AST_NODE_TYPES.ExpressionStatement || node.type === AST_NODE_TYPES.ReturnStatement) && node.parent.type === AST_NODE_TYPES.BlockStatement
|
|
49
|
-
);
|
|
50
|
-
const enclosingStatementIndex = enclosingFunction.body.body.indexOf(
|
|
51
|
-
enclosingStatement
|
|
52
|
-
);
|
|
53
|
-
const responseVariableName = responseBodyNode.object.name;
|
|
54
|
-
const isResponseBodyVariableDeclared = enclosingStatement.type === AST_NODE_TYPES.VariableDeclaration && enclosingStatement.declarations.some(
|
|
55
|
-
(declaration) => declaration.init === responseBodyNode || declaration.init?.type === AST_NODE_TYPES.TSAsExpression && declaration.init.expression === responseBodyNode
|
|
56
|
-
);
|
|
57
|
-
const responseBodyVariableName = isResponseBodyVariableDeclared ? enclosingStatement.declarations.find(
|
|
58
|
-
(declaration) => declaration.init === responseBodyNode || declaration.init?.type === AST_NODE_TYPES.TSAsExpression && declaration.init.expression === responseBodyNode
|
|
59
|
-
)?.id : `${responseBodyNode.object.name}Body`;
|
|
60
|
-
const change = {
|
|
61
|
-
enclosingFunction,
|
|
62
|
-
enclosingStatement,
|
|
63
|
-
enclosingStatementIndex,
|
|
64
|
-
responseVariableName,
|
|
65
|
-
responseBodyNode,
|
|
66
|
-
responseBodyVariableName,
|
|
67
|
-
isResponseBodyVariableDeclared
|
|
68
|
-
};
|
|
69
|
-
const changesByFunction = allChanges.get(enclosingFunction) ?? /* @__PURE__ */ new Map();
|
|
70
|
-
const changesByResponse = changesByFunction.get(responseVariableName) ?? [];
|
|
71
|
-
changesByResponse.push(change);
|
|
72
|
-
changesByFunction.set(responseVariableName, changesByResponse);
|
|
73
|
-
allChanges.set(enclosingFunction, changesByFunction);
|
|
74
|
-
}
|
|
75
|
-
} catch (error) {
|
|
76
|
-
console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
|
|
77
|
-
context.report({
|
|
78
|
-
node: responseBodyNode,
|
|
79
|
-
messageId: "unknownError",
|
|
80
|
-
data: {
|
|
81
|
-
fileName: context.filename,
|
|
82
|
-
error: error instanceof Error ? error.toString() : JSON.stringify(error)
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
},
|
|
87
|
-
"Program:exit": () => {
|
|
88
|
-
if (allChanges.size === 0) {
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
const fixes = [];
|
|
92
|
-
for (const changesByFunction of allChanges.values()) {
|
|
93
|
-
for (const changesByResponse of changesByFunction.values()) {
|
|
94
|
-
const orderedChanges = changesByResponse.sort(
|
|
95
|
-
(changeA, changeB) => changeA.enclosingStatementIndex - changeB.enclosingStatementIndex
|
|
96
|
-
);
|
|
97
|
-
const firstChange = orderedChanges[0];
|
|
98
|
-
assert(firstChange);
|
|
99
|
-
const {
|
|
100
|
-
responseBodyNode,
|
|
101
|
-
responseVariableName,
|
|
102
|
-
responseBodyVariableName,
|
|
103
|
-
isResponseBodyVariableDeclared,
|
|
104
|
-
enclosingStatement
|
|
105
|
-
} = firstChange;
|
|
106
|
-
let remainingChanges;
|
|
107
|
-
if (!isResponseBodyVariableDeclared) {
|
|
108
|
-
fixes.push({
|
|
109
|
-
node: context.sourceCode.getTokenBefore(enclosingStatement),
|
|
110
|
-
text: `
|
|
111
|
-
const ${responseBodyVariableName} = await ${responseVariableName}.json();`,
|
|
112
|
-
insert: true
|
|
113
|
-
});
|
|
114
|
-
remainingChanges = orderedChanges;
|
|
115
|
-
} else {
|
|
116
|
-
fixes.push({
|
|
117
|
-
node: responseBodyNode,
|
|
118
|
-
text: `await ${responseVariableName}.json()`,
|
|
119
|
-
insert: false
|
|
120
|
-
});
|
|
121
|
-
remainingChanges = orderedChanges.slice(1);
|
|
122
|
-
}
|
|
123
|
-
for (const change of remainingChanges) {
|
|
124
|
-
fixes.push({ node: change.responseBodyNode, text: responseBodyVariableName, insert: false });
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
for (const fix of fixes.reverse()) {
|
|
129
|
-
context.report({
|
|
130
|
-
node: fix.node,
|
|
131
|
-
messageId: "replaceBodyWithJson",
|
|
132
|
-
fix(fixer) {
|
|
133
|
-
return fix.insert ? fixer.insertTextAfter(fix.node, fix.text) : fixer.replaceText(fix.node, fix.text);
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
});
|
|
141
|
-
var fetch_response_body_json_default = rule;
|
|
142
|
-
export {
|
|
143
|
-
fetch_response_body_json_default as default,
|
|
144
|
-
ruleId
|
|
145
|
-
};
|
|
146
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L2ZldGNoLXJlc3BvbnNlLWJvZHktanNvbi50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxTQUFTLFVBQVUsY0FBYztBQUVqQyxTQUFTLGdCQUFnQixtQkFBNkI7QUFFdEQsT0FBTyx5QkFBeUI7QUFDaEMsU0FBUyxtQkFBbUI7QUFFckIsSUFBTSxTQUFTO0FBRXRCLElBQU0sYUFBYSxZQUFZLFlBQVksQ0FBQyxTQUFTLG9CQUFvQixJQUFJLENBQUM7QUFhOUUsSUFBTSxPQUEwRixXQUFXO0FBQUEsRUFDekcsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLGdCQUNFO0FBQUEsTUFDRixxQkFBcUI7QUFBQSxNQUNyQixjQUFjO0FBQUEsSUFDaEI7QUFBQSxJQUNBLFNBQVM7QUFBQSxJQUNULFFBQVEsQ0FBQztBQUFBLEVBQ1g7QUFBQSxFQUNBLGdCQUFnQixDQUFDO0FBQUEsRUFDakIsT0FBTyxTQUFTO0FBQ2QsVUFBTSxpQkFBaUIsWUFBWSxrQkFBa0IsT0FBTztBQUM1RCxVQUFNLGNBQWMsZUFBZSxRQUFRLGVBQWU7QUFDMUQsVUFBTSxhQUFhLG9CQUFJLElBQTBDO0FBRWpFLFdBQU87QUFBQSxNQUNMLDBDQUEwQyxDQUFDLHFCQUFnRDtBQUN6RixZQUFJO0FBQ0YsZ0JBQU0sZUFBZSxlQUFlLHNCQUFzQixJQUFJLGlCQUFpQixNQUFNO0FBQ3JGLGdCQUFNLGVBQWUsWUFBWSxrQkFBa0IsWUFBWTtBQUUvRCxnQkFBTSxnQkFDSixhQUFhLGNBQWMsRUFBRSxLQUFLLENBQUMsV0FBVyxPQUFPLFNBQVMsTUFBTSxLQUNwRSxhQUFhLGNBQWMsRUFBRSxLQUFLLENBQUMsV0FBVyxPQUFPLFNBQVMsTUFBTTtBQUV0RSxjQUFJLGVBQWU7QUFDakIsZ0JBQUksaUJBQWlCLE9BQU8sU0FBUyxl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
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
// src/agent/fetch-response-header-getter.ts
|
|
2
|
-
import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
|
|
3
|
-
import getDocumentationUrl from "../get-documentation-url.mjs";
|
|
4
|
-
var ruleId = "fetch-response-header-getter-ts";
|
|
5
|
-
var HEADER_BUILTIN_FUNCTIONS = Object.keys(Headers.prototype);
|
|
6
|
-
var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
|
|
7
|
-
var rule = createRule({
|
|
8
|
-
name: ruleId,
|
|
9
|
-
meta: {
|
|
10
|
-
type: "suggestion",
|
|
11
|
-
docs: {
|
|
12
|
-
description: 'Use "get()" method to get header value from the headers object of the fetch response.'
|
|
13
|
-
},
|
|
14
|
-
messages: {
|
|
15
|
-
useGetter: 'Use "get()" method to get header value from the headers object of the fetch response.',
|
|
16
|
-
unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
|
|
17
|
-
},
|
|
18
|
-
fixable: "code",
|
|
19
|
-
schema: []
|
|
20
|
-
},
|
|
21
|
-
defaultOptions: [],
|
|
22
|
-
create(context) {
|
|
23
|
-
const parserServices = ESLintUtils.getParserServices(context);
|
|
24
|
-
const typeChecker = parserServices.program.getTypeChecker();
|
|
25
|
-
const sourceCode = context.sourceCode;
|
|
26
|
-
return {
|
|
27
|
-
MemberExpression: (responseHeadersAccess) => {
|
|
28
|
-
try {
|
|
29
|
-
if (responseHeadersAccess.property.type === AST_NODE_TYPES.Identifier && HEADER_BUILTIN_FUNCTIONS.includes(responseHeadersAccess.property.name)) {
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
const responseHeadersTsNode = parserServices.esTreeNodeToTSNodeMap.get(responseHeadersAccess.object);
|
|
33
|
-
let responseHeadersType = typeChecker.getTypeAtLocation(responseHeadersTsNode);
|
|
34
|
-
responseHeadersType = responseHeadersType.isUnion() ? responseHeadersType.types[0] : responseHeadersType;
|
|
35
|
-
const responseHeadersTypeName = (
|
|
36
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
37
|
-
(responseHeadersType.symbol ?? responseHeadersType.aliasSymbol)?.escapedName
|
|
38
|
-
);
|
|
39
|
-
if (responseHeadersTypeName !== "Headers" && responseHeadersTypeName !== "HeaderGetter") {
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
let replacementText;
|
|
43
|
-
if (!responseHeadersAccess.computed) {
|
|
44
|
-
replacementText = `${sourceCode.getText(responseHeadersAccess.object)}.get('${sourceCode.getText(responseHeadersAccess.property)}')`;
|
|
45
|
-
} else if (responseHeadersAccess.property.type === AST_NODE_TYPES.Identifier || responseHeadersAccess.property.type === AST_NODE_TYPES.Literal || responseHeadersAccess.property.type === AST_NODE_TYPES.TemplateLiteral) {
|
|
46
|
-
replacementText = `${sourceCode.getText(responseHeadersAccess.object)}.get(${sourceCode.getText(responseHeadersAccess.property)})`;
|
|
47
|
-
} else {
|
|
48
|
-
throw new Error(`Unexpected property type: ${responseHeadersAccess.property.type}`);
|
|
49
|
-
}
|
|
50
|
-
context.report({
|
|
51
|
-
messageId: "useGetter",
|
|
52
|
-
node: responseHeadersAccess.property,
|
|
53
|
-
fix(fixer) {
|
|
54
|
-
return fixer.replaceText(responseHeadersAccess, replacementText);
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
} catch (error) {
|
|
58
|
-
console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
|
|
59
|
-
context.report({
|
|
60
|
-
node: responseHeadersAccess,
|
|
61
|
-
messageId: "unknownError",
|
|
62
|
-
data: {
|
|
63
|
-
fileName: context.filename,
|
|
64
|
-
error: error instanceof Error ? error.toString() : JSON.stringify(error)
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
},
|
|
69
|
-
// convert response.get() to response.headers.get()
|
|
70
|
-
'CallExpression[callee.property.name="get"]': (responseHeadersAccess) => {
|
|
71
|
-
try {
|
|
72
|
-
if (responseHeadersAccess.callee.type !== AST_NODE_TYPES.MemberExpression) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
if (responseHeadersAccess.callee.object.type !== AST_NODE_TYPES.Identifier || responseHeadersAccess.callee.object.name === "request") {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
const responseNode = responseHeadersAccess.callee.object;
|
|
79
|
-
const responseHeadersTsNode = parserServices.esTreeNodeToTSNodeMap.get(responseNode);
|
|
80
|
-
const responseType = typeChecker.getTypeAtLocation(responseHeadersTsNode);
|
|
81
|
-
const typeName = typeChecker.typeToString(responseType);
|
|
82
|
-
if (typeName === "InboundContext" || typeName.endsWith("RequestType")) {
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
const hasHeadersProperty = responseType.getProperties().some((symbol) => symbol.name === "headers");
|
|
86
|
-
if (!hasHeadersProperty) {
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
const replacementText = `${sourceCode.getText(responseNode)}.headers`;
|
|
90
|
-
context.report({
|
|
91
|
-
messageId: "useGetter",
|
|
92
|
-
node: responseHeadersAccess,
|
|
93
|
-
fix(fixer) {
|
|
94
|
-
return fixer.replaceText(responseNode, replacementText);
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
} catch (error) {
|
|
98
|
-
console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
|
|
99
|
-
context.report({
|
|
100
|
-
node: responseHeadersAccess,
|
|
101
|
-
messageId: "unknownError",
|
|
102
|
-
data: {
|
|
103
|
-
fileName: context.filename,
|
|
104
|
-
error: error instanceof Error ? error.toString() : JSON.stringify(error)
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
var fetch_response_header_getter_default = rule;
|
|
113
|
-
export {
|
|
114
|
-
fetch_response_header_getter_default as default,
|
|
115
|
-
ruleId
|
|
116
|
-
};
|
|
117
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L2ZldGNoLXJlc3BvbnNlLWhlYWRlci1nZXR0ZXIudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBUUEsU0FBUyxnQkFBZ0IsbUJBQTZCO0FBRXRELE9BQU8seUJBQXlCO0FBRXpCLElBQU0sU0FBUztBQUN0QixJQUFNLDJCQUEyQixPQUFPLEtBQUssUUFBUSxTQUFTO0FBRTlELElBQU0sYUFBYSxZQUFZLFlBQVksQ0FBQyxTQUFTLG9CQUFvQixJQUFJLENBQUM7QUFFOUUsSUFBTSxPQUE2RCxXQUFXO0FBQUEsRUFDNUUsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLFdBQVc7QUFBQSxNQUNYLGNBQWM7QUFBQSxJQUNoQjtBQUFBLElBQ0EsU0FBUztBQUFBLElBQ1QsUUFBUSxDQUFDO0FBQUEsRUFDWDtBQUFBLEVBQ0EsZ0JBQWdCLENBQUM7QUFBQSxFQUNqQixPQUFPLFNBQVM7QUFDZCxVQUFNLGlCQUFpQixZQUFZLGtCQUFrQixPQUFPO0FBQzVELFVBQU0sY0FBYyxlQUFlLFFBQVEsZUFBZTtBQUMxRCxVQUFNLGFBQWEsUUFBUTtBQUUzQixXQUFPO0FBQUEsTUFDTCxrQkFBa0IsQ0FBQywwQkFBcUQ7QUFDdEUsWUFBSTtBQUNGLGNBQ0Usc0JBQXNCLFNBQVMsU0FBUyxlQUFlLGNBQ3ZELHlCQUF5QixTQUFTLHNCQUFzQixTQUFTLElBQUksR0FDckU7QUFFQTtBQUFBLFVBQ0Y7QUFFQSxnQkFBTSx3QkFBd0IsZUFBZSxzQkFBc0IsSUFBSSxzQkFBc0IsTUFBTTtBQUNuRyxjQUFJLHNCQUFzQixZQUFZLGtCQUFrQixxQkFBcUI7QUFFN0UsZ0NBQXNCLG9CQUFvQixRQUFRLElBQUksb0JBQW9CLE1BQU0sQ0FBQyxJQUFLO0FBQ3RGLGdCQUFNO0FBQUE7QUFBQSxhQUNILG9CQUFvQixVQUFV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
|