@@ -18,17 +18,74 @@ export interface SWRPluginConfig extends ClientSideBasePluginConfig {
18
18
autogenSWRKey : boolean
19
19
}
20
20
21
+ export interface Operation {
22
+ node : OperationDefinitionNode
23
+ documentVariableName : string
24
+ operationType : string
25
+ operationResultType : string
26
+ operationVariablesTypes : string
27
+ }
28
+
29
+ export interface ComposeQueryHandlerConfig {
30
+ autogenKey : boolean
31
+ infinite : boolean
32
+ rawRequest : boolean
33
+ }
34
+
35
+ const composeQueryHandler = (
36
+ operation : Operation ,
37
+ config : ComposeQueryHandlerConfig
38
+ ) : string [ ] => {
39
+ const codes : string [ ] = [ ]
40
+ const { node } = operation
41
+ const optionalVariables =
42
+ ! node . variableDefinitions ||
43
+ node . variableDefinitions . length === 0 ||
44
+ node . variableDefinitions . every (
45
+ ( v ) => v . type . kind !== Kind . NON_NULL_TYPE || v . defaultValue
46
+ )
47
+ ? '?'
48
+ : ''
49
+ const name = node . name . value
50
+ const pascalName = pascalCase ( node . name . value )
51
+ const responseType = config . rawRequest
52
+ ? `SWRRawResponse<${ operation . operationResultType } >`
53
+ : operation . operationResultType
54
+ const variablesType = operation . operationVariablesTypes
55
+
56
+ codes . push ( `use${ pascalName } (${
57
+ config . autogenKey ? '' : 'key: SWRKeyInterface, '
58
+ } variables${ optionalVariables } : ${ variablesType } , config?: SWRConfigInterface<${ responseType } >) {
59
+ return useSWR<${ responseType } >(${
60
+ config . autogenKey
61
+ ? `genKey<${ variablesType } >('${ pascalName } ', variables)`
62
+ : 'key'
63
+ } , () => sdk.${ name } (variables), config);
64
+ }` )
65
+
66
+ if ( config . infinite ) {
67
+ codes . push ( `use${ pascalName } Infinite(${
68
+ config . autogenKey ? '' : 'id: string, '
69
+ } getKey: SWRInfiniteKeyLoader<${ responseType } , ${ variablesType } >, variables${ optionalVariables } : ${ variablesType } , config?: SWRInfiniteConfigInterface<${ responseType } >) {
70
+ return useSWRInfinite<${ responseType } >(
71
+ utilsForInfinite.generateGetKey<${ responseType } , ${ variablesType } >(${
72
+ config . autogenKey
73
+ ? `genKey<${ variablesType } >('${ pascalName } ', variables)`
74
+ : 'id'
75
+ } , getKey),
76
+ utilsForInfinite.generateFetcher<${ responseType } , ${ variablesType } >(sdk.${ name } , variables),
77
+ config);
78
+ }` )
79
+ }
80
+
81
+ return codes
82
+ }
83
+
21
84
export class SWRVisitor extends ClientSideBaseVisitor <
22
85
RawSWRPluginConfig ,
23
86
SWRPluginConfig
24
87
> {
25
- private _operationsToInclude : {
26
- node : OperationDefinitionNode
27
- documentVariableName : string
28
- operationType : string
29
- operationResultType : string
30
- operationVariablesTypes : string
31
- } [ ] = [ ]
88
+ private _operationsToInclude : Operation [ ] = [ ]
32
89
33
90
private _enabledInfinite = false
34
91
@@ -95,10 +152,11 @@ export class SWRVisitor extends ClientSideBaseVisitor<
95
152
}
96
153
97
154
public get sdkContent ( ) : string {
98
- const { excludeQueries, autogenSWRKey } = this . config
155
+ const codes : string [ ] = [ ]
156
+ const { config } = this
99
157
const disabledexcludeQueries =
100
- ! excludeQueries ||
101
- ( Array . isArray ( excludeQueries ) && ! excludeQueries . length )
158
+ ! config . excludeQueries ||
159
+ ( Array . isArray ( config . excludeQueries ) && ! config . excludeQueries . length )
102
160
const allPossibleActions = this . _operationsToInclude
103
161
. filter ( ( o ) => {
104
162
if ( o . operationType !== 'Query' ) {
@@ -107,113 +165,42 @@ export class SWRVisitor extends ClientSideBaseVisitor<
107
165
if ( disabledexcludeQueries ) {
108
166
return true
109
167
}
110
- const name = o . node . name . value
111
- return ! glob . isMatch ( name , excludeQueries )
112
- } )
113
- . map ( ( o ) => {
114
- const optionalVariables =
115
- ! o . node . variableDefinitions ||
116
- o . node . variableDefinitions . length === 0 ||
117
- o . node . variableDefinitions . every (
118
- ( v ) => v . type . kind !== Kind . NON_NULL_TYPE || v . defaultValue
119
- )
120
- const name = o . node . name . value
121
- const pascalName = pascalCase ( o . node . name . value )
122
- const enabledInfinite =
123
- this . _enabledInfinite &&
124
- glob . isMatch ( name , this . config . useSWRInfinite )
125
- const codes : string [ ] = [ ]
126
-
127
- if ( this . config . rawRequest ) {
128
- codes . push ( `use${ pascalCase ( o . node . name . value ) } (${
129
- autogenSWRKey ? '' : 'key: SWRKeyInterface, '
130
- } variables${ optionalVariables ? '?' : '' } : ${
131
- o . operationVariablesTypes
132
- } , config?: SWRConfigInterface<SWRRawResponse<${
133
- o . operationResultType
134
- } >}>) {
135
- return useSWR<SWRRawResponse<${ o . operationResultType } >>(${
136
- autogenSWRKey
137
- ? `genKey<${ o . operationVariablesTypes } >('${ pascalName } ', variables)`
138
- : 'key'
139
- } , () => sdk.${ o . node . name . value } (variables), config);
140
- }` )
141
-
142
- if ( enabledInfinite ) {
143
- codes . push ( `use${ pascalCase (
144
- o . node . name . value
145
- ) } Infinite(getKey: SWRInfiniteKeyLoader<SWRRawResponse<${
146
- o . operationResultType
147
- } >>, variables${ optionalVariables ? '?' : '' } : ${
148
- o . operationVariablesTypes
149
- } , config?: SWRInfiniteConfigInterface<SWRRawResponse<${
150
- o . operationResultType
151
- } >>) {
152
- return useSWRInfinite<SWRRawResponse<${
153
- o . operationResultType
154
- } >>(getKey, () => sdk.${ o . node . name . value } (variables), config);
155
- }` )
156
- }
157
- return codes
158
- }
159
-
160
- codes . push ( `use${ pascalName } (${
161
- autogenSWRKey ? '' : 'key: SWRKeyInterface, '
162
- } variables${ optionalVariables ? '?' : '' } : ${
163
- o . operationVariablesTypes
164
- } , config?: SWRConfigInterface<${ o . operationResultType } >) {
165
- return useSWR<${ o . operationResultType } >(${
166
- autogenSWRKey
167
- ? `genKey<${ o . operationVariablesTypes } >('${ pascalName } ', variables)`
168
- : 'key'
169
- } , () => sdk.${ o . node . name . value } (variables), config);
170
- }` )
171
-
172
- if ( enabledInfinite ) {
173
- codes . push ( `use${ pascalCase (
174
- o . node . name . value
175
- ) } Infinite(id: string, getKey: SWRInfiniteKeyLoader<${
176
- o . operationResultType
177
- } , ${ o . operationVariablesTypes } >, variables${
178
- optionalVariables ? '?' : ''
179
- } : ${
180
- o . operationVariablesTypes
181
- } , config?: SWRInfiniteConfigInterface<${ o . operationResultType } >) {
182
- return useSWRInfinite<${ o . operationResultType } >(
183
- utilsForInfinite.generateGetKey<${ o . operationResultType } , ${
184
- o . operationVariablesTypes
185
- } >(id, getKey),
186
- utilsForInfinite.generateFetcher<${ o . operationResultType } , ${
187
- o . operationVariablesTypes
188
- } >(sdk.${ o . node . name . value } , variables),
189
- config);
190
- }` )
191
- }
192
-
193
- return codes
168
+ return ! glob . isMatch ( o . node . name . value , config . excludeQueries )
194
169
} )
170
+ . map ( ( o ) =>
171
+ composeQueryHandler ( o , {
172
+ autogenKey : config . autogenSWRKey ,
173
+ infinite :
174
+ this . _enabledInfinite &&
175
+ glob . isMatch ( o . node . name . value , config . useSWRInfinite ) ,
176
+ rawRequest : config . rawRequest ,
177
+ } )
178
+ )
195
179
. reduce ( ( p , c ) => p . concat ( c ) , [ ] )
196
180
. map ( ( s ) => indentMultiline ( s , 2 ) )
197
181
198
- const types : string [ ] = [ ]
199
- if ( this . config . rawRequest ) {
200
- types . push (
182
+ // Add type of SWRRawResponse
183
+ if ( config . rawRequest ) {
184
+ codes . push (
201
185
`type SWRRawResponse<Data = any> = { data?: Data | undefined; extensions?: any; headers: Headers; status: number; errors?: GraphQLError[] | undefined; };`
202
186
)
203
187
}
188
+
189
+ // Add type of SWRInfiniteKeyLoader
204
190
if ( this . _enabledInfinite ) {
205
- types . push ( `export type SWRInfiniteKeyLoader<Data = unknown, Variables = unknown> = (
191
+ codes . push ( `export type SWRInfiniteKeyLoader<Data = unknown, Variables = unknown> = (
206
192
index: number,
207
193
previousPageData: Data | null
208
194
) => [keyof Variables, Variables[keyof Variables] | null] | null;` )
209
195
}
210
196
211
- return `${ types . join ( '\n' ) }
212
- export function getSdkWithHooks(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) {
213
- const sdk = getSdk(client, withWrapper);
214
- ${
215
- this . _enabledInfinite
216
- ? ` const utilsForInfinite = {
197
+ // Add getSdkWithHooks function
198
+ codes . push ( `export function getSdkWithHooks(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) {
199
+ const sdk = getSdk(client, withWrapper);` )
200
+
201
+ // Add the utility for useSWRInfinite
202
+ if ( this . _enabledInfinite ) {
203
+ codes . push ( ` const utilsForInfinite = {
217
204
generateGetKey: <Data = unknown, Variables = unknown>(
218
205
id: string,
219
206
getKey: SWRInfiniteKeyLoader<Data, Variables>
226
213
fieldName: keyof Variables,
227
214
fieldValue: Variables[typeof fieldName]
228
215
) => query({ ...variables, [fieldName]: fieldValue } as Variables)
229
- }\n`
230
- : ''
231
- } ${
232
- autogenSWRKey
233
- ? ' const genKey = <V extends Record<string, unknown> = Record<string, unknown>>(name: string, object: V = {} as V): SWRKeyInterface => [name, ...Object.keys(object).sort().map(key => object[key])];\n'
234
- : ''
235
- } return {
216
+ }` )
217
+ }
218
+
219
+ // Add the function for auto-generation key for SWR
220
+ if ( config . autogenSWRKey ) {
221
+ codes . push (
222
+ ` const genKey = <V extends Record<string, unknown> = Record<string, unknown>>(name: string, object: V = {} as V): SWRKeyInterface => [name, ...Object.keys(object).sort().map(key => object[key])];`
223
+ )
224
+ }
225
+
226
+ // Add return statement for getSdkWithHooks function and close the function
227
+ codes . push ( ` return {
236
228
...sdk,
237
229
${ allPossibleActions . join ( ',\n' ) }
238
230
};
239
- }
240
- export type SdkWithHooks = ReturnType<typeof getSdkWithHooks>;`
231
+ }` )
232
+
233
+ // Add type of Sdk
234
+ codes . push ( `export type SdkWithHooks = ReturnType<typeof getSdkWithHooks>;` )
235
+
236
+ return codes . join ( '\n' )
241
237
}
242
238
}
0 commit comments