@graphql-codegen/typescript-react-query 3.5.14-alpha-7a65ba05d.0 → 3.6.0-alpha-29eb1293b.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
- import { CustomFetch } from './config';
2
- import { FetcherRenderer } from './fetcher';
1
+ import { CustomFetch } from './config.js';
2
+ import { FetcherRenderer } from './fetcher.js';
3
3
  import { OperationDefinitionNode } from 'graphql';
4
- import { ReactQueryVisitor } from './visitor';
4
+ import { ReactQueryVisitor } from './visitor.js';
5
5
  export declare class CustomMapperFetcher implements FetcherRenderer {
6
6
  private visitor;
7
7
  private _mapper;
@@ -1,7 +1,7 @@
1
- import { FetcherRenderer } from './fetcher';
2
- import { HardcodedFetch } from './config';
1
+ import { FetcherRenderer } from './fetcher.js';
2
+ import { HardcodedFetch } from './config.js';
3
3
  import { OperationDefinitionNode } from 'graphql';
4
- import { ReactQueryVisitor } from './visitor';
4
+ import { ReactQueryVisitor } from './visitor.js';
5
5
  export declare class HardcodedFetchFetcher implements FetcherRenderer {
6
6
  private visitor;
7
7
  private config;
@@ -1,6 +1,6 @@
1
- import { FetcherRenderer } from './fetcher';
1
+ import { FetcherRenderer } from './fetcher.js';
2
2
  import { OperationDefinitionNode } from 'graphql';
3
- import { ReactQueryVisitor } from './visitor';
3
+ import { ReactQueryVisitor } from './visitor.js';
4
4
  export declare class FetchFetcher implements FetcherRenderer {
5
5
  private visitor;
6
6
  constructor(visitor: ReactQueryVisitor);
@@ -1,6 +1,6 @@
1
- import { FetcherRenderer } from './fetcher';
1
+ import { FetcherRenderer } from './fetcher.js';
2
2
  import { OperationDefinitionNode } from 'graphql';
3
- import { ReactQueryVisitor } from './visitor';
3
+ import { ReactQueryVisitor } from './visitor.js';
4
4
  export declare class GraphQLRequestClientFetcher implements FetcherRenderer {
5
5
  private visitor;
6
6
  constructor(visitor: ReactQueryVisitor);
File without changes
@@ -1,6 +1,6 @@
1
1
  import { PluginFunction, PluginValidateFn, Types } from '@graphql-codegen/plugin-helpers';
2
- import { ReactQueryRawPluginConfig } from './config';
3
- import { ReactQueryVisitor } from './visitor';
2
+ import { ReactQueryRawPluginConfig } from './config.js';
3
+ import { ReactQueryVisitor } from './visitor.js';
4
4
  export declare const plugin: PluginFunction<ReactQueryRawPluginConfig, Types.ComplexPluginOutput>;
5
5
  export declare const validate: PluginValidateFn<any>;
6
6
  export { ReactQueryVisitor };
@@ -1,7 +1,7 @@
1
1
  import { ClientSideBasePluginConfig, ClientSideBaseVisitor, LoadedFragment } from '@graphql-codegen/visitor-plugin-common';
2
2
  import { GraphQLSchema, OperationDefinitionNode } from 'graphql';
3
- import { FetcherRenderer } from './fetcher';
4
- import { ReactQueryRawPluginConfig } from './config';
3
+ import { FetcherRenderer } from './fetcher.js';
4
+ import { ReactQueryRawPluginConfig } from './config.js';
5
5
  import { Types } from '@graphql-codegen/plugin-helpers';
6
6
  export interface ReactQueryPluginConfig extends ClientSideBasePluginConfig {
7
7
  errorType: string;
package/index.js DELETED
@@ -1,592 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
6
-
7
- const graphql = require('graphql');
8
- const pluginHelpers = require('@graphql-codegen/plugin-helpers');
9
- const visitorPluginCommon = require('@graphql-codegen/visitor-plugin-common');
10
- const autoBind = _interopDefault(require('auto-bind'));
11
- const changeCaseAll = require('change-case-all');
12
- const path = require('path');
13
-
14
- function generateQueryVariablesSignature(hasRequiredVariables, operationVariablesTypes) {
15
- return `variables${hasRequiredVariables ? '' : '?'}: ${operationVariablesTypes}`;
16
- }
17
- function generateInfiniteQueryKey(node, hasRequiredVariables) {
18
- if (hasRequiredVariables)
19
- return `['${node.name.value}.infinite', variables]`;
20
- return `variables === undefined ? ['${node.name.value}.infinite'] : ['${node.name.value}.infinite', variables]`;
21
- }
22
- function generateInfiniteQueryKeyMaker(node, operationName, operationVariablesTypes, hasRequiredVariables) {
23
- const signature = generateQueryVariablesSignature(hasRequiredVariables, operationVariablesTypes);
24
- return `\nuseInfinite${operationName}.getKey = (${signature}) => ${generateInfiniteQueryKey(node, hasRequiredVariables)};\n`;
25
- }
26
- function generateQueryKey(node, hasRequiredVariables) {
27
- if (hasRequiredVariables)
28
- return `['${node.name.value}', variables]`;
29
- return `variables === undefined ? ['${node.name.value}'] : ['${node.name.value}', variables]`;
30
- }
31
- function generateQueryKeyMaker(node, operationName, operationVariablesTypes, hasRequiredVariables) {
32
- const signature = generateQueryVariablesSignature(hasRequiredVariables, operationVariablesTypes);
33
- return `\nuse${operationName}.getKey = (${signature}) => ${generateQueryKey(node, hasRequiredVariables)};\n`;
34
- }
35
- function generateMutationKey(node) {
36
- return `['${node.name.value}']`;
37
- }
38
- function generateMutationKeyMaker(node, operationName) {
39
- return `\nuse${operationName}.getKey = () => ${generateMutationKey(node)};\n`;
40
- }
41
-
42
- class CustomMapperFetcher {
43
- constructor(visitor, customFetcher) {
44
- this.visitor = visitor;
45
- if (typeof customFetcher === 'string') {
46
- customFetcher = { func: customFetcher };
47
- }
48
- this._mapper = visitorPluginCommon.parseMapper(customFetcher.func);
49
- this._isReactHook = customFetcher.isReactHook;
50
- }
51
- getFetcherFnName(operationResultType, operationVariablesTypes) {
52
- return `${this._mapper.type}<${operationResultType}, ${operationVariablesTypes}>`;
53
- }
54
- generateFetcherImplementaion() {
55
- if (this._mapper.isExternal) {
56
- return visitorPluginCommon.buildMapperImport(this._mapper.source, [
57
- {
58
- identifier: this._mapper.type,
59
- asDefault: this._mapper.default,
60
- },
61
- ], this.visitor.config.useTypeImports);
62
- }
63
- return null;
64
- }
65
- generateInfiniteQueryHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
66
- const variables = `variables${hasRequiredVariables ? '' : '?'}: ${operationVariablesTypes}`;
67
- const hookConfig = this.visitor.queryMethodMap;
68
- this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.infiniteQuery.hook);
69
- this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.infiniteQuery.options);
70
- const options = `options?: ${hookConfig.infiniteQuery.options}<${operationResultType}, TError, TData>`;
71
- const typedFetcher = this.getFetcherFnName(operationResultType, operationVariablesTypes);
72
- const implHookOuter = this._isReactHook ? `const query = ${typedFetcher}(${documentVariableName})` : '';
73
- const impl = this._isReactHook
74
- ? `(metaData) => query({...variables, ...(metaData.pageParam ?? {})})`
75
- : `(metaData) => ${typedFetcher}(${documentVariableName}, {...variables, ...(metaData.pageParam ?? {})})()`;
76
- return `export const useInfinite${operationName} = <
77
- TData = ${operationResultType},
78
- TError = ${this.visitor.config.errorType}
79
- >(
80
- ${variables},
81
- ${options}
82
- ) =>{
83
- ${implHookOuter}
84
- return ${hookConfig.infiniteQuery.hook}<${operationResultType}, TError, TData>(
85
- ${generateInfiniteQueryKey(node, hasRequiredVariables)},
86
- ${impl},
87
- options
88
- )};`;
89
- }
90
- generateQueryHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
91
- const variables = `variables${hasRequiredVariables ? '' : '?'}: ${operationVariablesTypes}`;
92
- const hookConfig = this.visitor.queryMethodMap;
93
- this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.query.hook);
94
- this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.query.options);
95
- const options = `options?: ${hookConfig.query.options}<${operationResultType}, TError, TData>`;
96
- const typedFetcher = this.getFetcherFnName(operationResultType, operationVariablesTypes);
97
- const impl = this._isReactHook
98
- ? `${typedFetcher}(${documentVariableName}).bind(null, variables)`
99
- : `${typedFetcher}(${documentVariableName}, variables)`;
100
- return `export const use${operationName} = <
101
- TData = ${operationResultType},
102
- TError = ${this.visitor.config.errorType}
103
- >(
104
- ${variables},
105
- ${options}
106
- ) =>
107
- ${hookConfig.query.hook}<${operationResultType}, TError, TData>(
108
- ${generateQueryKey(node, hasRequiredVariables)},
109
- ${impl},
110
- options
111
- );`;
112
- }
113
- generateMutationHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
114
- const variables = `variables?: ${operationVariablesTypes}`;
115
- const hookConfig = this.visitor.queryMethodMap;
116
- this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.mutation.hook);
117
- this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.mutation.options);
118
- const options = `options?: ${hookConfig.mutation.options}<${operationResultType}, TError, ${operationVariablesTypes}, TContext>`;
119
- const typedFetcher = this.getFetcherFnName(operationResultType, operationVariablesTypes);
120
- const impl = this._isReactHook
121
- ? `${typedFetcher}(${documentVariableName})`
122
- : `(${variables}) => ${typedFetcher}(${documentVariableName}, variables)()`;
123
- return `export const use${operationName} = <
124
- TError = ${this.visitor.config.errorType},
125
- TContext = unknown
126
- >(${options}) =>
127
- ${hookConfig.mutation.hook}<${operationResultType}, TError, ${operationVariablesTypes}, TContext>(
128
- ${generateMutationKey(node)},
129
- ${impl},
130
- options
131
- );`;
132
- }
133
- generateFetcherFetch(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
134
- // We can't generate a fetcher field since we can't call react hooks outside of a React Fucntion Component
135
- // Related: https://reactjs.org/docs/hooks-rules.html
136
- if (this._isReactHook)
137
- return '';
138
- const variables = `variables${hasRequiredVariables ? '' : '?'}: ${operationVariablesTypes}`;
139
- const typedFetcher = this.getFetcherFnName(operationResultType, operationVariablesTypes);
140
- const impl = `${typedFetcher}(${documentVariableName}, variables, options)`;
141
- return `\nuse${operationName}.fetcher = (${variables}, options?: RequestInit['headers']) => ${impl};`;
142
- }
143
- }
144
-
145
- class FetchFetcher {
146
- constructor(visitor) {
147
- this.visitor = visitor;
148
- }
149
- generateFetcherImplementaion() {
150
- return `
151
- function fetcher<TData, TVariables>(endpoint: string, requestInit: RequestInit, query: string, variables?: TVariables) {
152
- return async (): Promise<TData> => {
153
- const res = await fetch(endpoint, {
154
- method: 'POST',
155
- ...requestInit,
156
- body: JSON.stringify({ query, variables }),
157
- });
158
-
159
- const json = await res.json();
160
-
161
- if (json.errors) {
162
- const { message } = json.errors[0];
163
-
164
- throw new Error(message);
165
- }
166
-
167
- return json.data;
168
- }
169
- }`;
170
- }
171
- generateInfiniteQueryHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
172
- const variables = generateQueryVariablesSignature(hasRequiredVariables, operationVariablesTypes);
173
- const hookConfig = this.visitor.queryMethodMap;
174
- this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.infiniteQuery.hook);
175
- this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.infiniteQuery.options);
176
- const options = `options?: ${hookConfig.query.options}<${operationResultType}, TError, TData>`;
177
- return `export const useInfinite${operationName} = <
178
- TData = ${operationResultType},
179
- TError = ${this.visitor.config.errorType}
180
- >(
181
- dataSource: { endpoint: string, fetchParams?: RequestInit },
182
- pageParamKey: keyof ${operationVariablesTypes},
183
- ${variables},
184
- ${options}
185
- ) =>
186
- ${hookConfig.infiniteQuery.hook}<${operationResultType}, TError, TData>(
187
- ${generateInfiniteQueryKey(node, hasRequiredVariables)},
188
- (metaData) => fetcher<${operationResultType}, ${operationVariablesTypes}>(dataSource.endpoint, dataSource.fetchParams || {}, ${documentVariableName}, {...variables, ...(metaData.pageParam ?? {})})(),
189
- options
190
- );`;
191
- }
192
- generateQueryHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
193
- const variables = generateQueryVariablesSignature(hasRequiredVariables, operationVariablesTypes);
194
- const hookConfig = this.visitor.queryMethodMap;
195
- this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.query.hook);
196
- this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.query.options);
197
- const options = `options?: ${hookConfig.query.options}<${operationResultType}, TError, TData>`;
198
- return `export const use${operationName} = <
199
- TData = ${operationResultType},
200
- TError = ${this.visitor.config.errorType}
201
- >(
202
- dataSource: { endpoint: string, fetchParams?: RequestInit },
203
- ${variables},
204
- ${options}
205
- ) =>
206
- ${hookConfig.query.hook}<${operationResultType}, TError, TData>(
207
- ${generateQueryKey(node, hasRequiredVariables)},
208
- fetcher<${operationResultType}, ${operationVariablesTypes}>(dataSource.endpoint, dataSource.fetchParams || {}, ${documentVariableName}, variables),
209
- options
210
- );`;
211
- }
212
- generateMutationHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
213
- const variables = `variables?: ${operationVariablesTypes}`;
214
- const hookConfig = this.visitor.queryMethodMap;
215
- this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.mutation.hook);
216
- this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.mutation.options);
217
- const options = `options?: ${hookConfig.mutation.options}<${operationResultType}, TError, ${operationVariablesTypes}, TContext>`;
218
- return `export const use${operationName} = <
219
- TError = ${this.visitor.config.errorType},
220
- TContext = unknown
221
- >(
222
- dataSource: { endpoint: string, fetchParams?: RequestInit },
223
- ${options}
224
- ) =>
225
- ${hookConfig.mutation.hook}<${operationResultType}, TError, ${operationVariablesTypes}, TContext>(
226
- ${generateMutationKey(node)},
227
- (${variables}) => fetcher<${operationResultType}, ${operationVariablesTypes}>(dataSource.endpoint, dataSource.fetchParams || {}, ${documentVariableName}, variables)(),
228
- options
229
- );`;
230
- }
231
- generateFetcherFetch(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
232
- const variables = generateQueryVariablesSignature(hasRequiredVariables, operationVariablesTypes);
233
- return `\nuse${operationName}.fetcher = (dataSource: { endpoint: string, fetchParams?: RequestInit }, ${variables}) => fetcher<${operationResultType}, ${operationVariablesTypes}>(dataSource.endpoint, dataSource.fetchParams || {}, ${documentVariableName}, variables);`;
234
- }
235
- }
236
-
237
- class GraphQLRequestClientFetcher {
238
- constructor(visitor) {
239
- this.visitor = visitor;
240
- }
241
- generateFetcherImplementaion() {
242
- return `
243
- function fetcher<TData, TVariables>(client: GraphQLClient, query: string, variables?: TVariables, headers?: RequestInit['headers']) {
244
- return async (): Promise<TData> => client.request<TData, TVariables>(query, variables, headers);
245
- }`;
246
- }
247
- generateInfiniteQueryHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
248
- const variables = generateQueryVariablesSignature(hasRequiredVariables, operationVariablesTypes);
249
- const typeImport = this.visitor.config.useTypeImports ? 'import type' : 'import';
250
- this.visitor.imports.add(`${typeImport} { GraphQLClient } from 'graphql-request';`);
251
- const hookConfig = this.visitor.queryMethodMap;
252
- this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.infiniteQuery.hook);
253
- this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.infiniteQuery.options);
254
- const options = `options?: ${hookConfig.infiniteQuery.options}<${operationResultType}, TError, TData>`;
255
- return `export const useInfinite${operationName} = <
256
- TData = ${operationResultType},
257
- TError = ${this.visitor.config.errorType}
258
- >(
259
- pageParamKey: keyof ${operationVariablesTypes},
260
- client: GraphQLClient,
261
- ${variables},
262
- ${options},
263
- headers?: RequestInit['headers']
264
- ) =>
265
- ${hookConfig.infiniteQuery.hook}<${operationResultType}, TError, TData>(
266
- ${generateInfiniteQueryKey(node, hasRequiredVariables)},
267
- (metaData) => fetcher<${operationResultType}, ${operationVariablesTypes}>(client, ${documentVariableName}, {...variables, ...(metaData.pageParam ?? {})}, headers)(),
268
- options
269
- );`;
270
- }
271
- generateQueryHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
272
- const variables = generateQueryVariablesSignature(hasRequiredVariables, operationVariablesTypes);
273
- const typeImport = this.visitor.config.useTypeImports ? 'import type' : 'import';
274
- this.visitor.imports.add(`${typeImport} { GraphQLClient } from 'graphql-request';`);
275
- this.visitor.imports.add(`${typeImport} { RequestInit } from 'graphql-request/dist/types.dom';`);
276
- const hookConfig = this.visitor.queryMethodMap;
277
- this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.query.hook);
278
- this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.query.options);
279
- const options = `options?: ${hookConfig.query.options}<${operationResultType}, TError, TData>`;
280
- return `export const use${operationName} = <
281
- TData = ${operationResultType},
282
- TError = ${this.visitor.config.errorType}
283
- >(
284
- client: GraphQLClient,
285
- ${variables},
286
- ${options},
287
- headers?: RequestInit['headers']
288
- ) =>
289
- ${hookConfig.query.hook}<${operationResultType}, TError, TData>(
290
- ${generateQueryKey(node, hasRequiredVariables)},
291
- fetcher<${operationResultType}, ${operationVariablesTypes}>(client, ${documentVariableName}, variables, headers),
292
- options
293
- );`;
294
- }
295
- generateMutationHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
296
- const variables = `variables?: ${operationVariablesTypes}`;
297
- const typeImport = this.visitor.config.useTypeImports ? 'import type' : 'import';
298
- this.visitor.imports.add(`${typeImport} { GraphQLClient } from 'graphql-request';`);
299
- const hookConfig = this.visitor.queryMethodMap;
300
- this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.mutation.hook);
301
- this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.mutation.options);
302
- const options = `options?: ${hookConfig.mutation.options}<${operationResultType}, TError, ${operationVariablesTypes}, TContext>`;
303
- return `export const use${operationName} = <
304
- TError = ${this.visitor.config.errorType},
305
- TContext = unknown
306
- >(
307
- client: GraphQLClient,
308
- ${options},
309
- headers?: RequestInit['headers']
310
- ) =>
311
- ${hookConfig.mutation.hook}<${operationResultType}, TError, ${operationVariablesTypes}, TContext>(
312
- ${generateMutationKey(node)},
313
- (${variables}) => fetcher<${operationResultType}, ${operationVariablesTypes}>(client, ${documentVariableName}, variables, headers)(),
314
- options
315
- );`;
316
- }
317
- generateFetcherFetch(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
318
- const variables = generateQueryVariablesSignature(hasRequiredVariables, operationVariablesTypes);
319
- const typeImport = this.visitor.config.useTypeImports ? 'import type' : 'import';
320
- this.visitor.imports.add(`${typeImport} { RequestInit } from 'graphql-request/dist/types.dom';`);
321
- return `\nuse${operationName}.fetcher = (client: GraphQLClient, ${variables}, headers?: RequestInit['headers']) => fetcher<${operationResultType}, ${operationVariablesTypes}>(client, ${documentVariableName}, variables, headers);`;
322
- }
323
- }
324
-
325
- class HardcodedFetchFetcher {
326
- constructor(visitor, config) {
327
- this.visitor = visitor;
328
- this.config = config;
329
- }
330
- getEndpoint() {
331
- try {
332
- new URL(this.config.endpoint);
333
- return JSON.stringify(this.config.endpoint);
334
- }
335
- catch (e) {
336
- return `${this.config.endpoint} as string`;
337
- }
338
- }
339
- getFetchParams() {
340
- let fetchParamsPartial = '';
341
- if (this.config.fetchParams) {
342
- const fetchParamsString = typeof this.config.fetchParams === 'string' ? this.config.fetchParams : JSON.stringify(this.config.fetchParams);
343
- fetchParamsPartial = `\n ...(${fetchParamsString}),`;
344
- }
345
- return ` method: "POST",${fetchParamsPartial}`;
346
- }
347
- generateFetcherImplementaion() {
348
- return `
349
- function fetcher<TData, TVariables>(query: string, variables?: TVariables) {
350
- return async (): Promise<TData> => {
351
- const res = await fetch(${this.getEndpoint()}, {
352
- ${this.getFetchParams()}
353
- body: JSON.stringify({ query, variables }),
354
- });
355
-
356
- const json = await res.json();
357
-
358
- if (json.errors) {
359
- const { message } = json.errors[0];
360
-
361
- throw new Error(message);
362
- }
363
-
364
- return json.data;
365
- }
366
- }`;
367
- }
368
- generateInfiniteQueryHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
369
- const variables = generateQueryVariablesSignature(hasRequiredVariables, operationVariablesTypes);
370
- const hookConfig = this.visitor.queryMethodMap;
371
- this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.infiniteQuery.hook);
372
- this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.infiniteQuery.options);
373
- const options = `options?: ${hookConfig.infiniteQuery.options}<${operationResultType}, TError, TData>`;
374
- return `export const useInfinite${operationName} = <
375
- TData = ${operationResultType},
376
- TError = ${this.visitor.config.errorType}
377
- >(
378
- pageParamKey: keyof ${operationVariablesTypes},
379
- ${variables},
380
- ${options}
381
- ) =>
382
- ${hookConfig.infiniteQuery.hook}<${operationResultType}, TError, TData>(
383
- ${generateInfiniteQueryKey(node, hasRequiredVariables)},
384
- (metaData) => fetcher<${operationResultType}, ${operationVariablesTypes}>(${documentVariableName}, {...variables, ...(metaData.pageParam ?? {})})(),
385
- options
386
- );`;
387
- }
388
- generateQueryHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
389
- const variables = generateQueryVariablesSignature(hasRequiredVariables, operationVariablesTypes);
390
- const hookConfig = this.visitor.queryMethodMap;
391
- this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.query.hook);
392
- this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.query.options);
393
- const options = `options?: ${hookConfig.query.options}<${operationResultType}, TError, TData>`;
394
- return `export const use${operationName} = <
395
- TData = ${operationResultType},
396
- TError = ${this.visitor.config.errorType}
397
- >(
398
- ${variables},
399
- ${options}
400
- ) =>
401
- ${hookConfig.query.hook}<${operationResultType}, TError, TData>(
402
- ${generateQueryKey(node, hasRequiredVariables)},
403
- fetcher<${operationResultType}, ${operationVariablesTypes}>(${documentVariableName}, variables),
404
- options
405
- );`;
406
- }
407
- generateMutationHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
408
- const variables = `variables?: ${operationVariablesTypes}`;
409
- const hookConfig = this.visitor.queryMethodMap;
410
- this.visitor.reactQueryHookIdentifiersInUse.add(hookConfig.mutation.hook);
411
- this.visitor.reactQueryOptionsIdentifiersInUse.add(hookConfig.mutation.options);
412
- const options = `options?: ${hookConfig.mutation.options}<${operationResultType}, TError, ${operationVariablesTypes}, TContext>`;
413
- return `export const use${operationName} = <
414
- TError = ${this.visitor.config.errorType},
415
- TContext = unknown
416
- >(${options}) =>
417
- ${hookConfig.mutation.hook}<${operationResultType}, TError, ${operationVariablesTypes}, TContext>(
418
- ${generateMutationKey(node)},
419
- (${variables}) => fetcher<${operationResultType}, ${operationVariablesTypes}>(${documentVariableName}, variables)(),
420
- options
421
- );`;
422
- }
423
- generateFetcherFetch(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables) {
424
- const variables = generateQueryVariablesSignature(hasRequiredVariables, operationVariablesTypes);
425
- return `\nuse${operationName}.fetcher = (${variables}) => fetcher<${operationResultType}, ${operationVariablesTypes}>(${documentVariableName}, variables);`;
426
- }
427
- }
428
-
429
- class ReactQueryVisitor extends visitorPluginCommon.ClientSideBaseVisitor {
430
- constructor(schema, fragments, rawConfig, documents) {
431
- super(schema, fragments, rawConfig, {
432
- documentMode: visitorPluginCommon.DocumentMode.string,
433
- errorType: visitorPluginCommon.getConfigValue(rawConfig.errorType, 'unknown'),
434
- exposeDocument: visitorPluginCommon.getConfigValue(rawConfig.exposeDocument, false),
435
- exposeQueryKeys: visitorPluginCommon.getConfigValue(rawConfig.exposeQueryKeys, false),
436
- exposeMutationKeys: visitorPluginCommon.getConfigValue(rawConfig.exposeMutationKeys, false),
437
- exposeFetcher: visitorPluginCommon.getConfigValue(rawConfig.exposeFetcher, false),
438
- addInfiniteQuery: visitorPluginCommon.getConfigValue(rawConfig.addInfiniteQuery, false),
439
- });
440
- this.rawConfig = rawConfig;
441
- this.reactQueryHookIdentifiersInUse = new Set();
442
- this.reactQueryOptionsIdentifiersInUse = new Set();
443
- this.queryMethodMap = {
444
- infiniteQuery: {
445
- hook: 'useInfiniteQuery',
446
- options: 'UseInfiniteQueryOptions',
447
- },
448
- query: {
449
- hook: 'useQuery',
450
- options: 'UseQueryOptions',
451
- },
452
- mutation: {
453
- hook: 'useMutation',
454
- options: 'UseMutationOptions',
455
- },
456
- };
457
- this._externalImportPrefix = this.config.importOperationTypesFrom ? `${this.config.importOperationTypesFrom}.` : '';
458
- this._documents = documents;
459
- this.fetcher = this.createFetcher(rawConfig.fetcher || 'fetch');
460
- autoBind(this);
461
- }
462
- get imports() {
463
- return this._imports;
464
- }
465
- createFetcher(raw) {
466
- if (raw === 'fetch') {
467
- return new FetchFetcher(this);
468
- }
469
- if (typeof raw === 'object' && 'endpoint' in raw) {
470
- return new HardcodedFetchFetcher(this, raw);
471
- }
472
- if (raw === 'graphql-request') {
473
- return new GraphQLRequestClientFetcher(this);
474
- }
475
- return new CustomMapperFetcher(this, raw);
476
- }
477
- get hasOperations() {
478
- return this._collectedOperations.length > 0;
479
- }
480
- getImports() {
481
- const baseImports = super.getImports();
482
- if (!this.hasOperations) {
483
- return baseImports;
484
- }
485
- if (this.config.addInfiniteQuery) {
486
- this.reactQueryOptionsIdentifiersInUse.add('QueryFunctionContext');
487
- }
488
- const hookAndTypeImports = [
489
- ...Array.from(this.reactQueryHookIdentifiersInUse),
490
- ...Array.from(this.reactQueryOptionsIdentifiersInUse).map(identifier => `${this.config.useTypeImports ? 'type ' : ''}${identifier}`),
491
- ];
492
- return [...baseImports, `import { ${hookAndTypeImports.join(', ')} } from 'react-query';`];
493
- }
494
- getFetcherImplementation() {
495
- return this.fetcher.generateFetcherImplementaion();
496
- }
497
- _getHookSuffix(name, operationType) {
498
- if (this.config.omitOperationSuffix) {
499
- return '';
500
- }
501
- if (!this.config.dedupeOperationSuffix) {
502
- return changeCaseAll.pascalCase(operationType);
503
- }
504
- if (name.includes('Query') || name.includes('Mutation') || name.includes('Subscription')) {
505
- return '';
506
- }
507
- return changeCaseAll.pascalCase(operationType);
508
- }
509
- buildOperation(node, documentVariableName, operationType, operationResultType, operationVariablesTypes, hasRequiredVariables) {
510
- var _a, _b;
511
- const nodeName = (_b = (_a = node.name) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : '';
512
- const suffix = this._getHookSuffix(nodeName, operationType);
513
- const operationName = this.convertName(nodeName, {
514
- suffix,
515
- useTypesPrefix: false,
516
- useTypesSuffix: false,
517
- });
518
- operationResultType = this._externalImportPrefix + operationResultType;
519
- operationVariablesTypes = this._externalImportPrefix + operationVariablesTypes;
520
- if (operationType === 'Query') {
521
- let query = this.fetcher.generateQueryHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables);
522
- if (this.config.exposeDocument) {
523
- query += `\nuse${operationName}.document = ${documentVariableName};\n`;
524
- }
525
- if (this.config.exposeQueryKeys) {
526
- query += `\n${generateQueryKeyMaker(node, operationName, operationVariablesTypes, hasRequiredVariables)};\n`;
527
- }
528
- if (this.config.addInfiniteQuery) {
529
- query += `\n${this.fetcher.generateInfiniteQueryHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables)}\n`;
530
- if (this.config.exposeQueryKeys) {
531
- query += `\n${generateInfiniteQueryKeyMaker(node, operationName, operationVariablesTypes, hasRequiredVariables)};\n`;
532
- }
533
- }
534
- // The reason we're looking at the private field of the CustomMapperFetcher to see if it's a react hook
535
- // is to prevent calling generateFetcherFetch for each query since all the queries won't be able to generate
536
- // a fetcher field anyways.
537
- if (this.config.exposeFetcher && !this.fetcher._isReactHook) {
538
- query += this.fetcher.generateFetcherFetch(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables);
539
- }
540
- return query;
541
- }
542
- if (operationType === 'Mutation') {
543
- let query = this.fetcher.generateMutationHook(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables);
544
- if (this.config.exposeMutationKeys) {
545
- query += generateMutationKeyMaker(node, operationName);
546
- }
547
- if (this.config.exposeFetcher && !this.fetcher._isReactHook) {
548
- query += this.fetcher.generateFetcherFetch(node, documentVariableName, operationName, operationResultType, operationVariablesTypes, hasRequiredVariables);
549
- }
550
- return query;
551
- }
552
- if (operationType === 'Subscription') {
553
- // eslint-disable-next-line no-console
554
- console.warn(`Plugin "typescript-react-query" does not support GraphQL Subscriptions at the moment! Ignoring "${node.name.value}"...`);
555
- }
556
- return null;
557
- }
558
- }
559
-
560
- const plugin = (schema, documents, config) => {
561
- const allAst = graphql.concatAST(documents.map(v => v.document));
562
- const allFragments = [
563
- ...allAst.definitions.filter(d => d.kind === graphql.Kind.FRAGMENT_DEFINITION).map(fragmentDef => ({
564
- node: fragmentDef,
565
- name: fragmentDef.name.value,
566
- onType: fragmentDef.typeCondition.name.value,
567
- isExternal: false,
568
- })),
569
- ...(config.externalFragments || []),
570
- ];
571
- const visitor = new ReactQueryVisitor(schema, allFragments, config, documents);
572
- const visitorResult = pluginHelpers.oldVisit(allAst, { leave: visitor });
573
- if (visitor.hasOperations) {
574
- return {
575
- prepend: [...visitor.getImports(), visitor.getFetcherImplementation()],
576
- content: [visitor.fragments, ...visitorResult.definitions.filter(t => typeof t === 'string')].join('\n'),
577
- };
578
- }
579
- return {
580
- prepend: [...visitor.getImports()],
581
- content: [visitor.fragments, ...visitorResult.definitions.filter(t => typeof t === 'string')].join('\n'),
582
- };
583
- };
584
- const validate = async (schema, documents, config, outputFile) => {
585
- if (path.extname(outputFile) !== '.ts' && path.extname(outputFile) !== '.tsx') {
586
- throw new Error(`Plugin "typescript-react-query" requires extension to be ".ts" or ".tsx"!`);
587
- }
588
- };
589
-
590
- exports.ReactQueryVisitor = ReactQueryVisitor;
591
- exports.plugin = plugin;
592
- exports.validate = validate;