From 45138fc61832c25fa6f5d8d7c5b05f54202c2066 Mon Sep 17 00:00:00 2001 From: Lubos Date: Sun, 31 Aug 2025 12:06:34 +0800 Subject: [PATCH] feat(tanstack-query): add hooks options --- .changeset/changelog.js | 12 +- .../main/test/openapi-ts.config.ts | 4 +- packages/openapi-ts/README.md | 4 +- .../src/plugins/@pinia/colada/queryOptions.ts | 4 +- .../angular-query-experimental/config.ts | 1 + .../angular-query-experimental/types.d.ts | 12 ++ .../query-core/infiniteQueryOptions.ts | 11 +- .../@tanstack/query-core/mutationOptions.ts | 11 +- .../plugins/@tanstack/query-core/plugin.ts | 51 ++++--- .../@tanstack/query-core/queryOptions.ts | 14 +- .../plugins/@tanstack/query-core/types.d.ts | 1 + .../plugins/@tanstack/query-core/useQuery.ts | 92 +++++++++++++ .../plugins/@tanstack/react-query/config.ts | 24 ++++ .../plugins/@tanstack/react-query/types.d.ts | 129 +++++++++++++++--- .../plugins/@tanstack/solid-query/config.ts | 1 + .../plugins/@tanstack/solid-query/types.d.ts | 12 ++ .../plugins/@tanstack/svelte-query/config.ts | 1 + .../plugins/@tanstack/svelte-query/types.d.ts | 12 ++ .../src/plugins/@tanstack/vue-query/config.ts | 1 + .../plugins/@tanstack/vue-query/types.d.ts | 12 ++ .../src/plugins/shared/utils/operation.ts | 14 ++ 21 files changed, 343 insertions(+), 80 deletions(-) create mode 100644 packages/openapi-ts/src/plugins/@tanstack/query-core/useQuery.ts diff --git a/.changeset/changelog.js b/.changeset/changelog.js index e4fabc24a..4f23b7a6b 100644 --- a/.changeset/changelog.js +++ b/.changeset/changelog.js @@ -23,12 +23,7 @@ export default { return ['### Updated Dependencies:', ...list].join('\n'); }, - getReleaseLine: async (changeset, type, changelogOpts) => { - console.warn('----🐍🐍🐍🐍🐍🐍🐍'); - console.warn(changeset); - console.warn(type); - console.warn(changelogOpts); - console.warn('----🐍🐍🐍🐍🐍🐍🐍'); + getReleaseLine: async (changeset) => { const repo = getRepo(); /** @type number | undefined */ @@ -73,10 +68,7 @@ export default { } const commitToFetchFrom = commitFromSummary || changeset.commit; if (commitToFetchFrom) { - const { links } = await getInfo({ - commit: commitToFetchFrom, - repo, - }); + const { links } = await getInfo({ commit: commitToFetchFrom, repo }); return links; } return { diff --git a/packages/openapi-ts-tests/main/test/openapi-ts.config.ts b/packages/openapi-ts-tests/main/test/openapi-ts.config.ts index 24f96c966..592ceda11 100644 --- a/packages/openapi-ts-tests/main/test/openapi-ts.config.ts +++ b/packages/openapi-ts-tests/main/test/openapi-ts.config.ts @@ -81,7 +81,7 @@ export default defineConfig(() => { // deprecated: false, operations: { include: [ - 'GET /event', + // 'GET /event', // '/^[A-Z]+ /v1//', ], }, @@ -212,9 +212,11 @@ export default defineConfig(() => { // queryKeys: { // name: '{{name}}QK', // }, + queryOptions: false, // queryOptions: { // name: '{{name}}QO', // }, + useQuery: true, '~hooks': { operations: { getKind: (op) => { diff --git a/packages/openapi-ts/README.md b/packages/openapi-ts/README.md index 7e7efdb70..cbbdfa756 100644 --- a/packages/openapi-ts/README.md +++ b/packages/openapi-ts/README.md @@ -205,7 +205,9 @@ The above script can be executed by running `npm run openapi-ts` or equivalent c ### Node.js -You can also generate output programmatically by importing `@hey-api/openapi-ts` in a TypeScript file. +You can also generate output programmatically by calling `createClient()` in a JavaScript/TypeScript file. + +#### `script.ts` ```ts import { createClient } from '@hey-api/openapi-ts'; diff --git a/packages/openapi-ts/src/plugins/@pinia/colada/queryOptions.ts b/packages/openapi-ts/src/plugins/@pinia/colada/queryOptions.ts index 7badf3113..78bf9fe0b 100644 --- a/packages/openapi-ts/src/plugins/@pinia/colada/queryOptions.ts +++ b/packages/openapi-ts/src/plugins/@pinia/colada/queryOptions.ts @@ -5,6 +5,7 @@ import type { IR } from '../../../ir/types'; import { tsc } from '../../../tsc'; import { createOperationComment, + hasOperationSse, isOperationOptionsRequired, } from '../../shared/utils/operation'; import { handleMeta } from './meta'; @@ -35,7 +36,8 @@ export const createQueryOptions = ({ }): void => { if ( !plugin.config.queryOptions.enabled || - !plugin.hooks.operation.isQuery(operation) + !plugin.hooks.operation.isQuery(operation) || + hasOperationSse({ operation }) ) { return; } diff --git a/packages/openapi-ts/src/plugins/@tanstack/angular-query-experimental/config.ts b/packages/openapi-ts/src/plugins/@tanstack/angular-query-experimental/config.ts index 15f957851..4086f0ed2 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/angular-query-experimental/config.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/angular-query-experimental/config.ts @@ -77,6 +77,7 @@ export const defaultConfig: TanStackAngularQueryPlugin['Config'] = { defaultValue: { case: plugin.config.case ?? 'camelCase', enabled: true, + exported: true, name: '{{name}}Options', }, mappers: { diff --git a/packages/openapi-ts/src/plugins/@tanstack/angular-query-experimental/types.d.ts b/packages/openapi-ts/src/plugins/@tanstack/angular-query-experimental/types.d.ts index 94838176c..4857dcf9e 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/angular-query-experimental/types.d.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/angular-query-experimental/types.d.ts @@ -267,6 +267,12 @@ export type UserConfig = Plugin.Name<'@tanstack/angular-query-experimental'> & * @default true */ enabled?: boolean; + /** + * Whether to export generated symbols. + * + * @default true + */ + exported?: boolean; /** * Custom function to generate metadata for the operation. * Can return any valid meta object that will be included in the generated query options. @@ -510,6 +516,12 @@ export type Config = Plugin.Name<'@tanstack/angular-query-experimental'> & * @default true */ enabled: boolean; + /** + * Whether to export generated symbols. + * + * @default true + */ + exported: boolean; /** * Custom function to generate metadata for the operation. * Can return any valid meta object that will be included in the generated query options. diff --git a/packages/openapi-ts/src/plugins/@tanstack/query-core/infiniteQueryOptions.ts b/packages/openapi-ts/src/plugins/@tanstack/query-core/infiniteQueryOptions.ts index 82f45aa5f..fd7e69fc7 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/query-core/infiniteQueryOptions.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/query-core/infiniteQueryOptions.ts @@ -234,21 +234,14 @@ export const createInfiniteQueryOptions = ({ plugin: PluginInstance; queryFn: string; state: PluginState; -}) => { - if ( - !plugin.config.infiniteQueryOptions.enabled || - !plugin.hooks.operation.isQuery(operation) - ) { - return state; - } - +}): void => { const pagination = operationPagination({ context: plugin.context, operation, }); if (!pagination) { - return state; + return; } const file = plugin.context.file({ id: plugin.name })!; diff --git a/packages/openapi-ts/src/plugins/@tanstack/query-core/mutationOptions.ts b/packages/openapi-ts/src/plugins/@tanstack/query-core/mutationOptions.ts index 88401af36..b718e10d8 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/query-core/mutationOptions.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/query-core/mutationOptions.ts @@ -19,14 +19,7 @@ export const createMutationOptions = ({ plugin: PluginInstance; queryFn: string; state: PluginState; -}) => { - if ( - !plugin.config.mutationOptions.enabled || - !plugin.hooks.operation.isMutation(operation) - ) { - return state; - } - +}): void => { const mutationsType = plugin.name === '@tanstack/angular-query-experimental' || plugin.name === '@tanstack/svelte-query' || @@ -165,6 +158,4 @@ export const createMutationOptions = ({ name: identifier.name || '', }); file.add(statement); - - return state; }; diff --git a/packages/openapi-ts/src/plugins/@tanstack/query-core/plugin.ts b/packages/openapi-ts/src/plugins/@tanstack/query-core/plugin.ts index 43399fc72..0d44468d4 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/query-core/plugin.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/query-core/plugin.ts @@ -8,6 +8,7 @@ import { createInfiniteQueryOptions } from './infiniteQueryOptions'; import { createMutationOptions } from './mutationOptions'; import { createQueryOptions } from './queryOptions'; import type { PluginHandler, PluginState } from './types'; +import { createUseQuery } from './useQuery'; export const handler = ({ plugin }: Parameters[0]) => { const file = plugin.createFile({ @@ -68,26 +69,40 @@ export const handler = ({ plugin }: Parameters[0]) => { ] ).join('.'); - createQueryOptions({ - operation, - plugin, - queryFn, - state, - }); + if (plugin.hooks.operation.isQuery(operation)) { + if (plugin.config.queryOptions.enabled) { + createQueryOptions({ + operation, + plugin, + queryFn, + state, + }); + } - createInfiniteQueryOptions({ - operation, - plugin, - queryFn, - state, - }); + if (plugin.config.infiniteQueryOptions.enabled) { + createInfiniteQueryOptions({ + operation, + plugin, + queryFn, + state, + }); + } - createMutationOptions({ - operation, - plugin, - queryFn, - state, - }); + if ('useQuery' in plugin.config && plugin.config.useQuery.enabled) { + createUseQuery({ operation, plugin, state }); + } + } + + if (plugin.hooks.operation.isMutation(operation)) { + if (plugin.config.mutationOptions.enabled) { + createMutationOptions({ + operation, + plugin, + queryFn, + state, + }); + } + } if (state.hasUsedQueryFn) { file.import({ diff --git a/packages/openapi-ts/src/plugins/@tanstack/query-core/queryOptions.ts b/packages/openapi-ts/src/plugins/@tanstack/query-core/queryOptions.ts index ba8377f03..58301d7e8 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/query-core/queryOptions.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/query-core/queryOptions.ts @@ -4,6 +4,7 @@ import type { IR } from '../../../ir/types'; import { tsc } from '../../../tsc'; import { createOperationComment, + hasOperationSse, isOperationOptionsRequired, } from '../../shared/utils/operation'; import { handleMeta } from './meta'; @@ -28,12 +29,9 @@ export const createQueryOptions = ({ plugin: PluginInstance; queryFn: string; state: PluginState; -}) => { - if ( - !plugin.config.queryOptions.enabled || - !plugin.hooks.operation.isQuery(operation) - ) { - return state; +}): void => { + if (hasOperationSse({ operation })) { + return; } const file = plugin.context.file({ id: plugin.name })!; @@ -179,7 +177,7 @@ export const createQueryOptions = ({ comment: plugin.config.comments ? createOperationComment({ operation }) : undefined, - exportConst: true, + exportConst: plugin.config.queryOptions.exported, expression: tsc.arrowFunction({ parameters: [ { @@ -200,6 +198,4 @@ export const createQueryOptions = ({ // TODO: AxiosError }); file.add(statement); - - return state; }; diff --git a/packages/openapi-ts/src/plugins/@tanstack/query-core/types.d.ts b/packages/openapi-ts/src/plugins/@tanstack/query-core/types.d.ts index 1227931f3..f1d694b82 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/query-core/types.d.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/query-core/types.d.ts @@ -25,6 +25,7 @@ export interface PluginState { hasInfiniteQueries: boolean; hasMutations: boolean; hasQueries: boolean; + hasUseQuery?: boolean; hasUsedQueryFn: boolean; typeInfiniteData: ImportExportItem; } diff --git a/packages/openapi-ts/src/plugins/@tanstack/query-core/useQuery.ts b/packages/openapi-ts/src/plugins/@tanstack/query-core/useQuery.ts new file mode 100644 index 000000000..764b64f5a --- /dev/null +++ b/packages/openapi-ts/src/plugins/@tanstack/query-core/useQuery.ts @@ -0,0 +1,92 @@ +import type { IR } from '../../../ir/types'; +import { tsc } from '../../../tsc'; +import { + createOperationComment, + hasOperationSse, + isOperationOptionsRequired, +} from '../../shared/utils/operation'; +import type { PluginInstance, PluginState } from './types'; +import { useTypeData } from './useType'; + +const useQueryFn = 'useQuery'; +const optionsParamName = 'options'; + +export const createUseQuery = ({ + operation, + plugin, + state, +}: { + operation: IR.OperationObject; + plugin: PluginInstance; + state: PluginState; +}): void => { + if (hasOperationSse({ operation })) { + return; + } + + const file = plugin.context.file({ id: plugin.name })!; + + if (!state.hasUseQuery) { + state.hasUseQuery = true; + + file.import({ + module: plugin.name, + name: useQueryFn, + }); + } + + const identifierUseQuery = file.identifier({ + // TODO: refactor for better cross-plugin compatibility + $ref: `#/tanstack-query-use-query/${operation.id}`, + case: 'useQuery' in plugin.config ? plugin.config.useQuery.case : undefined, + create: true, + nameTransformer: + 'useQuery' in plugin.config ? plugin.config.useQuery.name : undefined, + namespace: 'value', + }); + + const identifierQueryOptions = file.identifier({ + // TODO: refactor for better cross-plugin compatibility + $ref: `#/tanstack-query-query-options/${operation.id}`, + case: plugin.config.queryOptions.case, + nameTransformer: plugin.config.queryOptions.name, + namespace: 'value', + }); + + const isRequiredOptions = isOperationOptionsRequired({ + context: plugin.context, + operation, + }); + const typeData = useTypeData({ operation, plugin }); + + const statement = tsc.constVariable({ + comment: plugin.config.comments + ? createOperationComment({ operation }) + : undefined, + exportConst: true, + expression: tsc.arrowFunction({ + parameters: [ + { + isRequired: isRequiredOptions, + name: optionsParamName, + type: typeData, + }, + ], + statements: [ + tsc.returnStatement({ + expression: tsc.callExpression({ + functionName: useQueryFn, + parameters: [ + tsc.callExpression({ + functionName: identifierQueryOptions.name || '', + parameters: [optionsParamName], + }), + ], + }), + }), + ], + }), + name: identifierUseQuery.name || '', + }); + file.add(statement); +}; diff --git a/packages/openapi-ts/src/plugins/@tanstack/react-query/config.ts b/packages/openapi-ts/src/plugins/@tanstack/react-query/config.ts index dce6b8a7e..ec0a15052 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/react-query/config.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/react-query/config.ts @@ -77,6 +77,7 @@ export const defaultConfig: TanStackReactQueryPlugin['Config'] = { defaultValue: { case: plugin.config.case ?? 'camelCase', enabled: true, + exported: true, name: '{{name}}Options', }, mappers: { @@ -86,6 +87,29 @@ export const defaultConfig: TanStackReactQueryPlugin['Config'] = { }, value: plugin.config.queryOptions, }); + + plugin.config.useQuery = context.valueToObject({ + defaultValue: { + case: plugin.config.case ?? 'camelCase', + enabled: false, + name: 'use{{name}}Query', + }, + mappers: { + boolean: (enabled) => ({ enabled }), + function: (name) => ({ enabled: true, name }), + object: (fields) => ({ enabled: true, ...fields }), + string: (name) => ({ enabled: true, name }), + }, + value: plugin.config.useQuery, + }); + + if (plugin.config.useQuery.enabled) { + // useQuery hooks consume queryOptions + if (!plugin.config.queryOptions.enabled) { + plugin.config.queryOptions.enabled = true; + plugin.config.queryOptions.exported = false; + } + } }, }; diff --git a/packages/openapi-ts/src/plugins/@tanstack/react-query/types.d.ts b/packages/openapi-ts/src/plugins/@tanstack/react-query/types.d.ts index 78314ad32..ec271bde6 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/react-query/types.d.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/react-query/types.d.ts @@ -31,7 +31,7 @@ export type UserConfig = Plugin.Name<'@tanstack/react-query'> & /** * Configuration for generated infinite query key helpers. * - * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/infiniteQueryOptions TanStack Query: infiniteQueryOptions} + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/infiniteQueryOptions infiniteQueryOptions} * * Can be: * - `boolean`: Shorthand for `{ enabled: boolean }` @@ -60,8 +60,9 @@ export type UserConfig = Plugin.Name<'@tanstack/react-query'> & * Custom naming pattern for generated infinite query key names. The name variable is * obtained from the SDK function name. * + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/infiniteQueryOptions infiniteQueryOptions} + * * @default '{{name}}InfiniteQueryKey' - * @see https://tanstack.com/query/v5/docs/framework/react/reference/infiniteQueryOptions */ name?: StringName; /** @@ -75,7 +76,7 @@ export type UserConfig = Plugin.Name<'@tanstack/react-query'> & /** * Configuration for generated infinite query options helpers. * - * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/infiniteQueryOptions TanStack Query: infiniteQueryOptions} + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/infiniteQueryOptions infiniteQueryOptions} * * Can be: * - `boolean`: Shorthand for `{ enabled: boolean }` @@ -127,15 +128,16 @@ export type UserConfig = Plugin.Name<'@tanstack/react-query'> & * Custom naming pattern for generated infinite query options names. The name variable is * obtained from the SDK function name. * + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/infiniteQueryOptions infiniteQueryOptions} + * * @default '{{name}}InfiniteOptions' - * @see https://tanstack.com/query/v5/docs/framework/react/reference/infiniteQueryOptions */ name?: StringName; }; /** * Configuration for generated mutation options helpers. * - * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/useMutation TanStack Query: useMutation} + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/useMutation useMutation} * * Can be: * - `boolean`: Shorthand for `{ enabled: boolean }` @@ -187,8 +189,9 @@ export type UserConfig = Plugin.Name<'@tanstack/react-query'> & * Custom naming pattern for generated mutation options names. The name variable is * obtained from the SDK function name. * + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/useMutation useMutation} + * * @default '{{name}}Mutation' - * @see https://tanstack.com/query/v5/docs/framework/react/reference/useMutation */ name?: StringName; }; @@ -201,7 +204,7 @@ export type UserConfig = Plugin.Name<'@tanstack/react-query'> & /** * Configuration for generated query keys. * - * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/queryKey TanStack Query: queryKey} + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/queryKey queryKey} * * Can be: * - `boolean`: Shorthand for `{ enabled: boolean }` @@ -230,8 +233,9 @@ export type UserConfig = Plugin.Name<'@tanstack/react-query'> & * Custom naming pattern for generated query key names. The name variable is * obtained from the SDK function name. * + * See {@link https://tanstack.com/query/v5/docs/framework/react/guides/query-keys Query Keys} + * * @default '{{name}}QueryKey' - * @see https://tanstack.com/query/v5/docs/framework/react/reference/queryKey */ name?: StringName; /** @@ -245,7 +249,7 @@ export type UserConfig = Plugin.Name<'@tanstack/react-query'> & /** * Configuration for generated query options helpers. * - * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/queryOptions TanStack Query: queryOptions} + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/queryOptions queryOptions} * * Can be: * - `boolean`: Shorthand for `{ enabled: boolean }` @@ -270,6 +274,12 @@ export type UserConfig = Plugin.Name<'@tanstack/react-query'> & * @default true */ enabled?: boolean; + /** + * Whether to export generated symbols. + * + * @default true + */ + exported?: boolean; /** * Custom function to generate metadata for the operation. * Can return any valid meta object that will be included in the generated query options. @@ -293,13 +303,51 @@ export type UserConfig = Plugin.Name<'@tanstack/react-query'> & * @default undefined */ meta?: (operation: IR.OperationObject) => Record; - /** * Custom naming pattern for generated query options names. The name variable is * obtained from the SDK function name. * + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/queryOptions queryOptions} + * * @default '{{name}}Options' - * @see https://tanstack.com/query/v5/docs/framework/react/reference/queryOptions + */ + name?: StringName; + }; + /** + * Configuration for generated `useQuery()` function helpers. + * + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/useQuery useQuery} + * + * Can be: + * - `boolean`: Shorthand for `{ enabled: boolean }` + * - `string` or `function`: Shorthand for `{ name: string | function }` + * - `object`: Full configuration object + * + * @default false + */ + useQuery?: + | boolean + | StringName + | { + /** + * The casing convention to use for generated names. + * + * @default 'camelCase' + */ + case?: StringCase; + /** + * Whether to generate `useQuery()` function helpers. + * + * @default true + */ + enabled?: boolean; + /** + * Custom naming pattern for generated `useQuery()` function names. The name variable is + * obtained from the SDK function name. + * + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/useQuery useQuery} + * + * @default 'use{{name}}Query' */ name?: StringName; }; @@ -328,7 +376,7 @@ export type Config = Plugin.Name<'@tanstack/react-query'> & /** * Resolved configuration for generated infinite query key helpers. * - * @see https://tanstack.com/query/v5/docs/framework/react/reference/infiniteQueryOptions + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/infiniteQueryOptions infiniteQueryOptions} */ infiniteQueryKeys: { /** @@ -346,8 +394,9 @@ export type Config = Plugin.Name<'@tanstack/react-query'> & /** * Custom naming pattern for generated infinite query key names. The name variable is obtained from the SDK function name. * + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/infiniteQueryOptions infiniteQueryOptions} + * * @default '{{name}}InfiniteQueryKey' - * @see https://tanstack.com/query/v5/docs/framework/react/reference/infiniteQueryOptions */ name: StringName; /** @@ -361,7 +410,7 @@ export type Config = Plugin.Name<'@tanstack/react-query'> & /** * Resolved configuration for generated infinite query options helpers. * - * @see https://tanstack.com/query/v5/docs/framework/react/reference/infiniteQueryOptions + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/infiniteQueryOptions infiniteQueryOptions} */ infiniteQueryOptions: { /** @@ -402,15 +451,16 @@ export type Config = Plugin.Name<'@tanstack/react-query'> & /** * Custom naming pattern for generated infinite query options names. The name variable is obtained from the SDK function name. * + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/infiniteQueryOptions infiniteQueryOptions} + * * @default '{{name}}InfiniteOptions' - * @see https://tanstack.com/query/v5/docs/framework/react/reference/infiniteQueryOptions */ name: StringName; }; /** * Resolved configuration for generated mutation options helpers. * - * @see https://tanstack.com/query/v5/docs/framework/react/reference/useMutation + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/useMutation useMutation} */ mutationOptions: { /** @@ -451,8 +501,9 @@ export type Config = Plugin.Name<'@tanstack/react-query'> & /** * Custom naming pattern for generated mutation options names. The name variable is obtained from the SDK function name. * + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/useMutation useMutation} + * * @default '{{name}}Mutation' - * @see https://tanstack.com/query/v5/docs/framework/react/reference/useMutation */ name: StringName; }; @@ -465,7 +516,7 @@ export type Config = Plugin.Name<'@tanstack/react-query'> & /** * Resolved configuration for generated query keys. * - * @see https://tanstack.com/query/v5/docs/framework/react/reference/queryKey + * See {@link https://tanstack.com/query/v5/docs/framework/react/guides/query-keys Query Keys} */ queryKeys: { /** @@ -483,8 +534,9 @@ export type Config = Plugin.Name<'@tanstack/react-query'> & /** * Custom naming pattern for generated query key names. The name variable is obtained from the SDK function name. * + * See {@link https://tanstack.com/query/v5/docs/framework/react/guides/query-keys Query Keys} + * * @default '{{name}}QueryKey' - * @see https://tanstack.com/query/v5/docs/framework/react/reference/queryKey */ name: StringName; /** @@ -498,7 +550,7 @@ export type Config = Plugin.Name<'@tanstack/react-query'> & /** * Resolved configuration for generated query options helpers. * - * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/queryOptions TanStack Query: queryOptions} + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/queryOptions queryOptions} */ queryOptions: { /** @@ -513,6 +565,12 @@ export type Config = Plugin.Name<'@tanstack/react-query'> & * @default true */ enabled: boolean; + /** + * Whether to export generated symbols. + * + * @default true + */ + exported: boolean; /** * Custom function to generate metadata for the operation. * Can return any valid meta object that will be included in the generated query options. @@ -539,8 +597,37 @@ export type Config = Plugin.Name<'@tanstack/react-query'> & /** * Custom naming pattern for generated query options names. The name variable is obtained from the SDK function name. * + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/queryOptions queryOptions} + * * @default '{{name}}Options' - * @see https://tanstack.com/query/v5/docs/framework/react/reference/queryOptions + */ + name: StringName; + }; + /** + * Configuration for generated `useQuery()` function helpers. + * + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/useQuery useQuery} + */ + useQuery: { + /** + * The casing convention to use for generated names. + * + * @default 'camelCase' + */ + case: StringCase; + /** + * Whether to generate `useQuery()` function helpers. + * + * @default true + */ + enabled: boolean; + /** + * Custom naming pattern for generated `useQuery()` function names. The name variable is + * obtained from the SDK function name. + * + * See {@link https://tanstack.com/query/v5/docs/framework/react/reference/useQuery useQuery} + * + * @default 'use{{name}}Query' */ name: StringName; }; diff --git a/packages/openapi-ts/src/plugins/@tanstack/solid-query/config.ts b/packages/openapi-ts/src/plugins/@tanstack/solid-query/config.ts index 7b4d7faff..7dec821d7 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/solid-query/config.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/solid-query/config.ts @@ -77,6 +77,7 @@ export const defaultConfig: TanStackSolidQueryPlugin['Config'] = { defaultValue: { case: plugin.config.case ?? 'camelCase', enabled: true, + exported: true, name: '{{name}}Options', }, mappers: { diff --git a/packages/openapi-ts/src/plugins/@tanstack/solid-query/types.d.ts b/packages/openapi-ts/src/plugins/@tanstack/solid-query/types.d.ts index f08309c99..9cb01739e 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/solid-query/types.d.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/solid-query/types.d.ts @@ -268,6 +268,12 @@ export type UserConfig = Plugin.Name<'@tanstack/solid-query'> & * @default true */ enabled?: boolean; + /** + * Whether to export generated symbols. + * + * @default true + */ + exported?: boolean; /** * Custom function to generate metadata for the operation. * Can return any valid meta object that will be included in the generated query options. @@ -511,6 +517,12 @@ export type Config = Plugin.Name<'@tanstack/solid-query'> & * @default true */ enabled: boolean; + /** + * Whether to export generated symbols. + * + * @default true + */ + exported: boolean; /** * Custom function to generate metadata for the operation. * Can return any valid meta object that will be included in the generated query options. diff --git a/packages/openapi-ts/src/plugins/@tanstack/svelte-query/config.ts b/packages/openapi-ts/src/plugins/@tanstack/svelte-query/config.ts index 46775feb9..e9860011d 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/svelte-query/config.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/svelte-query/config.ts @@ -77,6 +77,7 @@ export const defaultConfig: TanStackSvelteQueryPlugin['Config'] = { defaultValue: { case: plugin.config.case ?? 'camelCase', enabled: true, + exported: true, name: '{{name}}Options', }, mappers: { diff --git a/packages/openapi-ts/src/plugins/@tanstack/svelte-query/types.d.ts b/packages/openapi-ts/src/plugins/@tanstack/svelte-query/types.d.ts index 8957918ff..1f930e349 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/svelte-query/types.d.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/svelte-query/types.d.ts @@ -267,6 +267,12 @@ export type UserConfig = Plugin.Name<'@tanstack/svelte-query'> & * @default true */ enabled?: boolean; + /** + * Whether to export generated symbols. + * + * @default true + */ + exported?: boolean; /** * Custom function to generate metadata for the operation. * Can return any valid meta object that will be included in the generated query options. @@ -510,6 +516,12 @@ export type Config = Plugin.Name<'@tanstack/svelte-query'> & * @default true */ enabled: boolean; + /** + * Whether to export generated symbols. + * + * @default true + */ + exported: boolean; /** * Custom function to generate metadata for the operation. * Can return any valid meta object that will be included in the generated query options. diff --git a/packages/openapi-ts/src/plugins/@tanstack/vue-query/config.ts b/packages/openapi-ts/src/plugins/@tanstack/vue-query/config.ts index ddaad0579..80c24ff89 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/vue-query/config.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/vue-query/config.ts @@ -77,6 +77,7 @@ export const defaultConfig: TanStackVueQueryPlugin['Config'] = { defaultValue: { case: plugin.config.case ?? 'camelCase', enabled: true, + exported: true, name: '{{name}}Options', }, mappers: { diff --git a/packages/openapi-ts/src/plugins/@tanstack/vue-query/types.d.ts b/packages/openapi-ts/src/plugins/@tanstack/vue-query/types.d.ts index f799fe9d5..39f72a528 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/vue-query/types.d.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/vue-query/types.d.ts @@ -269,6 +269,12 @@ export type UserConfig = Plugin.Name<'@tanstack/vue-query'> & * @default true */ enabled?: boolean; + /** + * Whether to export generated symbols. + * + * @default true + */ + exported?: boolean; /** * Custom function to generate metadata for the operation. * Can return any valid meta object that will be included in the generated query options. @@ -515,6 +521,12 @@ export type Config = Plugin.Name<'@tanstack/vue-query'> & * @default true */ enabled: boolean; + /** + * Whether to export generated symbols. + * + * @default true + */ + exported: boolean; /** * Custom function to generate metadata for the operation. * Can return any valid meta object that will be included in the generated query options. diff --git a/packages/openapi-ts/src/plugins/shared/utils/operation.ts b/packages/openapi-ts/src/plugins/shared/utils/operation.ts index 5f0878293..f067034d6 100644 --- a/packages/openapi-ts/src/plugins/shared/utils/operation.ts +++ b/packages/openapi-ts/src/plugins/shared/utils/operation.ts @@ -42,3 +42,17 @@ export const isOperationOptionsRequired = ({ hasOperationDataRequired(operation) ); }; + +export const hasOperationSse = ({ + operation, +}: { + operation: IR.OperationObject; +}): boolean => { + for (const statusCode in operation.responses) { + const response = operation.responses[statusCode]!; + if (response.mediaType === 'text/event-stream') { + return true; + } + } + return false; +}; -- 2.51.2