import { ApiDoc } from 'dgeni-packages/typescript/api-doc-types/ApiDoc' ; import { ParameterContainer , ParamTag , } from 'dgeni-packages/typescript/api-doc-types/ParameterContainer' ; export interface NormalizedFunctionParameters { params ? : FunctionParameterInfo [ ] ; } export interface FunctionParameterInfo extends ParamTag { type : string ; isOptional : boolean ; } /**
 * Generic type that represents Dgeni method members and standalone functions. Also it the type
 * combines the normalized function document so that we can update the doc with type checking.
 */ export type DefaultFunctionDoc = NormalizedFunctionParameters & ParameterContainer & ApiDoc ; /**
 * The `parameters` property are the parameters extracted from TypeScript and are strings
 * of the form "propertyName: propertyType" (literally what's written in the source).
 *
 * The `params` property is pulled from the `@param` JsDoc tag. We need to merge
 * the information of these to get name + type + description.
 *
 * We will use the `params` property to store the final normalized form since it is already
 * an object.
 */ export function normalizeFunctionParameters ( doc ) { if ( doc . parameters ) { doc . parameters . forEach ( ( parameter ) => { let [ parameterName , parameterType ] = parameter . split ( ':' ) ; let isOptional = false ; if ( parameterName . includes ( '?' ) ) { isOptional = true ; parameterName = parameterName . replace ( '?' , '' ) ; } doc . params = doc . params || [ ] ; if ( ! parameterType ) { console . warn ( `Missing parameter type information (${ parameterName }) in ` + `${ doc . fileInfo . relativePath }:${ doc . startingLine }` ) ; return ; } const existingParameterInfo = doc . params . find ( ( p ) => p . name == parameterName ) ; if ( ! existingParameterInfo ) { doc . params . push ( { name : parameterName , type : parameterType . trim ( ) , isOptional : isOptional , description : '' , } ) ; } else { existingParameterInfo . type = parameterType . trim ( ) ; existingParameterInfo . isOptional = isOptional ; } } ) ; } }