diff --git a/.changeset/small-readers-cut.md b/.changeset/small-readers-cut.md new file mode 100644 index 000000000..92a1360a5 --- /dev/null +++ b/.changeset/small-readers-cut.md @@ -0,0 +1,5 @@ +--- +'@hey-api/openapi-ts': patch +--- + +**@tanstack/query**: prettier mutation options diff --git a/dev/openapi-ts.config.ts b/dev/openapi-ts.config.ts index 58653937d..abef2163a 100644 --- a/dev/openapi-ts.config.ts +++ b/dev/openapi-ts.config.ts @@ -310,9 +310,14 @@ export default defineConfig(() => { // infiniteQueryOptions: { // name: '{{name}}IQO', // }, - // mutationOptions: { - // name: '{{name}}MO', - // }, + mutationOptions: { + // name: '{{name}}MO', + meta() { + return { + custom: 'value', + }; + }, + }, name: '@tanstack/react-query', // queryKeys: { // name: '{{name}}QK', diff --git a/packages/openapi-ts/src/plugins/@hey-api/sdk/shared/class.ts b/packages/openapi-ts/src/plugins/@hey-api/sdk/shared/class.ts index b06ce1eac..b70529773 100644 --- a/packages/openapi-ts/src/plugins/@hey-api/sdk/shared/class.ts +++ b/packages/openapi-ts/src/plugins/@hey-api/sdk/shared/class.ts @@ -257,7 +257,7 @@ export const generateClassSdk = ({ const functionNode = $.method(entry.methodName, (m) => m .$if(createOperationComment({ operation }), (m, v) => - m.describe(v as Array), + m.describe(v as ReadonlyArray), ) .public() .static(!isAngularClient && !plugin.config.instance) 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 a8043ce80..0a7999057 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/query-core/mutationOptions.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/query-core/mutationOptions.ts @@ -1,9 +1,8 @@ -import type ts from 'typescript'; - import type { IR } from '~/ir/types'; import { buildName } from '~/openApi/shared/utils/name'; import { createOperationComment } from '~/plugins/shared/utils/operation'; -import { tsc } from '~/tsc'; +import type { TsDsl } from '~/ts-dsl'; +import { $ } from '~/ts-dsl'; import { handleMeta } from './shared/meta'; import { useTypeData, useTypeError, useTypeResponse } from './shared/useType'; @@ -31,98 +30,27 @@ export const createMutationOptions = ({ const fnOptions = 'fnOptions'; - const awaitSdkExpression = tsc.awaitExpression({ - expression: tsc.callExpression({ - functionName: queryFn, - parameters: [ - tsc.objectExpression({ - multiLine: true, - obj: [ - { - spread: 'options', - }, - { - spread: fnOptions, - }, - { - key: 'throwOnError', - value: true, - }, - ], - }), - ], - }), - }); - - const statements: Array = []; + const awaitSdkFn = $(queryFn) + .call( + $.object() + .spread('options') + .spread(fnOptions) + .prop('throwOnError', $.literal(true)), + ) + .await(); + const statements: Array> = []; if (plugin.getPluginOrThrow('@hey-api/sdk').config.responseStyle === 'data') { - statements.push( - tsc.returnVariable({ - expression: awaitSdkExpression, - }), - ); + statements.push($.return(awaitSdkFn)); } else { statements.push( - tsc.constVariable({ - destructure: true, - expression: awaitSdkExpression, - name: 'data', - }), - tsc.returnVariable({ - expression: 'data', - }), + $.const().object('data').assign(awaitSdkFn), + $.return('data'), ); } - const mutationOptionsObj: Array<{ key: string; value: ts.Expression }> = [ - { - key: 'mutationFn', - value: tsc.arrowFunction({ - async: true, - multiLine: true, - parameters: [ - { - name: fnOptions, - }, - ], - statements, - }), - }, - ]; - const meta = handleMeta(plugin, operation, 'mutationOptions'); - - if (meta) { - mutationOptionsObj.push({ - key: 'meta', - value: meta, - }); - } - const mutationOptionsFn = 'mutationOptions'; - const expression = tsc.arrowFunction({ - parameters: [ - { - isRequired: false, - name: 'options', - type: `Partial<${typeData}>`, - }, - ], - returnType: mutationType, - statements: [ - tsc.constVariable({ - expression: tsc.objectExpression({ - obj: mutationOptionsObj, - }), - name: mutationOptionsFn, - typeName: mutationType, - }), - tsc.returnVariable({ - expression: mutationOptionsFn, - }), - ], - }); const symbolMutationOptions = plugin.registerSymbol({ exported: true, name: buildName({ @@ -130,13 +58,33 @@ export const createMutationOptions = ({ name: operation.id, }), }); - const statement = tsc.constVariable({ - comment: plugin.config.comments - ? createOperationComment({ operation }) - : undefined, - exportConst: symbolMutationOptions.exported, - expression, - name: symbolMutationOptions.placeholder, - }); + const statement = $.const(symbolMutationOptions.placeholder) + .export(symbolMutationOptions.exported) + .$if( + plugin.config.comments && createOperationComment({ operation }), + (c, v) => c.describe(v as ReadonlyArray), + ) + .assign( + $.func() + .param('options', (p) => p.optional().type(`Partial<${typeData}>`)) + .returns(mutationType) + .do( + $.const(mutationOptionsFn) + .type(mutationType) + .assign( + $.object() + .pretty() + .prop( + 'mutationFn', + $.func() + .async() + .param(fnOptions) + .do(...statements), + ) + .$if(meta, (c, v) => c.prop('meta', v)), + ), + $(mutationOptionsFn).return(), + ), + ); plugin.setSymbolValue(symbolMutationOptions, statement); }; diff --git a/packages/openapi-ts/src/plugins/@tanstack/query-core/v5/queryOptions.ts b/packages/openapi-ts/src/plugins/@tanstack/query-core/v5/queryOptions.ts index 6a2698ee1..f98e54143 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/query-core/v5/queryOptions.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/query-core/v5/queryOptions.ts @@ -126,7 +126,7 @@ export const createQueryOptions = ({ .export(symbolQueryOptionsFn.exported) .$if( plugin.config.comments && createOperationComment({ operation }), - (c, v) => c.describe(v as Array), + (c, v) => c.describe(v as ReadonlyArray), ) .assign( $.func() diff --git a/packages/openapi-ts/src/plugins/@tanstack/query-core/v5/useQuery.ts b/packages/openapi-ts/src/plugins/@tanstack/query-core/v5/useQuery.ts index 077b1cbfb..6b5dfe498 100644 --- a/packages/openapi-ts/src/plugins/@tanstack/query-core/v5/useQuery.ts +++ b/packages/openapi-ts/src/plugins/@tanstack/query-core/v5/useQuery.ts @@ -5,7 +5,7 @@ import { hasOperationSse, isOperationOptionsRequired, } from '~/plugins/shared/utils/operation'; -import { tsc } from '~/tsc'; +import { $ } from '~/ts-dsl'; import { useTypeData } from '../shared/useType'; import type { PluginInstance } from '../types'; @@ -53,34 +53,22 @@ export const createUseQuery = ({ role: 'queryOptions', tool: plugin.name, }); - const statement = tsc.constVariable({ - comment: plugin.config.comments - ? createOperationComment({ operation }) - : undefined, - exportConst: symbolUseQueryFn.exported, - expression: tsc.arrowFunction({ - parameters: [ - { - isRequired: isRequiredOptions, - name: optionsParamName, - type: typeData, - }, - ], - statements: [ - tsc.returnStatement({ - expression: tsc.callExpression({ - functionName: symbolUseQuery.placeholder, - parameters: [ - tsc.callExpression({ - functionName: symbolQueryOptionsFn.placeholder, - parameters: [optionsParamName], - }), - ], - }), - }), - ], - }), - name: symbolUseQueryFn.placeholder, - }); + const statement = $.const(symbolUseQueryFn.placeholder) + .export(symbolUseQueryFn.exported) + .$if( + plugin.config.comments && createOperationComment({ operation }), + (c, v) => c.describe(v as ReadonlyArray), + ) + .assign( + $.func() + .param(optionsParamName, (p) => + p.optional(!isRequiredOptions).type(typeData), + ) + .do( + $(symbolUseQuery.placeholder) + .call($(symbolQueryOptionsFn.placeholder).call(optionsParamName)) + .return(), + ), + ); plugin.setSymbolValue(symbolUseQueryFn, statement); }; diff --git a/packages/openapi-ts/src/plugins/swr/v2/useSwr.ts b/packages/openapi-ts/src/plugins/swr/v2/useSwr.ts index 932d7506f..f66603855 100644 --- a/packages/openapi-ts/src/plugins/swr/v2/useSwr.ts +++ b/packages/openapi-ts/src/plugins/swr/v2/useSwr.ts @@ -52,7 +52,7 @@ export const createUseSwr = ({ .export(symbolUseQueryFn.exported) .$if( plugin.config.comments && createOperationComment({ operation }), - (c, v) => c.describe(v as Array), + (c, v) => c.describe(v as ReadonlyArray), ) .assign( $.func().do( diff --git a/packages/openapi-ts/src/plugins/valibot/shared/export.ts b/packages/openapi-ts/src/plugins/valibot/shared/export.ts index 614a701aa..57444d7b4 100644 --- a/packages/openapi-ts/src/plugins/valibot/shared/export.ts +++ b/packages/openapi-ts/src/plugins/valibot/shared/export.ts @@ -27,7 +27,7 @@ export const exportAst = ({ const statement = $.const(symbol.placeholder) .export(symbol.exported) .$if(plugin.config.comments && createSchemaComment({ schema }), (c, v) => - c.describe(v as Array), + c.describe(v as ReadonlyArray), ) .$if(state.hasLazyExpression.value, (c) => c.type(