@@ -56,6 +56,19 @@ function operationMatches(pattern?: EndpointMatcher) {
56
56
} ;
57
57
}
58
58
59
+ function withQueryComment < T extends ts . Node > ( node : T , def : QueryArgDefinition , hasTrailingNewLine : boolean ) : T {
60
+ const comment = def . origin === 'param' ? def . param . description : def . body . description ;
61
+ if ( comment ) {
62
+ return ts . addSyntheticLeadingComment (
63
+ node ,
64
+ ts . SyntaxKind . MultiLineCommentTrivia ,
65
+ `* ${ comment } ` ,
66
+ hasTrailingNewLine
67
+ ) ;
68
+ }
69
+ return node ;
70
+ }
71
+
59
72
export function getOverrides (
60
73
operation : OperationDefinition ,
61
74
endpointOverrides ?: EndpointOverrides [ ]
@@ -78,6 +91,7 @@ export async function generateApi(
78
91
filterEndpoints,
79
92
endpointOverrides,
80
93
unionUndefined,
94
+ flattenArg = false ,
81
95
} : GenerationOptions
82
96
) {
83
97
const v3Doc = await getV3Doc ( spec ) ;
@@ -290,6 +304,8 @@ export async function generateApi(
290
304
291
305
const queryArgValues = Object . values ( queryArg ) ;
292
306
307
+ const isFlatArg = flattenArg && queryArgValues . length === 1 ;
308
+
293
309
const QueryArg = factory . createTypeReferenceNode (
294
310
registerInterface (
295
311
factory . createTypeAliasDeclaration (
@@ -298,27 +314,22 @@ export async function generateApi(
298
314
capitalize ( operationName + argSuffix ) ,
299
315
undefined ,
300
316
queryArgValues . length > 0
301
- ? factory . createTypeLiteralNode (
302
- queryArgValues . map ( ( def ) => {
303
- const comment = def . origin === 'param' ? def . param . description : def . body . description ;
304
- const node = factory . createPropertySignature (
305
- undefined ,
306
- propertyName ( def . name ) ,
307
- createQuestionToken ( ! def . required ) ,
308
- def . type
309
- ) ;
310
-
311
- if ( comment ) {
312
- return ts . addSyntheticLeadingComment (
313
- node ,
314
- ts . SyntaxKind . MultiLineCommentTrivia ,
315
- `* ${ comment } ` ,
317
+ ? isFlatArg
318
+ ? withQueryComment ( { ...queryArgValues [ 0 ] . type } , queryArgValues [ 0 ] , false )
319
+ : factory . createTypeLiteralNode (
320
+ queryArgValues . map ( ( def ) =>
321
+ withQueryComment (
322
+ factory . createPropertySignature (
323
+ undefined ,
324
+ propertyName ( def . name ) ,
325
+ createQuestionToken ( ! def . required ) ,
326
+ def . type
327
+ ) ,
328
+ def ,
316
329
true
317
- ) ;
318
- }
319
- return node ;
320
- } )
321
- )
330
+ )
331
+ )
332
+ )
322
333
: factory . createKeywordTypeNode ( ts . SyntaxKind . VoidKeyword )
323
334
)
324
335
) . name
@@ -329,7 +340,7 @@ export async function generateApi(
329
340
type : isQuery ? 'query' : 'mutation' ,
330
341
Response : ResponseTypeName ,
331
342
QueryArg,
332
- queryFn : generateQueryFn ( { operationDefinition, queryArg, isQuery, tags } ) ,
343
+ queryFn : generateQueryFn ( { operationDefinition, queryArg, isQuery, isFlatArg } ) ,
333
344
extraEndpointsProps : isQuery
334
345
? generateQueryEndpointProps ( { operationDefinition } )
335
346
: generateMutationEndpointProps ( { operationDefinition } ) ,
@@ -340,13 +351,13 @@ export async function generateApi(
340
351
function generateQueryFn ( {
341
352
operationDefinition,
342
353
queryArg,
354
+ isFlatArg,
343
355
isQuery,
344
- tags,
345
356
} : {
346
357
operationDefinition : OperationDefinition ;
347
358
queryArg : QueryArgDefinitions ;
359
+ isFlatArg : boolean ;
348
360
isQuery : boolean ;
349
- tags : string [ ] ;
350
361
} ) {
351
362
const { path, verb } = operationDefinition ;
352
363
@@ -365,7 +376,11 @@ export async function generateApi(
365
376
factory . createIdentifier ( propertyName ) ,
366
377
factory . createObjectLiteralExpression (
367
378
parameters . map (
368
- ( param ) => createPropertyAssignment ( param . originalName , accessProperty ( rootObject , param . name ) ) ,
379
+ ( param ) =>
380
+ createPropertyAssignment (
381
+ param . originalName ,
382
+ isFlatArg ? rootObject : accessProperty ( rootObject , param . name )
383
+ ) ,
369
384
true
370
385
)
371
386
)
@@ -395,7 +410,7 @@ export async function generateApi(
395
410
[
396
411
factory . createPropertyAssignment (
397
412
factory . createIdentifier ( 'url' ) ,
398
- generatePathExpression ( path , pickParams ( 'path' ) , rootObject )
413
+ generatePathExpression ( path , pickParams ( 'path' ) , rootObject , isFlatArg )
399
414
) ,
400
415
isQuery && verb . toUpperCase ( ) === 'GET'
401
416
? undefined
@@ -407,7 +422,9 @@ export async function generateApi(
407
422
? undefined
408
423
: factory . createPropertyAssignment (
409
424
factory . createIdentifier ( 'body' ) ,
410
- factory . createPropertyAccessExpression ( rootObject , factory . createIdentifier ( bodyParameter . name ) )
425
+ isFlatArg
426
+ ? rootObject
427
+ : factory . createPropertyAccessExpression ( rootObject , factory . createIdentifier ( bodyParameter . name ) )
411
428
) ,
412
429
createObjectLiteralProperty ( pickParams ( 'cookie' ) , 'cookies' ) ,
413
430
createObjectLiteralProperty ( pickParams ( 'header' ) , 'headers' ) ,
@@ -436,7 +453,12 @@ function accessProperty(rootObject: ts.Identifier, propertyName: string) {
436
453
: factory . createElementAccessExpression ( rootObject , factory . createStringLiteral ( propertyName ) ) ;
437
454
}
438
455
439
- function generatePathExpression ( path : string , pathParameters : QueryArgDefinition [ ] , rootObject : ts . Identifier ) {
456
+ function generatePathExpression (
457
+ path : string ,
458
+ pathParameters : QueryArgDefinition [ ] ,
459
+ rootObject : ts . Identifier ,
460
+ isFlatArg : boolean
461
+ ) {
440
462
const expressions : Array < [ string , string ] > = [ ] ;
441
463
442
464
const head = path . replace ( / \{ ( .* ?) \} ( .* ?) (? = \{ | $ ) / g, ( _ , expression , literal ) => {
@@ -453,7 +475,7 @@ function generatePathExpression(path: string, pathParameters: QueryArgDefinition
453
475
factory . createTemplateHead ( head ) ,
454
476
expressions . map ( ( [ prop , literal ] , index ) =>
455
477
factory . createTemplateSpan (
456
- accessProperty ( rootObject , prop ) ,
478
+ isFlatArg ? rootObject : accessProperty ( rootObject , prop ) ,
457
479
index === expressions . length - 1
458
480
? factory . createTemplateTail ( literal )
459
481
: factory . createTemplateMiddle ( literal )
0 commit comments