Skip to content
Reference

Options

Configuration options for @kubb/plugin-react-query.

Pass these options to pluginReactQuery(). Shared options link to Shared plugin options, which documents their behavior once.

Options overview

OptionPurposeDefault
outputWhere the generated hooks are written and exported.{ path: 'hooks', barrel: { type: 'named' } }
↳ output.pathChoose the output folder or file.'hooks'
↳ output.modeWrite a single file or a directory of files.Inferred from output.path
↳ output.barrelConfigure barrel exports.{ type: 'named' }
↳ output.bannerAdd content before generated code.None
↳ output.footerAdd content after generated code.None
groupSplit output into per-tag or per-path folders.None
↳ group.typeGroup operations by tag or URL path.Required with group
↳ group.nameCustomize output group names.camelCased tag or raw path segment
clientWhich registered client plugin the hooks call.Auto-detected
infiniteGenerate useInfiniteQuery hooks for pagination.false
↳ infinite.queryParamChoose the query parameter that carries the cursor.'id'
↳ infinite.initialPageParamSet the first page parameter.0
↳ infinite.nextParamLocate the next-page cursor in the response.null
↳ infinite.previousParamLocate the previous-page cursor in the response.null
↳ infinite.cursorParamDeprecated cursor path. Use nextParam and previousParam instead.null
suspenseGenerate useSuspenseQuery hooks.false
queryConfigure the query hooks.{ methods: ['GET'], importPath: '@tanstack/react-query' }
↳ query.methodsChoose which HTTP methods generate queries.['GET']
↳ query.importPathSet the module used for query imports.'@tanstack/react-query'
queryKeyBuild the queryKey for each query hook.Built-in queryKeyTransformer
mutationConfigure the mutation hooks.{ methods: ['POST', 'PUT', 'PATCH', 'DELETE'], importPath: '@tanstack/react-query' }
↳ mutation.methodsChoose which HTTP methods generate mutations.['POST', 'PUT', 'PATCH', 'DELETE']
↳ mutation.importPathSet the module used for mutation imports.'@tanstack/react-query'
mutationKeyBuild the mutationKey for each mutation hook.Built-in mutationKeyTransformer
customOptionsRoute every hook through your own options function.None
↳ customOptions.importPathSet the module for the custom-options hook.Required with customOptions
↳ customOptions.nameSet the exported custom-options hook name.'useCustomHookOptions'
hooksEmit use* hook functions on top of the factories.false
includeKeep only operations that match.None
excludeSkip operations that match.[]
overrideApply different options per pattern.[]
resolverCustomize generated names and file paths.resolverReactQuery
macrosRewrite AST nodes before printing.[]

Option details

client

Selects which registered client plugin the hooks call. A single registered client is auto-detected. Set client when several are registered.

Type'axios' | 'fetch'
Requiredfalse
'fetch'
Calls the operations generated by @kubb/plugin-fetch.
'axios'
Calls the operations generated by @kubb/plugin-axios.
The hooks call a client plugin's functions, so register @kubb/plugin-axios or @kubb/plugin-fetch alongside this one.

infinite

Adds infinite-query output for pagination. Pass an object to configure the cursor, or false (the default) to skip. Emitted only for operations with a query parameter matching infinite.queryParam.

TypePartial<Infinite> | false
Requiredfalse
Defaultfalse

With hooks at its default of false, setting infinite produces no file at all, not even the infiniteQueryOptions factory. Set hooks: true alongside infinite to generate the file and its useInfiniteQuery hook.

infinite.queryParam

Query parameter that carries the page cursor.

Typestring
Requiredfalse
Default'id'

infinite.initialPageParam

Initial value for pageParam on the first fetch.

Typeunknown
Requiredfalse
Default0

infinite.nextParam

Path to the next-page cursor on the response, as dot notation ('pagination.next.id') or array form (['pagination', 'next', 'id']).

Typestring | Array<string> | null
Requiredfalse
Defaultnull

infinite.previousParam

Path to the previous-page cursor on the response, in the same dot or array form.

Typestring | Array<string> | null
Requiredfalse
Defaultnull

infinite.cursorParam

Deprecated path to the cursor field, read for both getNextPageParam and getPreviousPageParam when set. Use nextParam and previousParam instead.

Typestring | null
Requiredfalse
Defaultnull

infinite.getNextPageParam

Source of TanStack Query's getNextPageParam, inlined verbatim, for a next page that has to be computed rather than read from a field. Takes precedence over nextParam and cursorParam. Defaults to null.

infinite: {
  queryParam: 'page',
  getNextPageParam: '(lastPage) => (lastPage.hasNext ? lastPage.number + 1 : undefined)',
  getPreviousPageParam: '(firstPage) => (firstPage.number > 0 ? firstPage.number - 1 : undefined)',
}

Without any of getNextPageParam, nextParam or cursorParam, the hook counts pages up from initialPageParam and stops on an empty array. That only works for responses that are arrays, so generation warns for an operation whose response is an object.

infinite.getPreviousPageParam

