5
5
ObjectType ,
6
6
InterfaceType ,
7
7
InputType ,
8
+ Field ,
8
9
} from '../../decorators' ;
9
10
import { PluginOptions } from '../merge-options' ;
10
11
import { METADATA_FACTORY_NAME } from '../plugin-constants' ;
@@ -374,6 +375,30 @@ export class ModelClassVisitor {
374
375
} ) ;
375
376
}
376
377
378
+ private getInlineStringEnumTypeOrUndefined (
379
+ member : ts . PropertyDeclaration ,
380
+ ) : string {
381
+ let inlineEnumName : string ;
382
+
383
+ const membersStringEnumValues = this . isMemberHasInlineStringEnum ( member ) ;
384
+
385
+ if ( membersStringEnumValues ) {
386
+ const memberName = member . name . getText ( ) ;
387
+
388
+ inlineEnumName =
389
+ member . parent . name . getText ( ) +
390
+ capitalizeFirstLetter ( memberName ) +
391
+ 'Enum' ;
392
+
393
+ this . inlineEnumsMap . push ( {
394
+ name : inlineEnumName ,
395
+ values : membersStringEnumValues ,
396
+ } ) ;
397
+ }
398
+
399
+ return inlineEnumName ;
400
+ }
401
+
377
402
private collectMetadataFromClassMembers (
378
403
f : ts . NodeFactory ,
379
404
members : ts . NodeArray < ts . ClassElement > ,
@@ -392,37 +417,18 @@ export class ModelClassVisitor {
392
417
] ) &&
393
418
! hasDecorators ( member . decorators , [ HideField . name ] )
394
419
) {
395
- let inlineEnumName : string ;
396
- const memberName = member . name . getText ( ) ;
397
-
398
- const membersStringEnumValues =
399
- this . isMemberHasInlineStringEnum ( member ) ;
400
-
401
- if ( membersStringEnumValues ) {
402
- inlineEnumName =
403
- member . parent . name . getText ( ) +
404
- capitalizeFirstLetter ( memberName ) +
405
- 'Enum' ;
406
-
407
- this . inlineEnumsMap . push ( {
408
- name : inlineEnumName ,
409
- values : membersStringEnumValues ,
410
- } ) ;
411
- }
412
-
413
420
try {
414
421
const objectLiteralExpr = this . createDecoratorObjectLiteralExpr (
415
422
f ,
416
423
member ,
417
424
typeChecker ,
418
- inlineEnumName ,
419
425
hostFilename ,
420
426
pluginOptions ,
421
427
) ;
422
428
423
429
properties . push (
424
430
f . createPropertyAssignment (
425
- f . createIdentifier ( memberName ) ,
431
+ f . createIdentifier ( member . name . getText ( ) ) ,
426
432
objectLiteralExpr ,
427
433
) ,
428
434
) ;
@@ -468,28 +474,55 @@ export class ModelClassVisitor {
468
474
) ;
469
475
}
470
476
477
+ private hasExplicitTypeInDecorator ( member : ts . PropertyDeclaration ) {
478
+ const fieldDecorator = member . decorators ?. find (
479
+ ( decorator ) => getDecoratorName ( decorator ) === Field . name ,
480
+ ) ;
481
+
482
+ if ( ! fieldDecorator ) {
483
+ return false ;
484
+ }
485
+
486
+ const expression = fieldDecorator . expression as ts . CallExpression ;
487
+ return (
488
+ expression . arguments . length > 0 &&
489
+ ts . isArrowFunction ( expression . arguments [ 0 ] )
490
+ ) ;
491
+ }
492
+
471
493
private createDecoratorObjectLiteralExpr (
472
494
f : ts . NodeFactory ,
473
- node : ts . PropertyDeclaration | ts . PropertySignature ,
495
+ node : ts . PropertyDeclaration ,
474
496
typeChecker : ts . TypeChecker ,
475
- overrideType ?: string ,
476
497
hostFilename = '' ,
477
498
pluginOptions ?: PluginOptions ,
478
499
) : ts . ObjectLiteralExpression {
479
500
const type = typeChecker . getTypeAtLocation ( node ) ;
480
501
const isNullable =
481
502
! ! node . questionToken || isNull ( type ) || isUndefined ( type ) ;
482
503
483
- const typeArrowFunction = f . createArrowFunction (
484
- undefined ,
485
- undefined ,
486
- [ ] ,
487
- undefined ,
488
- undefined ,
489
- overrideType
490
- ? f . createIdentifier ( overrideType )
491
- : this . getTypeUsingTypeChecker ( f , node . type , typeChecker , hostFilename ) ,
492
- ) ;
504
+ let typeArrowFunction : ts . ArrowFunction ;
505
+ const t = this . hasExplicitTypeInDecorator ( node ) ;
506
+ if ( ! t ) {
507
+ const inlineStringEnumTypeName =
508
+ this . getInlineStringEnumTypeOrUndefined ( node ) ;
509
+
510
+ typeArrowFunction = f . createArrowFunction (
511
+ undefined ,
512
+ undefined ,
513
+ [ ] ,
514
+ undefined ,
515
+ undefined ,
516
+ inlineStringEnumTypeName
517
+ ? f . createIdentifier ( inlineStringEnumTypeName )
518
+ : this . getTypeUsingTypeChecker (
519
+ f ,
520
+ node . type ,
521
+ typeChecker ,
522
+ hostFilename ,
523
+ ) ,
524
+ ) ;
525
+ }
493
526
494
527
const description = pluginOptions . introspectComments
495
528
? getJSDocDescription ( node )
0 commit comments