Skip to content

Commit 31af24c

Browse files
msutkowskiLenz Weber
andcommitted
Codegen: update hooks to accept a boolean or granular config object (#1953)
* Add LazyQuery hooks to generateEndpoints * Add granular hook generation config * docs * Update snapshots Co-authored-by: Lenz Weber <lenz.weber@mayflower.de>
1 parent 6a24024 commit 31af24c

File tree

7 files changed

+348
-37
lines changed

7 files changed

+348
-37
lines changed

docs/rtk-query/usage/code-generation.mdx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,9 @@ interface SimpleUsage {
8787
exportName?: string
8888
argSuffix?: string
8989
responseSuffix?: string
90-
hooks?: boolean
90+
hooks?:
91+
| boolean
92+
| { queries: boolean; lazyQueries: boolean; mutations: boolean }
9193
outputFile: string
9294
filterEndpoints?:
9395
| string
@@ -131,6 +133,10 @@ const withOverride: ConfigFile = {
131133
}
132134
```
133135

136+
#### Generating hooks
137+
138+
Setting `hooks: true` will generate `useQuery` and `useMuation` hook exports. If you also want `useLazyQuery` hooks generated or more granular control, you can also pass an object in the shape of: `{ queries: boolean; lazyQueries: boolean; mutations: boolean }`.
139+
134140
#### Multiple output files
135141

136142
```ts no-transpile title="openapi-config.ts"

packages/rtk-query-codegen-openapi/src/generate.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,14 @@ export async function generateApi(
142142
...Object.values(interfaces),
143143
...apiGen['aliases'],
144144
...(hooks
145-
? [generateReactHooks({ exportName: generatedApiName, operationDefinitions, endpointOverrides })]
145+
? [
146+
generateReactHooks({
147+
exportName: generatedApiName,
148+
operationDefinitions,
149+
endpointOverrides,
150+
config: hooks,
151+
}),
152+
]
146153
: []),
147154
],
148155
factory.createToken(ts.SyntaxKind.EndOfFileToken),

packages/rtk-query-codegen-openapi/src/generators/react-hooks.ts

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,87 @@
11
import ts from 'typescript';
22
import { getOperationName } from '@rtk-query/oazapfts-patched/lib/codegen/generate';
33
import { capitalize, isQuery } from '../utils';
4-
import type { OperationDefinition, EndpointOverrides } from '../types';
4+
import type { OperationDefinition, EndpointOverrides, ConfigFile } from '../types';
55
import { getOverrides } from '../generate';
66
import { factory } from '../utils/factory';
77

8+
type HooksConfigOptions = NonNullable<ConfigFile['hooks']>;
9+
810
type GetReactHookNameParams = {
911
operationDefinition: OperationDefinition;
1012
endpointOverrides: EndpointOverrides[] | undefined;
13+
config: HooksConfigOptions;
1114
};
1215

13-
const getReactHookName = ({
14-
operationDefinition: { verb, path, operation },
15-
operationDefinition,
16-
endpointOverrides,
17-
}: GetReactHookNameParams) => {
18-
const overrides = getOverrides(operationDefinition, endpointOverrides);
16+
type CreateBindingParams = {
17+
operationDefinition: OperationDefinition;
18+
overrides?: EndpointOverrides;
19+
isLazy?: boolean;
20+
};
1921

20-
return factory.createBindingElement(
22+
const createBinding = ({
23+
operationDefinition: { verb, path, operation },
24+
overrides,
25+
isLazy = false,
26+
}: CreateBindingParams) =>
27+
factory.createBindingElement(
2128
undefined,
2229
undefined,
2330
factory.createIdentifier(
24-
`use${capitalize(getOperationName(verb, path, operation.operationId))}${
31+
`use${isLazy ? 'Lazy' : ''}${capitalize(getOperationName(verb, path, operation.operationId))}${
2532
isQuery(verb, overrides) ? 'Query' : 'Mutation'
2633
}`
2734
),
2835
undefined
2936
);
37+
38+
const getReactHookName = ({ operationDefinition, endpointOverrides, config }: GetReactHookNameParams) => {
39+
const overrides = getOverrides(operationDefinition, endpointOverrides);
40+
41+
const baseParams = {
42+
operationDefinition,
43+
overrides,
44+
};
45+
46+
const _isQuery = isQuery(operationDefinition.verb, overrides);
47+
48+
// If `config` is true, just generate everything
49+
if (typeof config === 'boolean') {
50+
return createBinding(baseParams);
51+
}
52+
53+
// `config` is an object and we need to check for the configuration of each property
54+
if (_isQuery) {
55+
return [
56+
...(config.queries ? [createBinding(baseParams)] : []),
57+
...(config.lazyQueries ? [createBinding({ ...baseParams, isLazy: true })] : []),
58+
];
59+
}
60+
61+
return config.mutations ? createBinding(baseParams) : [];
3062
};
3163

3264
type GenerateReactHooksParams = {
3365
exportName: string;
3466
operationDefinitions: OperationDefinition[];
3567
endpointOverrides: EndpointOverrides[] | undefined;
68+
config: HooksConfigOptions;
3669
};
37-
export const generateReactHooks = ({ exportName, operationDefinitions, endpointOverrides }: GenerateReactHooksParams) =>
70+
export const generateReactHooks = ({
71+
exportName,
72+
operationDefinitions,
73+
endpointOverrides,
74+
config,
75+
}: GenerateReactHooksParams) =>
3876
factory.createVariableStatement(
3977
[factory.createModifier(ts.SyntaxKind.ExportKeyword)],
4078
factory.createVariableDeclarationList(
4179
[
4280
factory.createVariableDeclaration(
4381
factory.createObjectBindingPattern(
44-
operationDefinitions.map((operationDefinition) =>
45-
getReactHookName({ operationDefinition, endpointOverrides })
46-
)
82+
operationDefinitions
83+
.map((operationDefinition) => getReactHookName({ operationDefinition, endpointOverrides, config }))
84+
.flat()
4785
),
4886
undefined,
4987
undefined,

packages/rtk-query-codegen-openapi/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import path from 'path';
22
import fs from 'fs';
33
import type { CommonOptions, ConfigFile, GenerationOptions, OutputFileOptions } from './types';
44
import { isValidUrl, prettify } from './utils';
5-
export { ConfigFile } from './types';
5+
export type { ConfigFile } from './types';
66

77
export async function generateEndpoints(options: GenerationOptions): Promise<string | void> {
88
const schemaLocation = options.schemaFile;

packages/rtk-query-codegen-openapi/src/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import * as ts from 'typescript';
21
import type { OpenAPIV3 } from 'openapi-types';
32

43
export type OperationDefinition = {
@@ -48,9 +47,10 @@ export interface CommonOptions {
4847
*/
4948
responseSuffix?: string;
5049
/**
51-
* defaults to false
50+
* defaults to `false`
51+
* `true` will generate hooks for queries and mutations, but no lazyQueries
5252
*/
53-
hooks?: boolean;
53+
hooks?: boolean | { queries: boolean; lazyQueries: boolean; mutations: boolean };
5454

5555
/**
5656
* defaults to false

0 commit comments

Comments
 (0)