Source of TanStack Query's getPreviousPageParam, inlined verbatim. Takes precedence over previousParam and cursorParam. Defaults to null.

suspense

Adds a suspense variant alongside the regular query output. Pass an empty object ({}) to enable, or leave it as false (the default) to skip it. TanStack Query v5+ only.

TypePartial<object> | false
Requiredfalse
Defaultfalse

With hooks at its default of false, enabling suspense produces no file at all, not even the suspenseQueryOptions factory. Set hooks: true alongside suspense to generate the file and its useSuspenseQuery hook.

query

Which operations become queries, emitting a queryOptions factory by default. Pass false to skip, or set hooks to also emit useQuery.

TypePartial<Query> | false
Requiredfalse
Default{ methods: ['GET'], importPath: '@tanstack/react-query' }

query.methods

HTTP methods treated as queries.

TypeArray<string>
Requiredfalse
Default['GET']

query.importPath

Module for the queryOptions and useQuery imports.

Typestring
Requiredfalse
Default'@tanstack/react-query'

queryKey

Builds the queryKey for each hook from the operation node, casing and variant. String values are inlined verbatim, so wrap literals in JSON.stringify(...).

Type(props: { node, casing, variant }) => Array<unknown>
Requiredfalse
DefaultBuilt-in queryKeyTransformer

variant is the hook the key is built for: 'query', 'suspenseQuery', 'infiniteQuery' or 'suspenseInfiniteQuery'. The default key adds infinite: true for the infinite variants, because TanStack Query stores InfiniteData under an infinite key and the plain hook for the same request must not share it.

queryKey: ({ node, variant }) => [JSON.stringify({ variant, operationId: node.operationId })]

mutation

Which operations become mutations, emitting a mutationOptions factory by default. Set false to skip, or set hooks to also emit useMutation.

TypePartial<Mutation> | false
Requiredfalse
Default{ methods: ['POST', 'PUT', 'PATCH', 'DELETE'], importPath: '@tanstack/react-query' }

mutation.methods

HTTP methods treated as mutations.

TypeArray<string>
Requiredfalse
Default['POST', 'PUT', 'PATCH', 'DELETE']

mutation.importPath

Module for the mutationOptions and useMutation imports.

Typestring
Requiredfalse
Default'@tanstack/react-query'

mutationKey

Builds the mutationKey for each mutation hook, for batched invalidations or useMutationState. Same props and string-inlining caveat as queryKey, with variant set to 'mutation'.

Type(props: { node, casing, variant }) => Array<unknown>
Requiredfalse
DefaultBuilt-in mutationKeyTransformer

customOptions

Routes every hook through your own function that returns extra options such as onSuccess or select. Also emits a HookOptions type so your wrapper stays in sync.

Type{ importPath: string, name?: string }
Requiredfalse
customOptions needs hooks: true. With hooks at its default of false there are no use* hooks to route, so the HookOptions file is not written.

customOptions.importPath

Module of your custom-options hook, imported as a named import.

Typestring
Requiredtrue when customOptions is set

customOptions.name

Exported name of your custom-options hook.

Typestring
Requiredfalse
Default'useCustomHookOptions'

hooks

When false (the default), only the queryOptions, mutationOptions, queryKey and mutationKey helpers are written, using factory imports that work across TanStack Query adapters. Set true to also generate useQuery, useSuspenseQuery, useInfiniteQuery, useSuspenseInfiniteQuery, and useMutation.

Typeboolean
Requiredfalse
Defaultfalse

suspense, infinite and customOptions are gated on hooks too: with hooks: false, enabling any of them writes nothing.

resolver

Overrides generated file and symbol names. Omitted members keep resolverReactQuery. The shared members (name, file, imports) and the this context are described under resolver.

TypeResolverPatch<ResolverReactQuery>
Requiredfalse
Partial override
type ResolverReactQueryPatch = {
  name?(name: string): string
  file?: {
    baseName?(params: { name: string; extname: string }): string
    path?(params: { baseName: string; output: Output }): string
  }
  imports?(options: ResolveImportsOptions): Array<ImportNode>
  query?: {
    name?(node: OperationNode): string         // → 'useGetPetById'
    optionsName?(node: OperationNode): string  // → 'getPetByIdQueryOptions'
    keyName?(node: OperationNode): string       // → 'getPetByIdQueryKey'
    keyTypeName?(node: OperationNode): string   // → 'GetPetByIdQueryKey'
    clientName?(node: OperationNode): string    // → 'getPetById'
  }
  suspenseQuery?: { /* same members as query */ }
  infiniteQuery?: { /* same members as query */ }
  suspenseInfiniteQuery?: { /* same members as query */ }
  mutation?: {
    name?(node: OperationNode): string          // → 'useUpdatePet'
    optionsName?(node: OperationNode): string
    keyName?(node: OperationNode): string
    typeName?(node: OperationNode): string      // → 'UpdatePet'
  }
  hook?: {
    optionsName?(): string
    customOptionsName?(): string
  }
}