Add support for rendering nested IndexSignatures
This commit is contained in:
		@@ -2,7 +2,7 @@ import * as _ from 'lodash';
 | 
			
		||||
import * as React from 'react';
 | 
			
		||||
 | 
			
		||||
import { DocsInfo } from '../docs_info';
 | 
			
		||||
import { CustomType, TypeDocTypes } from '../types';
 | 
			
		||||
import { CustomType } from '../types';
 | 
			
		||||
 | 
			
		||||
import { Signature } from './signature';
 | 
			
		||||
import { Type } from './type';
 | 
			
		||||
@@ -19,9 +19,7 @@ export const Interface = (props: InterfaceProps) => {
 | 
			
		||||
        return (
 | 
			
		||||
            <span key={`property-${property.name}-${property.type}-${type.name}`}>
 | 
			
		||||
                {property.name}:{' '}
 | 
			
		||||
                {property.type && property.type.typeDocType !== TypeDocTypes.Reflection ? (
 | 
			
		||||
                    <Type type={property.type} sectionName={props.sectionName} docsInfo={props.docsInfo} />
 | 
			
		||||
                ) : (
 | 
			
		||||
                {property.type && !_.isUndefined(property.type.method) ? (
 | 
			
		||||
                    <Signature
 | 
			
		||||
                        name={property.type.method.name}
 | 
			
		||||
                        returnType={property.type.method.returnType}
 | 
			
		||||
@@ -32,6 +30,8 @@ export const Interface = (props: InterfaceProps) => {
 | 
			
		||||
                        shouldUseArrowSyntax={true}
 | 
			
		||||
                        docsInfo={props.docsInfo}
 | 
			
		||||
                    />
 | 
			
		||||
                ) : (
 | 
			
		||||
                    <Type type={property.type} sectionName={props.sectionName} docsInfo={props.docsInfo} />
 | 
			
		||||
                )},
 | 
			
		||||
            </span>
 | 
			
		||||
        );
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ import * as React from 'react';
 | 
			
		||||
 | 
			
		||||
import { DocsInfo } from '../docs_info';
 | 
			
		||||
import { Parameter, Type as TypeDef, TypeDefinitionByName, TypeParameter } from '../types';
 | 
			
		||||
import { constants } from '../utils/constants';
 | 
			
		||||
 | 
			
		||||
import { Type } from './type';
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -93,19 +93,38 @@ export function Type(props: TypeProps): any {
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case TypeDocTypes.Reflection:
 | 
			
		||||
            typeName = (
 | 
			
		||||
                <Signature
 | 
			
		||||
                    name={type.method.name}
 | 
			
		||||
                    returnType={type.method.returnType}
 | 
			
		||||
                    parameters={type.method.parameters}
 | 
			
		||||
                    typeParameter={type.method.typeParameter}
 | 
			
		||||
                    sectionName={props.sectionName}
 | 
			
		||||
                    shouldHideMethodName={true}
 | 
			
		||||
                    shouldUseArrowSyntax={true}
 | 
			
		||||
                    docsInfo={props.docsInfo}
 | 
			
		||||
                    typeDefinitionByName={props.typeDefinitionByName}
 | 
			
		||||
                />
 | 
			
		||||
            );
 | 
			
		||||
            if (!_.isUndefined(type.method)) {
 | 
			
		||||
                typeName = (
 | 
			
		||||
                    <Signature
 | 
			
		||||
                        name={type.method.name}
 | 
			
		||||
                        returnType={type.method.returnType}
 | 
			
		||||
                        parameters={type.method.parameters}
 | 
			
		||||
                        typeParameter={type.method.typeParameter}
 | 
			
		||||
                        sectionName={props.sectionName}
 | 
			
		||||
                        shouldHideMethodName={true}
 | 
			
		||||
                        shouldUseArrowSyntax={true}
 | 
			
		||||
                        docsInfo={props.docsInfo}
 | 
			
		||||
                        typeDefinitionByName={props.typeDefinitionByName}
 | 
			
		||||
                    />
 | 
			
		||||
                );
 | 
			
		||||
            } else if (!_.isUndefined(type.indexSignature)) {
 | 
			
		||||
                const is = type.indexSignature;
 | 
			
		||||
                const param = (
 | 
			
		||||
                    <span key={`indexSigParams-${is.keyName}-${is.keyType}-${type.name}`}>
 | 
			
		||||
                        {is.keyName}:{' '}
 | 
			
		||||
                        <Type type={is.keyType} sectionName={props.sectionName} docsInfo={props.docsInfo} />
 | 
			
		||||
                    </span>
 | 
			
		||||
                );
 | 
			
		||||
                typeName = (
 | 
			
		||||
                    <span key={`indexSignature-${type.name}-${is.keyType.name}`}>
 | 
			
		||||
                        {'{'}[{param}]: {is.valueName}
 | 
			
		||||
                        {'}'}
 | 
			
		||||
                    </span>
 | 
			
		||||
                );
 | 
			
		||||
            } else {
 | 
			
		||||
                throw new Error(`Unrecognized Reflection type that isn't a Method nor an Index Signature`);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case TypeDocTypes.TypeParameter:
 | 
			
		||||
 
 | 
			
		||||
@@ -35,6 +35,7 @@ export interface TypeDocType {
 | 
			
		||||
    typeArguments?: TypeDocType[];
 | 
			
		||||
    declaration: TypeDocNode;
 | 
			
		||||
    elementType?: TypeDocType;
 | 
			
		||||
    indexSignature?: TypeDocNode;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface TypeDocFlags {
 | 
			
		||||
@@ -64,7 +65,7 @@ export interface TypeDocNode {
 | 
			
		||||
    returns?: string;
 | 
			
		||||
    declaration: TypeDocNode;
 | 
			
		||||
    flags?: TypeDocFlags;
 | 
			
		||||
    indexSignature?: TypeDocNode | TypeDocNode[]; // TypeDocNode in TypeDoc <V0.9.0, TypeDocNode[] in >V0.9.0
 | 
			
		||||
    indexSignature?: TypeDocNode;
 | 
			
		||||
    signatures?: TypeDocNode[];
 | 
			
		||||
    parameters?: TypeDocNode[];
 | 
			
		||||
    typeParameter?: TypeDocNode[];
 | 
			
		||||
@@ -156,6 +157,7 @@ export interface Type {
 | 
			
		||||
    elementType?: ElementType;
 | 
			
		||||
    types?: Type[];
 | 
			
		||||
    method?: TypescriptMethod;
 | 
			
		||||
    indexSignature?: IndexSignature;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface ElementType {
 | 
			
		||||
 
 | 
			
		||||
@@ -63,9 +63,12 @@ export const typeDocUtils = {
 | 
			
		||||
        const exportPathToTypedocName = generatedDocJson.metadata.exportPathToTypedocName;
 | 
			
		||||
        const typeDocJson = generatedDocJson.typedocJson;
 | 
			
		||||
 | 
			
		||||
        const typeDocNameOrder = _.map(exportPathOrder, exportPath => {
 | 
			
		||||
            return exportPathToTypedocName[exportPath];
 | 
			
		||||
        });
 | 
			
		||||
        // TODO: Extract the non typeDoc exports, and render them somehow
 | 
			
		||||
        const typeDocNameOrder = _.compact(
 | 
			
		||||
            _.map(exportPathOrder, exportPath => {
 | 
			
		||||
                return exportPathToTypedocName[exportPath];
 | 
			
		||||
            }),
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        const docAgnosticFormat: DocAgnosticFormat = {};
 | 
			
		||||
        const typeEntities: TypeDocNode[] = [];
 | 
			
		||||
@@ -111,14 +114,16 @@ export const typeDocUtils = {
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
        docsInfo.sections[constants.TYPES_SECTION_NAME] = constants.TYPES_SECTION_NAME;
 | 
			
		||||
        docsInfo.menu[constants.TYPES_SECTION_NAME] = [constants.TYPES_SECTION_NAME];
 | 
			
		||||
        const docSection = typeDocUtils._convertEntitiesToDocSection(
 | 
			
		||||
            typeEntities,
 | 
			
		||||
            docsInfo,
 | 
			
		||||
            constants.TYPES_SECTION_NAME,
 | 
			
		||||
        );
 | 
			
		||||
        docAgnosticFormat[constants.TYPES_SECTION_NAME] = docSection;
 | 
			
		||||
        if (!_.isEmpty(typeEntities)) {
 | 
			
		||||
            docsInfo.sections[constants.TYPES_SECTION_NAME] = constants.TYPES_SECTION_NAME;
 | 
			
		||||
            docsInfo.menu[constants.TYPES_SECTION_NAME] = [constants.TYPES_SECTION_NAME];
 | 
			
		||||
            const docSection = typeDocUtils._convertEntitiesToDocSection(
 | 
			
		||||
                typeEntities,
 | 
			
		||||
                docsInfo,
 | 
			
		||||
                constants.TYPES_SECTION_NAME,
 | 
			
		||||
            );
 | 
			
		||||
            docAgnosticFormat[constants.TYPES_SECTION_NAME] = docSection;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return docAgnosticFormat;
 | 
			
		||||
    },
 | 
			
		||||
@@ -218,13 +223,7 @@ export const typeDocUtils = {
 | 
			
		||||
            ? typeDocUtils._convertMethod(entity.declaration, isConstructor, sections, sectionName, docId)
 | 
			
		||||
            : undefined;
 | 
			
		||||
        const doesIndexSignatureExist = !_.isUndefined(entity.indexSignature);
 | 
			
		||||
        const isIndexSignatureArray = _.isArray(entity.indexSignature);
 | 
			
		||||
        // HACK: TypeDoc Versions <0.9.0 indexSignature is of type TypeDocNode[]
 | 
			
		||||
        // Versions >0.9.0 have it as type TypeDocNode
 | 
			
		||||
        const indexSignature =
 | 
			
		||||
            doesIndexSignatureExist && isIndexSignatureArray
 | 
			
		||||
                ? (entity.indexSignature as TypeDocNode[])[0]
 | 
			
		||||
                : (entity.indexSignature as TypeDocNode);
 | 
			
		||||
        const indexSignature = entity.indexSignature as TypeDocNode;
 | 
			
		||||
        const indexSignatureIfExists = doesIndexSignatureExist
 | 
			
		||||
            ? typeDocUtils._convertIndexSignature(indexSignature, sections, sectionName, docId)
 | 
			
		||||
            : undefined;
 | 
			
		||||
@@ -305,6 +304,9 @@ export const typeDocUtils = {
 | 
			
		||||
        sectionName: string,
 | 
			
		||||
        docId: string,
 | 
			
		||||
    ): TypescriptMethod {
 | 
			
		||||
        if (_.isUndefined(entity.signatures)) {
 | 
			
		||||
            console.log(entity);
 | 
			
		||||
        }
 | 
			
		||||
        const signature = entity.signatures[0];
 | 
			
		||||
        const source = entity.sources[0];
 | 
			
		||||
        const hasComment = !_.isUndefined(signature.comment);
 | 
			
		||||
@@ -436,9 +438,17 @@ export const typeDocUtils = {
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const isConstructor = false;
 | 
			
		||||
        const methodIfExists = !_.isUndefined(entity.declaration)
 | 
			
		||||
            ? typeDocUtils._convertMethod(entity.declaration, isConstructor, sections, sectionName, docId)
 | 
			
		||||
            : undefined;
 | 
			
		||||
        const doesIndexSignatureExist =
 | 
			
		||||
            !_.isUndefined(entity.declaration) && !_.isUndefined(entity.declaration.indexSignature);
 | 
			
		||||
        let indexSignatureIfExists;
 | 
			
		||||
        if (doesIndexSignatureExist) {
 | 
			
		||||
            const indexSignature = entity.declaration.indexSignature as TypeDocNode;
 | 
			
		||||
            indexSignatureIfExists = typeDocUtils._convertIndexSignature(indexSignature, sections, sectionName, docId);
 | 
			
		||||
        }
 | 
			
		||||
        const methodIfExists =
 | 
			
		||||
            !_.isUndefined(entity.declaration) && !doesIndexSignatureExist
 | 
			
		||||
                ? typeDocUtils._convertMethod(entity.declaration, isConstructor, sections, sectionName, docId)
 | 
			
		||||
                : undefined;
 | 
			
		||||
 | 
			
		||||
        const elementTypeIfExists = !_.isUndefined(entity.elementType)
 | 
			
		||||
            ? {
 | 
			
		||||
@@ -455,6 +465,7 @@ export const typeDocUtils = {
 | 
			
		||||
            elementType: elementTypeIfExists,
 | 
			
		||||
            types,
 | 
			
		||||
            method: methodIfExists,
 | 
			
		||||
            indexSignature: indexSignatureIfExists,
 | 
			
		||||
        };
 | 
			
		||||
        return type;
 | 
			
		||||
    },
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user