@checkdigit/eslint-plugin 7.6.0-PR.75-4751 → 7.6.0-PR.97-b19c

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 (77) hide show
  1. package/dist-mjs/index.mjs +8 -156
  2. package/dist-mjs/no-status-code-assert.mjs +63 -0
  3. package/dist-mjs/require-resolve-full-response.mjs +5 -5
  4. package/dist-types/no-status-code-assert.d.ts +5 -0
  5. package/package.json +1 -1
  6. package/src/index.ts +4 -152
  7. package/src/no-status-code-assert.ts +85 -0
  8. package/src/require-resolve-full-response.ts +4 -4
  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 -76
  17. package/dist-mjs/agent/fetch-then.mjs +0 -205
  18. package/dist-mjs/agent/fetch.mjs +0 -48
  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 -383
  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-supertest.mjs +0 -332
  26. package/dist-mjs/agent/no-unused-function-argument.mjs +0 -79
  27. package/dist-mjs/agent/no-unused-imports.mjs +0 -81
  28. package/dist-mjs/agent/no-unused-service-variable.mjs +0 -74
  29. package/dist-mjs/agent/response-reference.mjs +0 -75
  30. package/dist-mjs/agent/supertest-then.mjs +0 -170
  31. package/dist-mjs/agent/url.mjs +0 -32
  32. package/dist-types/agent/add-assert-import.d.ts +0 -4
  33. package/dist-types/agent/add-base-path-const.d.ts +0 -4
  34. package/dist-types/agent/add-base-path-import.d.ts +0 -4
  35. package/dist-types/agent/add-url-domain.d.ts +0 -4
  36. package/dist-types/agent/agent-test-wiring.d.ts +0 -4
  37. package/dist-types/agent/fetch-response-body-json.d.ts +0 -4
  38. package/dist-types/agent/fetch-response-header-getter.d.ts +0 -4
  39. package/dist-types/agent/fetch-response-status.d.ts +0 -4
  40. package/dist-types/agent/fetch-then.d.ts +0 -4
  41. package/dist-types/agent/fetch.d.ts +0 -8
  42. package/dist-types/agent/file.d.ts +0 -7
  43. package/dist-types/agent/fix-function-call-arguments.d.ts +0 -9
  44. package/dist-types/agent/no-fixture.d.ts +0 -4
  45. package/dist-types/agent/no-mapped-response.d.ts +0 -4
  46. package/dist-types/agent/no-service-wrapper.d.ts +0 -4
  47. package/dist-types/agent/no-status-code.d.ts +0 -4
  48. package/dist-types/agent/no-supertest.d.ts +0 -4
  49. package/dist-types/agent/no-unused-function-argument.d.ts +0 -4
  50. package/dist-types/agent/no-unused-imports.d.ts +0 -4
  51. package/dist-types/agent/no-unused-service-variable.d.ts +0 -4
  52. package/dist-types/agent/response-reference.d.ts +0 -16
  53. package/dist-types/agent/supertest-then.d.ts +0 -4
  54. package/dist-types/agent/url.d.ts +0 -4
  55. package/src/agent/add-assert-import.ts +0 -74
  56. package/src/agent/add-base-path-const.ts +0 -81
  57. package/src/agent/add-base-path-import.ts +0 -69
  58. package/src/agent/add-url-domain.ts +0 -76
  59. package/src/agent/agent-test-wiring.ts +0 -273
  60. package/src/agent/fetch-response-body-json.ts +0 -194
  61. package/src/agent/fetch-response-header-getter.ts +0 -148
  62. package/src/agent/fetch-response-status.ts +0 -100
  63. package/src/agent/fetch-then.ts +0 -358
  64. package/src/agent/fetch.ts +0 -69
  65. package/src/agent/file.ts +0 -42
  66. package/src/agent/fix-function-call-arguments.ts +0 -200
  67. package/src/agent/no-fixture.ts +0 -581
  68. package/src/agent/no-mapped-response.ts +0 -84
  69. package/src/agent/no-service-wrapper.ts +0 -241
  70. package/src/agent/no-status-code.ts +0 -69
  71. package/src/agent/no-supertest.ts +0 -517
  72. package/src/agent/no-unused-function-argument.ts +0 -98
  73. package/src/agent/no-unused-imports.ts +0 -103
  74. package/src/agent/no-unused-service-variable.ts +0 -93
  75. package/src/agent/response-reference.ts +0 -153
  76. package/src/agent/supertest-then.ts +0 -230
  77. package/src/agent/url.ts +0 -32
