Skip to content

Commit 40ed4e4

Browse files
feat: improve generated hook signature and typing
1 parent 5f7981c commit 40ed4e4

14 files changed

+579
-240
lines changed

dist/index.js

Lines changed: 493 additions & 221 deletions
Large diffs are not rendered by default.

src/templates/core/HookUtils.hbs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{{>header}}
2+
3+
import { UseQueryOptions, UseMutationOptions, QueryKey } from "react-query"
4+
5+
export type UseQueryOptionsWrapper<
6+
TQueryFnData = unknown,
7+
TError = unknown,
8+
TData = TQueryFnData,
9+
TQueryKey extends QueryKey = QueryKey
10+
> = Omit<
11+
UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
12+
"queryKey" | "queryFn"
13+
>
14+
15+
export type UseMutationOptionsWrapper<
16+
TData = unknown,
17+
TError = unknown,
18+
TVariables = void,
19+
TContext = unknown
20+
> = Omit<
21+
UseMutationOptions<TData, TError, TVariables, TContext>,
22+
'mutationKey' | 'mutationFn'
23+
>

src/templates/exportHook.hbs

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{{>header}}
22

3-
import { useQuery, useMutation } from 'react-query';
4-
import { {{{clientName}}} } from '../{{{clientName}}}';
3+
import { useQuery, useMutation, useQueryClient } from 'react-query';
4+
import { UseQueryOptionsWrapper, UseMutationOptionsWrapper} from '../core/HookUtils';
55
import { use{{{pascalCase clientName}}} } from '../use{{pascalCase clientName}}';
66
{{#if imports}}
77
{{#each imports}}
@@ -10,25 +10,38 @@ import { use{{{pascalCase clientName}}} } from '../use{{pascalCase clientName}}'
1010
{{/if}}
1111

1212
{{#each operations}}
13-
export const use{{{pascalCase name}}} = ({{>parameters}}{{#if parameters}}, {{/if}}options = {}) => {
13+
export const use{{{service}}}{{{pascalCase name}}} = (
14+
{{~#if parameters}}{{~>parameters~}},{{/if}}
15+
{{#equals method 'GET'}}
16+
options: UseQueryOptionsWrapper<Awaited<ReturnType<typeof client.{{camelCase service}}.{{name}}>>> = {}
17+
{{else}}
18+
options: UseMutationOptionsWrapper<Awaited<ReturnType<typeof client.{{camelCase service}}.{{name}}>>, unknown,
19+
{{~#if parametersBody}} {{parametersBody.type}}{{else}} void{{/if~}}
20+
> = {}
21+
{{/equals}}
22+
) => {
1423
const { client } = use{{{pascalCase ../clientName}}}()
1524
{{#equals method 'GET'}}
16-
const { data, ...rest } = useQuery(['{{ camelCase service}}', '{{ camelCase name }}', {{#each parameters}}{{name}}, {{/each}}], async () => {
17-
return client.{{camelCase service}}.{{name}}({{#if parameters}}{
18-
{{#each parameters}}
19-
{{name}},
20-
{{/each}}
21-
}{{/if}});
22-
});
25+
const { data, ...rest } = useQuery<Awaited<ReturnType<typeof client.{{camelCase service}}.{{name}}>>>(
26+
['{{camelCase service}}', '{{ camelCase name }}'{{#if parameters}}, {{>parametersUntyped}}{{/if}}],
27+
() => client.{{camelCase service}}.{{name}}({{#if parameters}}{{>parametersUntyped}}{{/if}}),
28+
options
29+
);
2330
return { ...data, ...rest } as const
2431
{{else}}
25-
return useMutation(async () => {
26-
return client.{{camelCase service}}.{{name}}({{#if parameters}}{
27-
{{#each parameters}}
28-
{{name}},
29-
{{/each}}
30-
}{{/if}});
31-
});
32+
if (!options?.onSuccess) {
33+
const queryClient = useQueryClient()
34+
options.onSuccess = async () => {
35+
await queryClient.invalidateQueries('{{camelCase service}}')
36+
}
37+
}
38+
return useMutation<Awaited<ReturnType<typeof client.{{camelCase service}}.{{name}}>>, unknown,
39+
{{~#if parametersBody}} {{parametersBody.type}}{{else}} void{{/if~}}
40+
>(
41+
['{{camelCase service}}', '{{ camelCase name }}'{{#if parameters}}, {{>parametersUntyped}}{{/if}}],
42+
() => client.{{camelCase service}}.{{name}}({{#if parameters}}{{>parametersUntyped}}{{/if}}),
43+
options
44+
);
3245
{{/equals}}
3346
};
3447

src/templates/exportService.hbs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,13 @@ export class {{{name}}}{{{@root.postfix}}} {
4848
*/
4949
{{#if @root.exportClient}}
5050
public {{{name}}}(
51-
{{~>parameters~}},
51+
{{~#if parameters}}{{~>parameters~}},{{/if}}
5252
customHeaders: Record<string, any> = {}
5353
): CancelablePromise<{{>result}}> {
5454
return this.httpRequest.request({
5555
{{else}}
5656
public static {{{name}}}(
57-
{{~>parameters~}},
57+
{{#if parameters}}{{~>parameters~}},{{/if}}
5858
customHeaders: Record<string, any> = {}
5959
): CancelablePromise<{{>result}}> {
6060
return __request(OpenAPI, {
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{{~#if parameters}}
2+
{{~#if parametersPath}}
3+
{{~#each parametersPath}}
4+
{{~{name}}}{{#unless @last}},{{/unless}}
5+
{{~/each}}
6+
{{~/if}}
7+
{{~#if parametersBody}}
8+
{{~#if parametersPath}},{{/if}}
9+
{{~#with parametersBody}}
10+
{{~{name}}}
11+
{{~/with}}
12+
{{~#if parametersQuery}},{{/if}}
13+
{{~/if}}
14+
{{~#if parametersQuery}}
15+
{{~#if parametersPath}}{{#unless parametersBody}},{{/unless}}{{/if~}}
16+
queryParams
17+
{{~/if}}
18+
{{~/if}}

src/utils/registerHandlebarTemplates.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import templateUseClient from '../templates/useClient.hbs';
66
import templateCoreApiError from '../templates/core/ApiError.hbs';
77
import templateCoreApiRequestOptions from '../templates/core/ApiRequestOptions.hbs';
88
import templateCoreApiResult from '../templates/core/ApiResult.hbs';
9+
import templateCoreHookUtils from '../templates/core/HookUtils.hbs';
910
import axiosGetHeaders from '../templates/core/axios/getHeaders.hbs';
1011
import axiosGetRequestBody from '../templates/core/axios/getRequestBody.hbs';
1112
import axiosGetResponseBody from '../templates/core/axios/getResponseBody.hbs';
@@ -62,6 +63,7 @@ import partialIsNullable from '../templates/partials/isNullable.hbs';
6263
import partialIsReadOnly from '../templates/partials/isReadOnly.hbs';
6364
import partialIsRequired from '../templates/partials/isRequired.hbs';
6465
import partialParameters from '../templates/partials/parameters.hbs';
66+
import partialParametersUntyped from '../templates/partials/parametersUntyped.hbs';
6567
import partialResult from '../templates/partials/result.hbs';
6668
import partialSchema from '../templates/partials/schema.hbs';
6769
import partialSchemaArray from '../templates/partials/schemaArray.hbs';
@@ -100,6 +102,7 @@ export interface Templates {
100102
request: Handlebars.TemplateDelegate;
101103
baseHttpRequest: Handlebars.TemplateDelegate;
102104
httpRequest: Handlebars.TemplateDelegate;
105+
hookUtils: Handlebars.TemplateDelegate;
103106
};
104107
}
105108

@@ -134,6 +137,7 @@ export const registerHandlebarTemplates = (root: {
134137
request: Handlebars.template(templateCoreRequest),
135138
baseHttpRequest: Handlebars.template(templateCoreBaseHttpRequest),
136139
httpRequest: Handlebars.template(templateCoreHttpRequest),
140+
hookUtils: Handlebars.template(templateCoreHookUtils),
137141
},
138142
};
139143

@@ -147,6 +151,7 @@ export const registerHandlebarTemplates = (root: {
147151
Handlebars.registerPartial('isReadOnly', Handlebars.template(partialIsReadOnly));
148152
Handlebars.registerPartial('isRequired', Handlebars.template(partialIsRequired));
149153
Handlebars.registerPartial('parameters', Handlebars.template(partialParameters));
154+
Handlebars.registerPartial('parametersUntyped', Handlebars.template(partialParametersUntyped));
150155
Handlebars.registerPartial('result', Handlebars.template(partialResult));
151156
Handlebars.registerPartial('schema', Handlebars.template(partialSchema));
152157
Handlebars.registerPartial('schemaArray', Handlebars.template(partialSchemaArray));

src/utils/writeClient.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ describe('writeClient', () => {
3535
request: () => 'request',
3636
baseHttpRequest: () => 'baseHttpRequest',
3737
httpRequest: () => 'httpRequest',
38+
hookUtils: () => 'hookUtils',
3839
},
3940
};
4041

src/utils/writeClientClass.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ describe('writeClientClass', () => {
3535
request: () => 'request',
3636
baseHttpRequest: () => 'baseHttpRequest',
3737
httpRequest: () => 'httpRequest',
38+
hookUtils: () => 'hookUtils',
3839
},
3940
};
4041

src/utils/writeClientCore.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ describe('writeClientCore', () => {
3737
request: () => 'request',
3838
baseHttpRequest: () => 'baseHttpRequest',
3939
httpRequest: () => 'httpRequest',
40+
hookUtils: () => 'hookUtils',
4041
},
4142
};
4243

src/utils/writeClientCore.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export const writeClientCore = async (
4343
await writeFile(resolve(outputPath, 'ApiResult.ts'), i(templates.core.apiResult(context), indent));
4444
await writeFile(resolve(outputPath, 'CancelablePromise.ts'), i(templates.core.cancelablePromise(context), indent));
4545
await writeFile(resolve(outputPath, 'request.ts'), i(templates.core.request(context), indent));
46+
await writeFile(resolve(outputPath, 'HookUtils.ts'), i(templates.core.hookUtils(context), indent));
4647

4748
if (isDefined(clientName)) {
4849
await writeFile(resolve(outputPath, 'BaseHttpRequest.ts'), i(templates.core.baseHttpRequest(context), indent));

0 commit comments

Comments
 (0)