@@ -8,6 +8,7 @@ import type { Identifier,
88 Parameter ,
99 EntityName , TSTypeParameterInstantiation } from '@typescript-eslint/types/dist/ts-estree' ;
1010import { AST_NODE_TYPES } from '@typescript-eslint/typescript-estree' ;
11+ import type { Logger } from 'winston' ;
1112import type { ClassReferenceLoaded , InterfaceLoaded , ClassReference ,
1213 ClassReferenceLoadedClassOrInterface , ClassIndex } from './ClassIndex' ;
1314import type { CommentData , ConstructorCommentData , CommentLoader } from './CommentLoader' ;
@@ -25,9 +26,13 @@ export class ParameterLoader {
2526 ] ;
2627
2728 private readonly commentLoader : CommentLoader ;
29+ private readonly hardErrorUnsupported : boolean ;
30+ private readonly logger : Logger ;
2831
2932 public constructor ( args : ParameterLoaderArgs ) {
3033 this . commentLoader = args . commentLoader ;
34+ this . hardErrorUnsupported = args . hardErrorUnsupported ;
35+ this . logger = args . logger ;
3136 }
3237
3338 /**
@@ -181,7 +186,7 @@ export class ParameterLoader {
181186 } else if ( field . type === AST_NODE_TYPES . TSParameterProperty ) {
182187 this . loadConstructorField ( classLoaded , parameters , constructorCommentData , field . parameter ) ;
183188 } else {
184- throw new Error ( `Could not understand constructor parameter type ${ field . type } in ${ classLoaded . localName } at ${ classLoaded . fileName } ` ) ;
189+ this . throwOrWarn ( new Error ( `Could not understand constructor parameter type ${ field . type } in ${ classLoaded . localName } at ${ classLoaded . fileName } ` ) ) ;
185190 }
186191 }
187192
@@ -240,7 +245,7 @@ export class ParameterLoader {
240245 }
241246 return ;
242247 default :
243- throw new Error ( `Unsupported field type ${ typeElement . type } in ${ classLoaded . localName } in ${ classLoaded . fileName } ` ) ;
248+ this . throwOrWarn ( new Error ( `Unsupported field type ${ typeElement . type } in ${ classLoaded . localName } in ${ classLoaded . fileName } ` ) ) ;
244249 }
245250 }
246251
@@ -321,8 +326,9 @@ export class ParameterLoader {
321326 value : this . getRangeFromTypeNode ( classLoaded , typeNode . typeParameters . params [ 0 ] , errorIdentifier ) ,
322327 } ;
323328 }
324- throw new Error ( `Found invalid Array field type at ${ errorIdentifier
325- } in ${ classLoaded . localName } at ${ classLoaded . fileName } `) ;
329+ this . throwOrWarn ( new Error ( `Found invalid Array field type at ${ errorIdentifier
330+ } in ${ classLoaded . localName } at ${ classLoaded . fileName } `) ) ;
331+ return { type : 'wildcard' } ;
326332 default :
327333 // First check if the type is a direct generic type
328334 if ( classLoaded . type !== 'enum' && typeNode . typeName . name in classLoaded . generics ) {
@@ -418,8 +424,9 @@ export class ParameterLoader {
418424 } ;
419425 }
420426 }
421- throw new Error ( `Could not understand parameter type ${ typeNode . type } of ${ errorIdentifier
422- } in ${ classLoaded . localName } at ${ classLoaded . fileName } `) ;
427+ this . throwOrWarn ( new Error ( `Could not understand parameter type ${ typeNode . type } of ${ errorIdentifier
428+ } in ${ classLoaded . localName } at ${ classLoaded . fileName } `) ) ;
429+ return { type : 'wildcard' } ;
423430 }
424431
425432 protected getGenericTypeParameterInstantiations (
@@ -461,8 +468,9 @@ export class ParameterLoader {
461468
462469 // Throw if no range was found
463470 if ( ! range ) {
464- throw new Error ( `Missing field type on ${ this . getFieldName ( classLoaded , field )
465- } in ${ classLoaded . localName } at ${ classLoaded . fileName } `) ;
471+ this . throwOrWarn ( new Error ( `Missing field type on ${ this . getFieldName ( classLoaded , field )
472+ } in ${ classLoaded . localName } at ${ classLoaded . fileName } `) ) ;
473+ return { type : 'wildcard' } ;
466474 }
467475
468476 // If the field has the '?' annotation, explicitly allow undefined as value to make it be considered optional.
@@ -610,8 +618,9 @@ export class ParameterLoader {
610618 ) ;
611619 }
612620
613- throw new Error ( `Missing field type on ${ this . getErrorIdentifierIndex ( )
614- } in ${ classLoaded . localName } at ${ classLoaded . fileName } `) ;
621+ this . throwOrWarn ( new Error ( `Missing field type on ${ this . getErrorIdentifierIndex ( )
622+ } in ${ classLoaded . localName } at ${ classLoaded . fileName } `) ) ;
623+ return { type : 'wildcard' } ;
615624 }
616625
617626 /**
@@ -626,10 +635,20 @@ export class ParameterLoader {
626635 }
627636 }
628637 }
638+
639+ protected throwOrWarn ( error : Error ) : void {
640+ if ( this . hardErrorUnsupported ) {
641+ throw error ;
642+ } else {
643+ this . logger . error ( error . message ) ;
644+ }
645+ }
629646}
630647
631648export interface ParameterLoaderArgs {
632649 commentLoader : CommentLoader ;
650+ hardErrorUnsupported : boolean ;
651+ logger : Logger ;
633652}
634653
635654export type ParameterData < R > = ParameterDataField < R > | ParameterDataIndex < R > ;
0 commit comments