@@ -3,11 +3,13 @@ import { MethodDeclaration } from "ts-morph";
3
3
import {
4
4
BuildCommonTypeName ,
5
5
capitalizeFirstLetter ,
6
+ EqualsOrGreaterThanToken ,
6
7
extractPropertiesFromObjectParam ,
7
8
getNameFromMethod ,
8
9
getShortType ,
9
10
queryKeyConstraint ,
10
11
queryKeyGenericType ,
12
+ QuestionToken ,
11
13
TData ,
12
14
TError ,
13
15
} from "./common.mjs" ;
@@ -61,12 +63,15 @@ export const createApiResponseType = ({
61
63
) ;
62
64
63
65
return {
64
- /** DefaultResponseDataType
66
+ /**
67
+ * DefaultResponseDataType
68
+ *
65
69
* export type MyClassMethodDefaultResponse = Awaited<ReturnType<typeof myClass.myMethod>>
66
70
*/
67
71
apiResponse,
68
72
/**
69
- * will be the name of the type of the response type of the method
73
+ * This will be the name of the type of the response type of the method
74
+ *
70
75
* MyClassMethodDefaultResponse
71
76
*/
72
77
responseDataType,
@@ -128,6 +133,7 @@ export function getRequestParamFromMethod(method: MethodDeclaration) {
128
133
129
134
/**
130
135
* Return Type
136
+ *
131
137
* export const classNameMethodNameQueryResult<TData = MyClassMethodDefaultResponse, TError = unknown> = UseQueryResult<TData, TError>;
132
138
*/
133
139
export function createReturnTypeExport ( {
@@ -311,7 +317,7 @@ export function createQueryHook({
311
317
) ,
312
318
] ,
313
319
undefined ,
314
- ts . factory . createToken ( ts . SyntaxKind . EqualsGreaterThanToken ) ,
320
+ EqualsOrGreaterThanToken ,
315
321
ts . factory . createCallExpression (
316
322
ts . factory . createIdentifier ( queryString ) ,
317
323
[
@@ -322,41 +328,28 @@ export function createQueryHook({
322
328
ts . factory . createObjectLiteralExpression ( [
323
329
ts . factory . createPropertyAssignment (
324
330
ts . factory . createIdentifier ( "queryKey" ) ,
325
- ts . factory . createArrayLiteralExpression (
326
- [
327
- BuildCommonTypeName ( queryKey ) ,
328
- ts . factory . createSpreadElement (
329
- ts . factory . createParenthesizedExpression (
330
- ts . factory . createBinaryExpression (
331
- ts . factory . createIdentifier ( "queryKey" ) ,
332
- ts . factory . createToken (
333
- ts . SyntaxKind . QuestionQuestionToken
334
- ) ,
335
- method . getParameters ( ) . length
336
- ? ts . factory . createArrayLiteralExpression ( [
337
- ts . factory . createObjectLiteralExpression (
338
- method
339
- . getParameters ( )
340
- . map ( ( param ) =>
341
- extractPropertiesFromObjectParam (
342
- param
343
- ) . map ( ( p ) =>
344
- ts . factory . createShorthandPropertyAssignment (
345
- ts . factory . createIdentifier (
346
- p . name
347
- )
348
- )
349
- )
350
- )
351
- . flat ( )
352
- ) ,
353
- ] )
354
- : ts . factory . createArrayLiteralExpression ( [ ] )
355
- )
356
- )
357
- ) ,
358
- ] ,
359
- false
331
+ ts . factory . createCallExpression (
332
+ BuildCommonTypeName ( getQueryKeyFnName ( queryKey ) ) ,
333
+ undefined ,
334
+
335
+ method . getParameters ( ) . length
336
+ ? [
337
+ ts . factory . createObjectLiteralExpression (
338
+ method
339
+ . getParameters ( )
340
+ . map ( ( param ) =>
341
+ extractPropertiesFromObjectParam ( param ) . map (
342
+ ( p ) =>
343
+ ts . factory . createShorthandPropertyAssignment (
344
+ ts . factory . createIdentifier ( p . name )
345
+ )
346
+ )
347
+ )
348
+ . flat ( )
349
+ ) ,
350
+ ts . factory . createIdentifier ( "queryKey" ) ,
351
+ ]
352
+ : [ ]
360
353
)
361
354
) ,
362
355
ts . factory . createPropertyAssignment (
@@ -366,9 +359,7 @@ export function createQueryHook({
366
359
undefined ,
367
360
[ ] ,
368
361
undefined ,
369
- ts . factory . createToken (
370
- ts . SyntaxKind . EqualsGreaterThanToken
371
- ) ,
362
+ EqualsOrGreaterThanToken ,
372
363
ts . factory . createAsExpression (
373
364
ts . factory . createCallExpression (
374
365
ts . factory . createPropertyAccessExpression (
@@ -463,11 +454,97 @@ export const createUseQuery = ({
463
454
queryKey,
464
455
} ) ;
465
456
457
+ const queryKeyFn = createQueryKeyFnExport ( queryKey , method ) ;
458
+
466
459
return {
467
460
apiResponse : defaultApiResponse ,
468
461
returnType : returnTypeExport ,
469
462
key : queryKeyExport ,
470
463
queryHook : hookWithJsDoc ,
471
464
suspenseQueryHook : suspenseHookWithJsDoc ,
465
+ queryKeyFn,
472
466
} ;
473
467
} ;
468
+
469
+ function getQueryKeyFnName ( queryKey : string ) {
470
+ return `${ capitalizeFirstLetter ( queryKey ) } Fn` ;
471
+ }
472
+
473
+ function createQueryKeyFnExport ( queryKey : string , method : MethodDeclaration ) {
474
+ const params = getRequestParamFromMethod ( method ) ;
475
+
476
+ // override key is used to allow the user to override the the queryKey values
477
+ const overrideKey = ts . factory . createParameterDeclaration (
478
+ undefined ,
479
+ undefined ,
480
+ ts . factory . createIdentifier ( "queryKey" ) ,
481
+ QuestionToken ,
482
+ ts . factory . createTypeReferenceNode ( "Array<unknown>" , [ ] )
483
+ ) ;
484
+
485
+ return ts . factory . createVariableStatement (
486
+ [ ts . factory . createModifier ( ts . SyntaxKind . ExportKeyword ) ] ,
487
+ ts . factory . createVariableDeclarationList (
488
+ [
489
+ ts . factory . createVariableDeclaration (
490
+ ts . factory . createIdentifier ( getQueryKeyFnName ( queryKey ) ) ,
491
+ undefined ,
492
+ undefined ,
493
+ ts . factory . createArrowFunction (
494
+ undefined ,
495
+ undefined ,
496
+ params ? [ params , overrideKey ] : [ ] ,
497
+ undefined ,
498
+ EqualsOrGreaterThanToken ,
499
+ queryKeyFn ( queryKey , method )
500
+ )
501
+ ) ,
502
+ ] ,
503
+ ts . NodeFlags . Const
504
+ )
505
+ ) ;
506
+ }
507
+
508
+ function queryKeyFn (
509
+ queryKey : string ,
510
+ method : MethodDeclaration
511
+ ) : ts . Expression {
512
+ const params = getRequestParamFromMethod ( method ) ;
513
+
514
+ if ( ! params ) {
515
+ return ts . factory . createArrayLiteralExpression ( [
516
+ ts . factory . createIdentifier ( queryKey ) ,
517
+ ] ) ;
518
+ }
519
+
520
+ return ts . factory . createArrayLiteralExpression (
521
+ [
522
+ ts . factory . createIdentifier ( queryKey ) ,
523
+ ts . factory . createSpreadElement (
524
+ ts . factory . createParenthesizedExpression (
525
+ ts . factory . createBinaryExpression (
526
+ ts . factory . createIdentifier ( "queryKey" ) ,
527
+ ts . factory . createToken ( ts . SyntaxKind . QuestionQuestionToken ) ,
528
+ method . getParameters ( ) . length
529
+ ? ts . factory . createArrayLiteralExpression ( [
530
+ ts . factory . createObjectLiteralExpression (
531
+ method
532
+ . getParameters ( )
533
+ . map ( ( param ) =>
534
+ extractPropertiesFromObjectParam ( param ) . map ( ( p ) =>
535
+ ts . factory . createShorthandPropertyAssignment (
536
+ ts . factory . createIdentifier ( p . name )
537
+ )
538
+ )
539
+ )
540
+ . flat ( )
541
+ ) ,
542
+ ] )
543
+ : ts . factory . createArrayLiteralExpression ( [ ] )
544
+ )
545
+ )
546
+ ) ,
547
+ ] ,
548
+ false
549
+ ) ;
550
+ }
0 commit comments