@checkdigit/eslint-plugin 6.6.0-PR.75-e357 → 6.6.0-PR.75-7c7f

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.
@@ -12323,19 +12323,8 @@
12323
12323
  ],
12324
12324
  "format": "esm"
12325
12325
  },
12326
- "src/library/ts-tree.ts": {
12327
- "bytes": 2883,
12328
- "imports": [
12329
- {
12330
- "path": "node_modules/@typescript-eslint/utils/dist/index.js",
12331
- "kind": "import-statement",
12332
- "original": "@typescript-eslint/utils"
12333
- }
12334
- ],
12335
- "format": "esm"
12336
- },
12337
12326
  "src/agent/fix-function-call-arguments.ts": {
12338
- "bytes": 5206,
12327
+ "bytes": 5924,
12339
12328
  "imports": [
12340
12329
  {
12341
12330
  "path": "node_modules/@typescript-eslint/utils/dist/index.js",
@@ -12356,11 +12345,6 @@
12356
12345
  "path": "src/get-documentation-url.ts",
12357
12346
  "kind": "import-statement",
12358
12347
  "original": "../get-documentation-url"
12359
- },
12360
- {
12361
- "path": "src/library/ts-tree.ts",
12362
- "kind": "import-statement",
12363
- "original": "../library/ts-tree"
12364
12348
  }
12365
12349
  ],
12366
12350
  "format": "esm"
@@ -12469,6 +12453,17 @@
12469
12453
  ],
12470
12454
  "format": "esm"
12471
12455
  },
12456
+ "src/library/ts-tree.ts": {
12457
+ "bytes": 2883,
12458
+ "imports": [
12459
+ {
12460
+ "path": "node_modules/@typescript-eslint/utils/dist/index.js",
12461
+ "kind": "import-statement",
12462
+ "original": "@typescript-eslint/utils"
12463
+ }
12464
+ ],
12465
+ "format": "esm"
12466
+ },
12472
12467
  "src/agent/no-full-response.ts": {
12473
12468
  "bytes": 2331,
12474
12469
  "imports": [
@@ -15747,11 +15742,8 @@
15747
15742
  "src/agent/fetch-then.ts": {
15748
15743
  "bytesInOutput": 12231
15749
15744
  },
15750
- "src/library/ts-tree.ts": {
15751
- "bytesInOutput": 2095
15752
- },
15753
15745
  "src/agent/fix-function-call-arguments.ts": {
15754
- "bytesInOutput": 4458
15746
+ "bytesInOutput": 5235
15755
15747
  },
15756
15748
  "src/invalid-json-stringify.ts": {
15757
15749
  "bytesInOutput": 2473
@@ -15765,6 +15757,9 @@
15765
15757
  "src/agent/no-fixture.ts": {
15766
15758
  "bytesInOutput": 16455
15767
15759
  },
15760
+ "src/library/ts-tree.ts": {
15761
+ "bytesInOutput": 2095
15762
+ },
15768
15763
  "src/agent/no-full-response.ts": {
15769
15764
  "bytesInOutput": 2006
15770
15765
  },
@@ -15826,7 +15821,7 @@
15826
15821
  "bytesInOutput": 3362
15827
15822
  }
15828
15823
  },
15829
- "bytes": 4370736
15824
+ "bytes": 4371841
15830
15825
  }
15831
15826
  }
15832
15827
  }
@@ -3,7 +3,6 @@ import { ESLintUtils, TSESTree } from "@typescript-eslint/utils";
3
3
  import { strict as assert } from "node:assert";
4
4
  import debug from "debug";
5
5
  import getDocumentationUrl from "../get-documentation-url.mjs";
6
- import { getParent } from "../library/ts-tree.mjs";
7
6
  var ruleId = "fix-function-call-arguments";
8
7
  var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
9
8
  var log = debug("eslint-plugin:fix-function-call-arguments");
