From 3eda6461b576adc9b98aabc99cacf4ecdcb94b75 Mon Sep 17 00:00:00 2001 From: Maxim Mazurok Date: Wed, 12 Jul 2023 15:38:14 +1000 Subject: [PATCH] feat: make all params optional #858 --- packages/query/src/index.ts | 49 +++++++++++-------- packages/query/src/utils.ts | 32 +++++++++++- .../petstoreFromFileSpecWithTransformer.ts | 14 +++--- 3 files changed, 67 insertions(+), 28 deletions(-) diff --git a/packages/query/src/index.ts b/packages/query/src/index.ts index e94ba9c31..9c7eb387e 100644 --- a/packages/query/src/index.ts +++ b/packages/query/src/index.ts @@ -1,43 +1,44 @@ import { - camel, ClientBuilder, ClientDependenciesBuilder, ClientHeaderBuilder, - generateFormDataAndUrlEncodedFunction, - generateMutator, - generateMutatorConfig, - generateMutatorRequestOptions, - generateOptions, - generateVerbImports, GeneratorDependency, GeneratorMutator, GeneratorOptions, GeneratorVerbOptions, GetterParams, - GetterProps, GetterPropType, + GetterProps, GetterResponse, - isObject, - isSyntheticDefaultImportsAllow, - mergeDeep, OutputClient, OutputClientFunc, PackageJson, - pascal, QueryOptions, - stringify, - toObjectString, - Verbs, VERBS_WITH_BODY, + Verbs, + camel, + generateFormDataAndUrlEncodedFunction, + generateMutator, + generateMutatorConfig, + generateMutatorRequestOptions, + generateOptions, + generateVerbImports, getRouteAsArray, + isObject, + isSyntheticDefaultImportsAllow, jsDoc, + mergeDeep, + pascal, + stringify, + toObjectString, } from '@orval/core'; import omitBy from 'lodash.omitby'; import { + isVue, normalizeQueryOptions, + vueMakeParamsOptional, vueMakeRouteReactive, vueWrapTypeWithMaybeRef, - isVue, } from './utils'; const AXIOS_DEPENDENCIES: GeneratorDependency[] = [ @@ -340,7 +341,9 @@ const generateQueryRequestFunction = ( : toObjectString(props, 'implementation'); if (isVue(outputClient)) { - propsImplementation = vueWrapTypeWithMaybeRef(propsImplementation); + propsImplementation = vueWrapTypeWithMaybeRef( + vueMakeParamsOptional(propsImplementation, props), + ); } const requestOptions = isRequestOptions @@ -405,7 +408,9 @@ const generateQueryRequestFunction = ( }); const queryProps = isVue(outputClient) - ? vueWrapTypeWithMaybeRef(toObjectString(props, 'implementation')) + ? vueWrapTypeWithMaybeRef( + vueMakeParamsOptional(toObjectString(props, 'implementation'), props), + ) : toObjectString(props, 'implementation'); return `export const ${operationName} = (\n ${queryProps} ${optionsArgs} ): Promise { const queryProps = isVue(outputClient) - ? vueWrapTypeWithMaybeRef(toObjectString(props, 'implementation')) + ? vueWrapTypeWithMaybeRef( + vueMakeParamsOptional(toObjectString(props, 'implementation'), props), + ) : toObjectString(props, 'implementation'); const httpFunctionProps = queryParam @@ -1003,7 +1010,9 @@ const generateQueryHook = async ( ); if (isVue(outputClient)) { - queryKeyProps = vueWrapTypeWithMaybeRef(queryKeyProps); + queryKeyProps = vueWrapTypeWithMaybeRef( + vueMakeParamsOptional(queryKeyProps, props), + ); } const routeString = isVue(outputClient) diff --git a/packages/query/src/utils.ts b/packages/query/src/utils.ts index 51e5e9ace..b326436fb 100644 --- a/packages/query/src/utils.ts +++ b/packages/query/src/utils.ts @@ -9,6 +9,8 @@ import { OutputClient, OutputClientFunc, upath, + GetterProps, + GetterPropType, } from '@orval/core'; import chalk from 'chalk'; @@ -87,7 +89,35 @@ export function vueWrapTypeWithMaybeRef(input: string): string { .map((param) => { const [paramName, paramType] = param.split(':'); if (paramType) { - return `${paramName}: MaybeRef<${paramType.trim()} | undefined | null>,`; + return `${paramName}: MaybeRef<${paramType.trim()}>,`; + } else { + return `${param},`; + } + }) + .join('') + .replace(',,', ','); + + return output; +} + +/** + * Make params optional + */ +export function vueMakeParamsOptional( + input: string, + props: GetterProps, +): string { + if (!input.includes(',')) return input; + + const output = input + .split(',') + .map((param) => { + const [paramName, paramType] = param.split(':'); + if ( + paramType && + props.find((x) => x.name === paramName)?.type === GetterPropType.PARAM + ) { + return `${paramName}: ${paramType.trim()} | undefined | null,`; } else { return `${param},`; } diff --git a/samples/vue-query/src/api/endpoints/petstoreFromFileSpecWithTransformer.ts b/samples/vue-query/src/api/endpoints/petstoreFromFileSpecWithTransformer.ts index 805411263..c0b0abc0d 100644 --- a/samples/vue-query/src/api/endpoints/petstoreFromFileSpecWithTransformer.ts +++ b/samples/vue-query/src/api/endpoints/petstoreFromFileSpecWithTransformer.ts @@ -34,7 +34,7 @@ type Awaited = O extends AwaitedInput ? T : never; * @summary List all pets */ export const listPets = ( - params?: MaybeRef, + params?: MaybeRef, version = 1, signal?: AbortSignal, ) => { @@ -47,7 +47,7 @@ export const listPets = ( }; export const getListPetsQueryKey = ( - params?: MaybeRef, + params?: MaybeRef, version = 1, ) => ['v', version, 'pets', ...(params ? [params] : [])] as const; @@ -55,7 +55,7 @@ export const getListPetsInfiniteQueryOptions = < TData = Awaited>, TError = Error, >( - params?: MaybeRef, + params?: MaybeRef, version = 1, options?: { query?: UseInfiniteQueryOptions< @@ -93,7 +93,7 @@ export const useListPetsInfinite = < TData = Awaited>, TError = Error, >( - params?: MaybeRef, + params?: MaybeRef, version = 1, options?: { query?: UseInfiniteQueryOptions< @@ -123,7 +123,7 @@ export const getListPetsQueryOptions = < TData = Awaited>, TError = Error, >( - params?: MaybeRef, + params?: MaybeRef, version = 1, options?: { query?: UseQueryOptions< @@ -156,7 +156,7 @@ export const useListPets = < TData = Awaited>, TError = Error, >( - params?: MaybeRef, + params?: MaybeRef, version = 1, options?: { query?: UseQueryOptions< @@ -181,7 +181,7 @@ export const useListPets = < * @summary Create a pet */ export const createPets = ( - createPetsBody: MaybeRef, + createPetsBody: MaybeRef, version = 1, ) => { return customInstance({