UNPKG

@openapi-qraft/react

Version:

OpenAPI client for React, providing type-safe requests and dynamic TanStack Query React Hooks via a modular, Proxy-based architecture.

113 lines (101 loc) 3.23 kB
import type { API, ASTPath, FileInfo, Options } from 'jscodeshift'; import { CallExpression, MemberExpression } from 'jscodeshift'; export default function transformer( file: FileInfo, api: API, options: Options ) { const j = api.jscodeshift; const root = j(file.source); const methodNames = [ 'fetchQuery', 'fetchInfiniteQuery', 'prefetchQuery', 'prefetchInfiniteQuery', 'getQueryData', 'getQueriesData', 'setQueryData', 'getQueryState', 'setQueriesData', 'invalidateQueries', 'refetchQueries', 'cancelQueries', 'removeQueries', 'resetQueries', 'isFetching', 'isMutating', 'setInfiniteQueryData', 'getInfiniteQueryData', 'getInfiniteQueryState', ]; const hooksWithTwoArgs = [ 'useSuspenseQueries', 'useIsFetching', 'useMutationState', 'useIsMutating', ]; const hooksWithThreeArgs = [ 'useQuery', 'useMutation', 'useInfiniteQuery', 'useQueries', 'useSuspenseQuery', 'useSuspenseInfiniteQuery', ]; const apiClientVariableNames = getAPIClientVariableNames(options); return root .find(j.CallExpression) .forEach((path: ASTPath<CallExpression>) => { const callee = path.node.callee; if (callee.type === 'MemberExpression') { const apiClientCallMethodName = getAPIClientCallMethodName( callee, apiClientVariableNames ); if (apiClientCallMethodName) { if (methodNames.includes(apiClientCallMethodName)) { // Remove the last argument `queryClient` path.node.arguments = path.node.arguments.slice(0, -1); } else if ( hooksWithTwoArgs.includes(apiClientCallMethodName) && path.node.arguments.length === 2 ) { // Remove the second argument for specific hooks if there are exactly two arguments path.node.arguments = path.node.arguments.slice(0, 1); } else if ( hooksWithThreeArgs.includes(apiClientCallMethodName) && path.node.arguments.length === 3 ) { // Remove the third argument for specific hooks if there are exactly three arguments path.node.arguments = path.node.arguments.slice(0, 2); } } } }) .toSource(); } function getAPIClientCallMethodName( node: MemberExpression, apiClientNames: string[] ): string | undefined { if ( node.object.type === 'MemberExpression' && node.object.object.type === 'MemberExpression' && node.object.object.object.type === 'Identifier' && node.object.object.property.type === 'Identifier' && node.object.property.type === 'Identifier' && node.property.type === 'Identifier' ) { const apiClientVariableName = node.object.object.object.name; if (apiClientNames.includes(apiClientVariableName)) return node.property.name; } } function getAPIClientVariableNames(options: Options) { const apiClientVariableNameOption = options['api-client-variable-name']; if (!apiClientVariableNameOption) return ['api', 'qraft']; return String(apiClientVariableNameOption) .split(',') .map((name) => name.trim()) .filter(Boolean); }