@@ -28,50 +27,73 @@ var rule = createRule({
28
27
  const sourceCode = context.sourceCode;
29
28
  return {
30
29
  CallExpression(callExpression) {
31
- if (getParent(callExpression)?.type === TSESTree.AST_NODE_TYPES.MemberExpression) {
30
+ if (callExpression.callee.type === TSESTree.AST_NODE_TYPES.MemberExpression) {
32
31
  return;
33
32
  }
34
- log("===================================");
33
+ log("===== file name:", context.filename);
35
34
  log("callExpression:", sourceCode.getText(callExpression));
36
35
  try {
37
36
  const calleeTsNode = parserServices.esTreeNodeToTSNodeMap.get(callExpression.callee);
38
37
  const calleeType = typeChecker.getTypeAtLocation(calleeTsNode);
39
- const signature = calleeType.getCallSignatures()[0];
38
+ const signatures = calleeType.getCallSignatures();
39
+ if (
40
+ // ignore complex signatures with overloads
41
+ signatures.length > 1
42
+ ) {
43
+ return;
44
+ }
45
+ const signature = signatures[0];
40
46
  if (!signature || // ignore complex signatures
41
47
  signature.typeParameters !== void 0 && signature.typeParameters.length > 0) {
42
48
  return;
43
49
  }
44
50
  const signatureParameters = signature.getParameters();
45
- const expectedArgsCount = signatureParameters.length;
46
- const providedArgs = callExpression.arguments;
47
- const providedArgsCount = providedArgs.length;
48
- if (providedArgsCount === 0 || providedArgsCount === expectedArgsCount) {
51
+ const expectedParametersCount = signatureParameters.length;
52
+ const actualParameters = callExpression.arguments;
53
+ const actualParametersCount = actualParameters.length;
54
+ if (actualParametersCount === 0 || actualParametersCount === expectedParametersCount) {
49
55
  return;
50
56
  }
51
- const argsToKeep = [];
52
- if (expectedArgsCount > 0) {
53
- let parameterIndex = 0;
54
- for (const arg of providedArgs) {
55
- const currentExpectedArg = signatureParameters[parameterIndex];
56
- assert.ok(currentExpectedArg, "Expected argument not found.");
57
- const expectedType = typeChecker.getTypeOfSymbol(currentExpectedArg);
58
- const actualType = typeChecker.getTypeAtLocation(parserServices.esTreeNodeToTSNodeMap.get(arg));
59
- log("expected type:", currentExpectedArg.escapedName, typeChecker.typeToString(expectedType));
60
- log("actual type:", sourceCode.getText(arg), typeChecker.typeToString(actualType));
57
+ const parametersToKeep = [];
58
+ if (expectedParametersCount > 0) {
59
+ let expectedParameterIndex = 0;
60
+ for (const [actualParameterIndex, actualParameter] of actualParameters.entries()) {
61
+ if (expectedParameterIndex >= expectedParametersCount) {
62
+ parametersToKeep.push(actualParameter);
63
+ continue;
64
+ }
65
+ const expectedParameter = signatureParameters[expectedParameterIndex];
66
+ assert.ok(expectedParameter, "Expected parameter not found.");
67
+ const expectedType = typeChecker.getTypeOfSymbol(expectedParameter);
68
+ const actualType = typeChecker.getTypeAtLocation(
69
+ parserServices.esTreeNodeToTSNodeMap.get(actualParameter)
70
+ );
71
+ log(
72
+ "expected type: #",
73
+ expectedParameterIndex,
74
+ expectedParameter.escapedName,
75
+ typeChecker.typeToString(expectedType)
76
+ );
77
+ log(
78
+ "actual type: #",
79
+ actualParameterIndex,
80
+ sourceCode.getText(actualParameter),
81
+ typeChecker.typeToString(actualType)
82
+ );
61
83
  if (typeChecker.isTypeAssignableTo(actualType, expectedType) === true) {
62
- argsToKeep.push(arg);
63
- parameterIndex++;
84
+ parametersToKeep.push(actualParameter);
85
+ expectedParameterIndex++;
64
86
  log("matched");
65
87
  } else {
66
88
  log("not matched");
67
89
  }
68
90
  }
69
91
  }
70
- if (argsToKeep.length === providedArgsCount) {
92
+ if (parametersToKeep.length === actualParametersCount) {
71
93
  return;
72
94
  }
73
- const firstParameter = providedArgs[0];
74
- const lastParameter = providedArgs.at(-1);
95
+ const firstParameter = actualParameters[0];
96
+ const lastParameter = actualParameters.at(-1);
75
97
  assert.ok(firstParameter !== void 0 && lastParameter !== void 0);
76
98
  const tokenAfterParameters = sourceCode.getTokenAfter(lastParameter);
77
99
  context.report({
@@ -83,7 +105,7 @@ var rule = createRule({
83
105
  firstParameter.range[0],
84
106
  tokenAfterParameters?.value === "," ? tokenAfterParameters.range[1] : lastParameter.range[1]
85
107
  ],
86
- argsToKeep.map((arg) => sourceCode.getText(arg)).join(", ")
108
+ parametersToKeep.map((arg) => sourceCode.getText(arg)).join(", ")
87
109
  );
88
110
  }
89
111
  });
@@ -107,4 +129,4 @@ export {
107
129
  fix_function_call_arguments_default as default,
108
130
  ruleId
109
131
  };
110
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L2ZpeC1mdW5jdGlvbi1jYWxsLWFyZ3VtZW50cy50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxTQUFTLGFBQWEsZ0JBQWdCO0FBQ3RDLFNBQVMsVUFBVSxjQUFjO0FBQ2pDLE9BQU8sV0FBVztBQUNsQixPQUFPLHlCQUF5QjtBQUNoQyxTQUFTLGlCQUFpQjtBQUVuQixJQUFNLFNBQVM7QUFFdEIsSUFBTSxhQUFhLFlBQVksWUFBWSxDQUFDLFNBQVMsb0JBQW9CLElBQUksQ0FBQztBQUM5RSxJQUFNLE1BQU0sTUFBTSwyQ0FBMkM7QUFFN0QsSUFBTSxPQUFPLFdBQVc7QUFBQSxFQUN0QixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsTUFDSixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IscUNBQXFDO0FBQUEsTUFDckMsY0FBYztBQUFBLElBQ2hCO0FBQUEsSUFDQSxTQUFTO0FBQUEsSUFDVCxRQUFRLENBQUM7QUFBQSxFQUNYO0FBQUEsRUFDQSxnQkFBZ0IsQ0FBQztBQUFBLEVBQ2pCLE9BQU8sU0FBUztBQUNkLFVBQU0saUJBQWlCLFlBQVksa0JBQWtCLE9BQU87QUFDNUQsVUFBTSxjQUFjLGVBQWUsUUFBUSxlQUFlO0FBQzFELFVBQU0sYUFBYSxRQUFRO0FBRTNCLFdBQU87QUFBQSxNQUNMLGVBQWUsZ0JBQWdCO0FBRzdCLFlBQUksVUFBVSxjQUFjLEdBQUcsU0FBUyxTQUFTLGVBQWUsa0JBQWtCO0FBQ2hGO0FBQUEsUUFDRjtBQUVBLFlBQUkscUNBQXFDO0FBQ3pDLFlBQUksbUJBQW1CLFdBQVcsUUFBUSxjQUFjLENBQUM7QUFDekQsWUFBSTtBQUNGLGdCQUFNLGVBQWUsZUFBZSxzQkFBc0IsSUFBSSxlQUFlLE1BQU07QUFDbkYsZ0JBQU0sYUFBYSxZQUFZLGtCQUFrQixZQUFZO0FBQzdELGdCQUFNLFlBQVksV0FBVyxrQkFBa0Is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
132
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L2ZpeC1mdW5jdGlvbi1jYWxsLWFyZ3VtZW50cy50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxTQUFTLGFBQWEsZ0JBQWdCO0FBQ3RDLFNBQVMsVUFBVSxjQUFjO0FBQ2pDLE9BQU8sV0FBVztBQUNsQixPQUFPLHlCQUF5QjtBQUV6QixJQUFNLFNBQVM7QUFFdEIsSUFBTSxhQUFhLFlBQVksWUFBWSxDQUFDLFNBQVMsb0JBQW9CLElBQUksQ0FBQztBQUM5RSxJQUFNLE1BQU0sTUFBTSwyQ0FBMkM7QUFFN0QsSUFBTSxPQUFPLFdBQVc7QUFBQSxFQUN0QixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsTUFDSixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IscUNBQXFDO0FBQUEsTUFDckMsY0FBYztBQUFBLElBQ2hCO0FBQUEsSUFDQSxTQUFTO0FBQUEsSUFDVCxRQUFRLENBQUM7QUFBQSxFQUNYO0FBQUEsRUFDQSxnQkFBZ0IsQ0FBQztBQUFBLEVBQ2pCLE9BQU8sU0FBUztBQUNkLFVBQU0saUJBQWlCLFlBQVksa0JBQWtCLE9BQU87QUFDNUQsVUFBTSxjQUFjLGVBQWUsUUFBUSxlQUFlO0FBQzFELFVBQU0sYUFBYSxRQUFRO0FBRTNCLFdBQU87QUFBQSxNQUNMLGVBQWUsZ0JBQWdCO0FBRzdCLFlBQUksZUFBZSxPQUFPLFNBQVMsU0FBUyxlQUFlLGtCQUFrQjtBQUMzRTtBQUFBLFFBQ0Y7QUFFQSxZQUFJLG9CQUFvQixRQUFRLFFBQVE7QUFDeEMsWUFBSSxtQkFBbUIsV0FBVyxRQUFRLGNBQWMsQ0FBQztBQUN6RCxZQUFJO0FBQ0YsZ0JBQU0sZUFBZSxlQUFlLHNCQUFzQixJQUFJLGVBQWUsTUFBTTtBQUNuRixnQkFBTSxhQUFhLFlBQVksa0JBQWtCLFlBQVk7QUFFN0QsZ0JBQU0sYUFBYSxXQUFXLGtCQUFrQjtBQUNoRDtBQUFBO0FB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
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@checkdigit/eslint-plugin","version":"6.6.0-PR.75-e357","description":"Check Digit eslint plugins","keywords":["eslint","eslintplugin"],"homepage":"https://github.com/checkdigit/eslint-plugin#readme","bugs":{"url":"https://github.com/checkdigit/eslint-plugin/issues"},"repository":{"type":"git","url":"https://github.com/checkdigit/eslint-plugin"},"license":"MIT","author":"Check Digit, LLC","sideEffects":false,"type":"module","exports":{".":{"types":"./dist-types/index.d.ts","require":"./dist-cjs/index.cjs","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-cjs","dist-mjs","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-cjs/**/*.test.cjs","!dist-cjs/**/*.spec.cjs","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-cjs":"rimraf dist-cjs && npx builder --type=commonjs --sourceMap --entryPoint=index.ts --outDir=dist-cjs --outFile=index.cjs --external=espree && echo \"module.exports = module.exports.default;\" >> dist-cjs/index.cjs","build:dist-mjs":"rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs","build:dist-types":"rimraf dist-types && npx builder --type=types --outDir=dist-types","ci:compile":"tsc --noEmit","ci:coverage":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true","ci:lint":"npm run lint","ci:style":"npm run prettier","ci:test":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","lint":"eslint --max-warnings 0 --ignore-path .gitignore .","lint:fix":"eslint --ignore-path .gitignore . --fix","prepublishOnly":"npm run build:dist-types && npm run build:dist-cjs && npm run build:dist-mjs","prettier":"prettier --ignore-path .gitignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"},"prettier":"@checkdigit/prettier-config","jest":{"preset":"@checkdigit/jest-config"},"dependencies":{"@typescript-eslint/type-utils":"7.18.0","@typescript-eslint/utils":"7.18.0","debug":"^4.3.7","ts-api-utils":"^1.3.0"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^5.5.0","@checkdigit/typescript-config":"6.0.0","@types/debug":"^4.1.12","@types/eslint":"8.56.10","@typescript-eslint/eslint-plugin":"7.18.0","@typescript-eslint/parser":"7.18.0","@typescript-eslint/rule-tester":"7.18.0","eslint-config-prettier":"^9.1.0","eslint-plugin-eslint-plugin":"^6.2.0","eslint-plugin-import":"^2.29.1","eslint-plugin-no-only-tests":"^3.1.0","eslint-plugin-no-secrets":"^1.0.2","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"0.24.0","http-status-codes":"^2.3.0"},"peerDependencies":{"eslint":">=8 <9"},"engines":{"node":">=20.14"}}
1
+ {"name":"@checkdigit/eslint-plugin","version":"6.6.0-PR.75-7c7f","description":"Check Digit eslint plugins","keywords":["eslint","eslintplugin"],"homepage":"https://github.com/checkdigit/eslint-plugin#readme","bugs":{"url":"https://github.com/checkdigit/eslint-plugin/issues"},"repository":{"type":"git","url":"https://github.com/checkdigit/eslint-plugin"},"license":"MIT","author":"Check Digit, LLC","sideEffects":false,"type":"module","exports":{".":{"types":"./dist-types/index.d.ts","require":"./dist-cjs/index.cjs","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-cjs","dist-mjs","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-cjs/**/*.test.cjs","!dist-cjs/**/*.spec.cjs","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-cjs":"rimraf dist-cjs && npx builder --type=commonjs --sourceMap --entryPoint=index.ts --outDir=dist-cjs --outFile=index.cjs --external=espree && echo \"module.exports = module.exports.default;\" >> dist-cjs/index.cjs","build:dist-mjs":"rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs","build:dist-types":"rimraf dist-types && npx builder --type=types --outDir=dist-types","ci:compile":"tsc --noEmit","ci:coverage":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true","ci:lint":"npm run lint","ci:style":"npm run prettier","ci:test":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","lint":"eslint --max-warnings 0 --ignore-path .gitignore .","lint:fix":"eslint --ignore-path .gitignore . --fix","prepublishOnly":"npm run build:dist-types && npm run build:dist-cjs && npm run build:dist-mjs","prettier":"prettier --ignore-path .gitignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"},"prettier":"@checkdigit/prettier-config","jest":{"preset":"@checkdigit/jest-config"},"dependencies":{"@typescript-eslint/type-utils":"7.18.0","@typescript-eslint/utils":"7.18.0","debug":"^4.3.7","ts-api-utils":"^1.3.0"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^5.5.0","@checkdigit/typescript-config":"6.0.0","@types/debug":"^4.1.12","@types/eslint":"8.56.10","@typescript-eslint/eslint-plugin":"7.18.0","@typescript-eslint/parser":"7.18.0","@typescript-eslint/rule-tester":"7.18.0","eslint-config-prettier":"^9.1.0","eslint-plugin-eslint-plugin":"^6.2.0","eslint-plugin-import":"^2.29.1","eslint-plugin-no-only-tests":"^3.1.0","eslint-plugin-no-secrets":"^1.0.2","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"0.24.0","http-status-codes":"^2.3.0"},"peerDependencies":{"eslint":">=8 <9"},"engines":{"node":">=20.14"}}
@@ -10,7 +10,6 @@ import { ESLintUtils, TSESTree } from '@typescript-eslint/utils';
10
10
  import { strict as assert } from 'node:assert';
11
11
  import debug from 'debug';
12
12
  import getDocumentationUrl from '../get-documentation-url';
13
- import { getParent } from '../library/ts-tree';
14
13
 
15
14
  export const ruleId = 'fix-function-call-arguments';
16
15
 
@@ -41,16 +40,25 @@ const rule = createRule({
41
40
  CallExpression(callExpression) {
42
41
  // ignore calls like `foo.bar()` which are likely to be 3rd party module calls
43
42
  // we only focus on calls against local functions or functions imported from the same module
44
- if (getParent(callExpression)?.type === TSESTree.AST_NODE_TYPES.MemberExpression) {
43
+ if (callExpression.callee.type === TSESTree.AST_NODE_TYPES.MemberExpression) {
45
44
  return;
46
45
  }
47
46
 
48
- log('===================================');
47
+ log('===== file name:', context.filename);
49
48
  log('callExpression:', sourceCode.getText(callExpression));
50
49
  try {
51
50
  const calleeTsNode = parserServices.esTreeNodeToTSNodeMap.get(callExpression.callee);
52
51
  const calleeType = typeChecker.getTypeAtLocation(calleeTsNode);
53
- const signature = calleeType.getCallSignatures()[0];
52
+
53
+ const signatures = calleeType.getCallSignatures();
54
+ if (
55
+ // ignore complex signatures with overloads
56
+ signatures.length > 1
57
+ ) {
58
+ return;
59
+ }
60
+
61
+ const signature = signatures[0];
54
62
  if (
55
63
  !signature ||
56
64
  // ignore complex signatures
@@ -60,32 +68,49 @@ const rule = createRule({
60
68
  }
61
69
 
62
70
  const signatureParameters = signature.getParameters();
63
- const expectedArgsCount = signatureParameters.length; /*?*/
64
- const providedArgs = callExpression.arguments; /*?*/
65
- const providedArgsCount = providedArgs.length; /*?*/
66
- if (providedArgsCount === 0 || providedArgsCount === expectedArgsCount) {
71
+ const expectedParametersCount = signatureParameters.length;
72
+ const actualParameters = callExpression.arguments;
73
+ const actualParametersCount = actualParameters.length;
74
+ if (actualParametersCount === 0 || actualParametersCount === expectedParametersCount) {
67
75
  return;
68
76
  }
69
- const argsToKeep: TSESTree.CallExpressionArgument[] = [];
77
+ const parametersToKeep: TSESTree.CallExpressionArgument[] = [];
70
78
 
71
- if (expectedArgsCount > 0) {
72
- let parameterIndex = 0;
73
- for (const arg of providedArgs) {
74
- const currentExpectedArg = signatureParameters[parameterIndex];
75
- assert.ok(currentExpectedArg, 'Expected argument not found.');
79
+ if (expectedParametersCount > 0) {
80
+ let expectedParameterIndex = 0;
81
+ for (const [actualParameterIndex, actualParameter] of actualParameters.entries()) {
82
+ if (expectedParameterIndex >= expectedParametersCount) {
83
+ parametersToKeep.push(actualParameter);
84
+ continue;
85
+ }
86
+
87
+ const expectedParameter = signatureParameters[expectedParameterIndex];
88
+ assert.ok(expectedParameter, 'Expected parameter not found.');
76
89
 
77
- const expectedType = typeChecker.getTypeOfSymbol(currentExpectedArg);
78
- const actualType = typeChecker.getTypeAtLocation(parserServices.esTreeNodeToTSNodeMap.get(arg));
90
+ const expectedType = typeChecker.getTypeOfSymbol(expectedParameter);
91
+ const actualType = typeChecker.getTypeAtLocation(
92
+ parserServices.esTreeNodeToTSNodeMap.get(actualParameter),
93
+ );
79
94
 
80
95
  // eslint-disable-next-line no-console
81
- log('expected type:', currentExpectedArg.escapedName, typeChecker.typeToString(expectedType));
96
+ log(
97
+ 'expected type: #',
98
+ expectedParameterIndex,
99
+ expectedParameter.escapedName,
100
+ typeChecker.typeToString(expectedType),
101
+ );
82
102
  // eslint-disable-next-line no-console
83
- log('actual type:', sourceCode.getText(arg), typeChecker.typeToString(actualType));
103
+ log(
104
+ 'actual type: #',
105
+ actualParameterIndex,
106
+ sourceCode.getText(actualParameter),
107
+ typeChecker.typeToString(actualType),
108
+ );
84
109
  // @ts-expect-error: internal API
85
110
  // eslint-disable-next-line @typescript-eslint/no-unsafe-call
86
111
  if (typeChecker.isTypeAssignableTo(actualType, expectedType) === true) {
87
- argsToKeep.push(arg);
88
- parameterIndex++;
112
+ parametersToKeep.push(actualParameter);
113
+ expectedParameterIndex++;
89
114
  log('matched');
90
115
  } else {
91
116
  log('not matched');
@@ -93,12 +118,12 @@ const rule = createRule({
93
118
  }
94
119
  }
95
120
 
96
- if (argsToKeep.length === providedArgsCount) {
121
+ if (parametersToKeep.length === actualParametersCount) {
97
122
  return;
98
123
  }
99
124
 
100
- const firstParameter = providedArgs[0];
101
- const lastParameter = providedArgs.at(-1);
125
+ const firstParameter = actualParameters[0];
126
+ const lastParameter = actualParameters.at(-1);
102
127
  assert.ok(firstParameter !== undefined && lastParameter !== undefined);
103
128
  const tokenAfterParameters = sourceCode.getTokenAfter(lastParameter);
104
129
 
@@ -111,7 +136,7 @@ const rule = createRule({
111
136
  firstParameter.range[0],
112
137
  tokenAfterParameters?.value === ',' ? tokenAfterParameters.range[1] : lastParameter.range[1],
113
138
  ],
114
- argsToKeep.map((arg) => sourceCode.getText(arg)).join(', '),
139
+ parametersToKeep.map((arg) => sourceCode.getText(arg)).join(', '),
115
140
  );
116
141
  },
117
142
  });