From d12ee298603b393c4990e743f11a1783d06490ae Mon Sep 17 00:00:00 2001 From: electrohyun Date: Fri, 24 Jul 2026 21:58:48 +0900 Subject: [PATCH 1/2] refactor(eslint-plugin-query): remove unused ast-utils helpers Remove five unused helpers from the ASTUtils object in ast-utils.ts: getNestedIdentifiers, getNestedReturnStatements, getClosestVariableDeclarator, mapKeyNodeToText and mapKeyNodeToBaseText. None are referenced by any rule or other module, and ASTUtils is not part of the package's public API (it is not exported from index.ts). knip does not flag them because ASTUtils is exported as a single object, so member-level dead code slips past it. All 1709 tests pass and ast-utils.ts line coverage rises from 41% to 95%. --- .../src/utils/ast-utils.ts | 194 ------------------ 1 file changed, 194 deletions(-) diff --git a/packages/eslint-plugin-query/src/utils/ast-utils.ts b/packages/eslint-plugin-query/src/utils/ast-utils.ts index b73825432e..606e58e2b5 100644 --- a/packages/eslint-plugin-query/src/utils/ast-utils.ts +++ b/packages/eslint-plugin-query/src/utils/ast-utils.ts @@ -46,91 +46,6 @@ export const ASTUtils = { ASTUtils.isPropertyWithIdentifierKey(x, key), ) }, - getNestedIdentifiers(node: TSESTree.Node): Array { - const identifiers: Array = [] - - if (ASTUtils.isIdentifier(node)) { - identifiers.push(node) - } - - if ('arguments' in node) { - node.arguments.forEach((x) => { - identifiers.push(...ASTUtils.getNestedIdentifiers(x)) - }) - } - - if ('elements' in node) { - node.elements.forEach((x) => { - if (x !== null) { - identifiers.push(...ASTUtils.getNestedIdentifiers(x)) - } - }) - } - - if ('properties' in node) { - node.properties.forEach((x) => { - identifiers.push(...ASTUtils.getNestedIdentifiers(x)) - }) - } - - if ('expressions' in node) { - node.expressions.forEach((x) => { - identifiers.push(...ASTUtils.getNestedIdentifiers(x)) - }) - } - - if ('left' in node) { - identifiers.push(...ASTUtils.getNestedIdentifiers(node.left)) - } - - if ('right' in node) { - identifiers.push(...ASTUtils.getNestedIdentifiers(node.right)) - } - - if (node.type === AST_NODE_TYPES.Property) { - identifiers.push(...ASTUtils.getNestedIdentifiers(node.value)) - } - - if (node.type === AST_NODE_TYPES.SpreadElement) { - identifiers.push(...ASTUtils.getNestedIdentifiers(node.argument)) - } - - if (node.type === AST_NODE_TYPES.MemberExpression) { - identifiers.push(...ASTUtils.getNestedIdentifiers(node.object)) - } - - if (node.type === AST_NODE_TYPES.UnaryExpression) { - identifiers.push(...ASTUtils.getNestedIdentifiers(node.argument)) - } - - if (node.type === AST_NODE_TYPES.ChainExpression) { - identifiers.push(...ASTUtils.getNestedIdentifiers(node.expression)) - } - - if (node.type === AST_NODE_TYPES.TSNonNullExpression) { - identifiers.push(...ASTUtils.getNestedIdentifiers(node.expression)) - } - - if (node.type === AST_NODE_TYPES.ArrowFunctionExpression) { - identifiers.push(...ASTUtils.getNestedIdentifiers(node.body)) - } - - if (node.type === AST_NODE_TYPES.FunctionExpression) { - identifiers.push(...ASTUtils.getNestedIdentifiers(node.body)) - } - - if (node.type === AST_NODE_TYPES.BlockStatement) { - identifiers.push( - ...node.body.map((body) => ASTUtils.getNestedIdentifiers(body)).flat(), - ) - } - - if (node.type === AST_NODE_TYPES.ReturnStatement && node.argument) { - identifiers.push(...ASTUtils.getNestedIdentifiers(node.argument)) - } - - return identifiers - }, traverseUpOnly( identifier: TSESTree.Node, allowedNodeTypes: Array, @@ -233,27 +148,6 @@ export const ASTUtils = { return uniqueBy(externalRefs, (x) => x.text).map((x) => x.variable) }, - mapKeyNodeToText( - node: TSESTree.Node, - sourceCode: Readonly, - ) { - return sourceCode.getText( - ASTUtils.traverseUpOnly(node, [ - AST_NODE_TYPES.MemberExpression, - AST_NODE_TYPES.TSNonNullExpression, - AST_NODE_TYPES.Identifier, - ]), - ) - }, - mapKeyNodeToBaseText( - node: TSESTree.Node, - sourceCode: Readonly, - ) { - return ASTUtils.mapKeyNodeToText(node, sourceCode).replace( - /(?:\?(\.)|!)/g, - '$1', - ) - }, isValidReactComponentOrHookName( identifier: TSESTree.Identifier | null | undefined, ) { @@ -316,92 +210,4 @@ export const ASTUtils = { return resolvedNode.init }, - getClosestVariableDeclarator(node: TSESTree.Node) { - let currentNode: TSESTree.Node | undefined = node - - while (currentNode.type !== AST_NODE_TYPES.Program) { - if (currentNode.type === AST_NODE_TYPES.VariableDeclarator) { - return currentNode - } - - currentNode = currentNode.parent - } - - return undefined - }, - getNestedReturnStatements( - node: TSESTree.Node, - ): Array { - const returnStatements: Array = [] - - if (node.type === AST_NODE_TYPES.ReturnStatement) { - returnStatements.push(node) - } - - if ('body' in node && node.body !== undefined && node.body !== null) { - Array.isArray(node.body) - ? node.body.forEach((x) => { - returnStatements.push(...ASTUtils.getNestedReturnStatements(x)) - }) - : returnStatements.push( - ...ASTUtils.getNestedReturnStatements(node.body), - ) - } - - if ('consequent' in node) { - Array.isArray(node.consequent) - ? node.consequent.forEach((x) => { - returnStatements.push(...ASTUtils.getNestedReturnStatements(x)) - }) - : returnStatements.push( - ...ASTUtils.getNestedReturnStatements(node.consequent), - ) - } - - if ('alternate' in node && node.alternate !== null) { - Array.isArray(node.alternate) - ? node.alternate.forEach((x) => { - returnStatements.push(...ASTUtils.getNestedReturnStatements(x)) - }) - : returnStatements.push( - ...ASTUtils.getNestedReturnStatements(node.alternate), - ) - } - - if ('cases' in node) { - node.cases.forEach((x) => { - returnStatements.push(...ASTUtils.getNestedReturnStatements(x)) - }) - } - - if ('block' in node) { - returnStatements.push(...ASTUtils.getNestedReturnStatements(node.block)) - } - - if ('handler' in node && node.handler !== null) { - returnStatements.push(...ASTUtils.getNestedReturnStatements(node.handler)) - } - - if ('finalizer' in node && node.finalizer !== null) { - returnStatements.push( - ...ASTUtils.getNestedReturnStatements(node.finalizer), - ) - } - - if ( - 'expression' in node && - node.expression !== true && - node.expression !== false - ) { - returnStatements.push( - ...ASTUtils.getNestedReturnStatements(node.expression), - ) - } - - if ('test' in node && node.test !== null) { - returnStatements.push(...ASTUtils.getNestedReturnStatements(node.test)) - } - - return returnStatements - }, } From 2739709ee0e049d43d64f650de6fc8bc280dc0a1 Mon Sep 17 00:00:00 2001 From: electrohyun Date: Fri, 24 Jul 2026 22:29:46 +0900 Subject: [PATCH 2/2] chore: add changeset for unused ast-utils helper removal --- .changeset/remove-unused-ast-utils-helpers.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/remove-unused-ast-utils-helpers.md diff --git a/.changeset/remove-unused-ast-utils-helpers.md b/.changeset/remove-unused-ast-utils-helpers.md new file mode 100644 index 0000000000..bb71e930c3 --- /dev/null +++ b/.changeset/remove-unused-ast-utils-helpers.md @@ -0,0 +1,5 @@ +--- +"@tanstack/eslint-plugin-query": patch +--- + +Remove unused helper functions from the internal `ASTUtils` object (`getNestedIdentifiers`, `getNestedReturnStatements`, `getClosestVariableDeclarator`, `mapKeyNodeToText`, and `mapKeyNodeToBaseText`). They were not referenced by any rule and are not part of the public API.