import type { Transformer } from '@internals/tanstack-query' import type { Group, Output, PluginFactoryOptions, ResolveNameParams } from '@kubb/core' import type { contentType, HttpMethod, Oas } from '@kubb/oas' import type { ClientImportPath, PluginClient } from '@kubb/plugin-client' import type { Exclude, Include, Override, ResolvePathOptions } from '@kubb/plugin-oas' import type { Generator } from '@kubb/plugin-oas/generators' export type { Transformer } from '@internals/tanstack-query' /** * Customize the queryKey */ type QueryKey = Transformer /** * Customize the mutationKey */ type MutationKey = Transformer type Query = { /** * Define which HttpMethods can be used for queries * @default ['get'] */ methods?: Array /** * Path to the useQuery hook for useQuery functionality. * Used as `import { useQuery } from '${importPath}'`. * Accepts relative and absolute paths. * Path is used as-is; relative paths are based on the generated file location. * @default 'swr' */ importPath?: string } type Mutation = { /** * Define which HttpMethods can be used for queries * @default ['post', 'put', 'delete', 'patch'] */ methods?: Array /** * Path to the useQuery hook for useQuery functionality. * Used as `import { useQuery } from '${importPath}'`. * Accepts relative and absolute paths. * Path is used as-is; relative paths are based on the generated file location. * @default 'swr/mutation' */ importPath?: string /** * When true, mutation parameters (path params, query params, headers, body) is passed via `trigger()` instead of as hook arguments. * This aligns with React Query's mutation pattern where variables are passed when triggering the mutation. * @default false * @deprecated This will become the default behavior in v5. Set to `true` to opt-in early. */ paramsToTrigger?: boolean } export type Options = { /** * Specify the export location for the files and define the behavior of the output * @default { path: 'hooks', barrelType: 'named' } */ output?: Output /** * Define which contentType should be used. * By default, the first JSON valid mediaType is used */ contentType?: contentType /** * Group the SWR hooks based on the provided name. */ group?: Group /** * Array containing exclude parameters to exclude/skip tags/operations/methods/paths. */ exclude?: Array /** * Array containing include parameters to include tags/operations/methods/paths. */ include?: Array /** * Array containing override parameters to override `options` based on tags/operations/methods/paths. */ override?: Array> client?: ClientImportPath & Pick queryKey?: QueryKey query?: Query | false mutationKey?: MutationKey mutation?: Mutation | false /** * How to style your params, by default no casing is applied * - 'camelcase' uses camelcase for the params names * @deprecated Removed in v5, where parameters always use camelCase names. Set `paramsCasing: 'camelcase'` now to match the v5 behavior. See https://kubb.dev/docs/5.x/migration-guide */ paramsCasing?: 'camelcase' /** * How to pass your params * - 'object' returns the params and pathParams as an object. * - 'inline' returns the params as comma separated params. * @default 'inline' * @deprecated Removed in v5, where generated functions take a single grouped options object. Set `paramsType: 'object'` now to match the v5 behavior. See https://kubb.dev/docs/5.x/migration-guide */ paramsType?: 'object' | 'inline' /** * How to pass your pathParams. * - 'object' returns the pathParams as an object. * - 'inline': returns the pathParams as comma separated params. * @default 'inline' * @deprecated Removed in v5, where generated functions take a single grouped options object. Set `pathParamsType: 'object'` now to match the v5 behavior. See https://kubb.dev/docs/5.x/migration-guide */ pathParamsType?: PluginClient['options']['pathParamsType'] /** * Which parser should be used before returning the data to `swr`. * `'zod'` uses `@kubb/plugin-zod` to parse the data. */ parser?: PluginClient['options']['parser'] transformers?: { /** * Customize the names based on the type that is provided by the plugin. */ name?: (name: ResolveNameParams['name'], type?: ResolveNameParams['type']) => string } /** * Define some generators next to the swr generators * @deprecated Removed in v5. To add custom output, build your own plugin. See https://kubb.dev/docs/5.x/migration-guide */ generators?: Array> } type ResolvedOptions = { output: Output client: Pick parser: Required> queryKey: QueryKey | undefined query: NonNullable> | false mutationKey: MutationKey | undefined mutation: (Required> & Pick) | false paramsCasing: Options['paramsCasing'] paramsType: NonNullable pathParamsType: NonNullable group: Options['group'] } export type PluginSwr = PluginFactoryOptions<'plugin-swr', Options, ResolvedOptions, never, ResolvePathOptions>