package/src/agent/file.ts DELETED
@@ -1,42 +0,0 @@
1
- // agent/file.ts
2
-
3
- import fs from 'node:fs';
4
- import path from 'node:path';
5
-
6
- export function isApiIndexFile(filename: string): boolean {
7
- return /.*\/src\/api\/v\d+\/index.ts/u.test(filename);
8
- }
9
-
10
- export function getProjectRootFolder(indexFilename: string): string {
11
- return indexFilename.substring(0, indexFilename.lastIndexOf('/src/'));
12
- }
13
-
14
- export function getSwaggerPathByIndexFile(indexFilename: string): string {
15
- return indexFilename.replace(/index\.ts$/u, 'swagger.yml');
16
- }
17
-
18
- export function loadSwagger(filename: string): string {
19
- return fs.readFileSync(filename, 'utf8');
20
- }
21
-
22
- export function loadPackageJson(projectRoot: string): string {
23
- return fs.readFileSync(`${projectRoot}/package.json`, 'utf8');
24
- }
25
-
26
- export function getApiFolder(folder: string): string | undefined {
27
- if (/^\/?(?<absolutePath>(?:[^/]+\/)*)src\/api\/v\d+$/u.test(folder)) {
28
- return folder;
29
- }
30
- const upperFolder = folder.substring(0, folder.lastIndexOf('/'));
31
- return upperFolder.trim() === '' ? undefined : getApiFolder(upperFolder);
32
- }
33
-
34
- export function getApiIndexPathByFilename(filename: string): string | undefined {
35
- const apiFolder = getApiFolder(filename);
36
- if (apiFolder === undefined) {
37
- return undefined;
38
- }
39
-
40
- const relativePath = path.relative(path.dirname(filename), `${apiFolder}/index`);
41
- return relativePath.startsWith('../') ? relativePath : `./${relativePath}`;
42
- }
@@ -1,200 +0,0 @@
1
- // agent/fix-function-call-arguments.ts
2
-
3
- /*
4
- * Copyright (c) 2021-2024 Check Digit, LLC
5
- *
6
- * This code is licensed under the MIT license (see LICENSE.txt for details).
7
- */
8
-
9
- import { strict as assert } from 'node:assert';
10
- import { ESLintUtils, TSESTree } from '@typescript-eslint/utils';
11
- import debug from 'debug';
12
- import getDocumentationUrl from '../get-documentation-url';
13
-
14
- export const ruleId = 'fix-function-call-arguments';
15
-
16
- export interface FixFunctionCallArgumentsRuleOptions {
17
- typesToCheck: string[];
18
- }
19
- const DEFAULT_OPTIONS = {
20
- typesToCheck: [
21
- 'Configuration<ResolvedServices>',
22
- 'Fixture<ResolvedServices>',
23
- 'InboundContext',
24
- '{ get: () => string; }',
25
- 'Api',
26
- ],
27
- };
28
-
29
- const createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
30
- const log = debug('eslint-plugin:fix-function-call-arguments');
31
-
32
- const rule: ESLintUtils.RuleModule<
33
- 'removeIncompatibleFunctionArguments' | 'unknownError',
34
- [FixFunctionCallArgumentsRuleOptions]
35
- > = createRule({
36
- name: ruleId,
37
- meta: {
38
- type: 'suggestion',
39
- docs: {
40
- description: 'Remove incompatible function arguments.',
41
- },
42
- messages: {
43
- removeIncompatibleFunctionArguments: 'Removing incompatible function arguments.',
44
- unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.',
45
- },
46
- fixable: 'code',
47
- schema: [
48
- {
49
- type: 'object',
50
- properties: {
51
- typesToCheck: {
52
- description: 'Text representation of the types of which the function call parameters will be examine',
53
- type: 'array',
54
- items: {
55
- type: 'string',
56
- },
57
- },
58
- },
59
- additionalProperties: false,
60
- },
61
- ],
62
- },
63
- defaultOptions: [DEFAULT_OPTIONS],
64
- create(context) {
65
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
66
- const { typesToCheck } = context.options[0] ?? DEFAULT_OPTIONS;
67
- const parserServices = ESLintUtils.getParserServices(context);
68
- const typeChecker = parserServices.program.getTypeChecker();
69
- const sourceCode = context.sourceCode;
70
-
71
- return {
72
- CallExpression(callExpression) {
73
- // ignore calls like `foo.bar()` which are likely to be 3rd party module calls
74
- // we only focus on calls against local functions or functions imported from the same module
75
- // if (callExpression.callee.type === TSESTree.AST_NODE_TYPES.MemberExpression) {
76
- // return;
77
- // }
78
-
79
- log('===== file name:', context.filename);
80
- log('callExpression:', sourceCode.getText(callExpression));
81
-
82
- try {
83
- const actualParameters = callExpression.arguments;
84
- if (
85
- !actualParameters.some((actualParameter) => {
86
- const actualType = typeChecker.getTypeAtLocation(
87
- parserServices.esTreeNodeToTSNodeMap.get(actualParameter),
88
- );
89
- const actualTypeString = typeChecker.typeToString(actualType);
90
- return typesToCheck.includes(actualTypeString) || actualTypeString.endsWith('RequestType');
91
- })
92
- ) {
93
- return;
94
- }
95
-
96
- const calleeTsNode = parserServices.esTreeNodeToTSNodeMap.get(callExpression.callee);
97
- const calleeType = typeChecker.getTypeAtLocation(calleeTsNode);
98
-
99
- const signatures = calleeType.getCallSignatures();
100
- if (signatures.length > 1) {
101
- // ignore complex signatures with overloads
102
- return;
103
- }
104
-
105
- const signature = signatures[0];
106
- assert(signature);
107
- // if (
108
- // signature === undefined ||
109
- // (signature.typeParameters !== undefined && signature.typeParameters.length > 0)
110
- // ) {
111
- // // ignore complex signatures with type parameters
112
- // return;
113
- // }
114
-
115
- log('signature:', signature.getDeclaration().getText());
116
- const expectedParameters = signature.getParameters();
117
- log(
118
- 'expected parameters:',
119
- expectedParameters.map((expectedParameter) =>
120
- typeChecker.typeToString(typeChecker.getTypeOfSymbol(expectedParameter)),
121
- ),
122
- );
123
- const expectedParametersCount = expectedParameters.length;
124
- const actualParametersCount = actualParameters.length;
125
- if (actualParametersCount === 0) {
126
- return;
127
- }
128
-
129
- const parametersToKeep: TSESTree.CallExpressionArgument[] = [];
130
- let expectedParameterIndex = 0;
131
- for (const [actualParameterIndex, actualParameter] of actualParameters.entries()) {
132
- if (expectedParameterIndex >= expectedParametersCount) {
133
- break;
134
- }
135
-
136
- const expectedParameter = expectedParameters[expectedParameterIndex];
137
- assert.ok(expectedParameter, 'Expected parameter not found.');
138
-
139
- const expectedType = typeChecker.getTypeOfSymbol(expectedParameter);
140
- const actualType = typeChecker.getTypeAtLocation(parserServices.esTreeNodeToTSNodeMap.get(actualParameter));
141
- const actualTypeString = typeChecker.typeToString(actualType);
142
- log(
143
- 'expected type: #',
144
- expectedParameterIndex,
145
- expectedParameter.escapedName,
146
- typeChecker.typeToString(expectedType),
147
- );
148
- log('actual type: #', actualParameterIndex, sourceCode.getText(actualParameter), actualTypeString);
149
-
150
- if (
151
- (typesToCheck.includes(actualTypeString) || actualTypeString.endsWith('RequestType')) &&
152
- !typeChecker.isTypeAssignableTo(actualType, expectedType)
153
- ) {
154
- log('removing un-matched parameter', sourceCode.getText(actualParameter));
155
- continue;
156
- }
157
- parametersToKeep.push(actualParameter);
158
- expectedParameterIndex++;
159
- }
160
-
161
- if (parametersToKeep.length === actualParametersCount) {
162
- return;
163
- }
164
-
165
- const firstParameter = actualParameters[0];
166
- const lastParameter = actualParameters.at(-1);
167
- assert.ok(firstParameter !== undefined && lastParameter !== undefined);
168
- const tokenAfterParameters = sourceCode.getTokenAfter(lastParameter);
169
-
170
- context.report({
171
- node: callExpression,
172
- messageId: 'removeIncompatibleFunctionArguments',
173
- fix(fixer) {
174
- return fixer.replaceTextRange(
175
- [
176
- firstParameter.range[0],
177
- tokenAfterParameters?.value === ',' ? tokenAfterParameters.range[1] : lastParameter.range[1],
178
- ],
179
- parametersToKeep.map((arg) => sourceCode.getText(arg)).join(', '),
180
- );
181
- },
182
- });
183
- } catch (error) {
184
- // eslint-disable-next-line no-console
185
- console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
186
- context.report({
187
- node: callExpression,
188
- messageId: 'unknownError',
189
- data: {
190
- fileName: context.filename,
191
- error: error instanceof Error ? error.toString() : JSON.stringify(error),
192
- },
193
- });
194
- }
195
- },
196
- };
197
- },
198
- });
199
-
200
- export default rule;