UNPKG

@sanity/tsdoc

Version:

Generate API reference docs from TypeScript projects and store in a Sanity-friendly JSON format. Render a static frontend, or as React components.

181 lines (163 loc) 5.81 kB
import { ApiCallSignature, ApiConstructSignature, ApiIndexSignature, ApiInterface, ApiItem, ApiMethodSignature, ApiPropertySignature, } from '@microsoft/api-extractor-model' import {SerializedAPIInterface, SerializedAPIInterfaceMember} from '../types' import {_transformParameter} from './_transformParameter' import {_transformTokens} from './_transformTokens' import {_transformTypeParameter} from './_transformTypeParameter' import {RELEASE_TAGS} from './constants' import {_sanitizeName, _slugify} from './helpers' import {_transformDocComment} from './transformDocComment' import {TransformContext} from './types' /** * @internal */ export function _transformInterface( ctx: TransformContext, node: ApiInterface, ): SerializedAPIInterface { if (!ctx.export) { throw new Error('transformEnum: missing `export` document') } if (!ctx.package) { throw new Error('transformEnum: missing `package` document') } if (!ctx.release) { throw new Error('transformEnum: missing `release` document') } const docComment = node.tsdocComment const name = _sanitizeName(node.name) return { _type: 'api.interface', comment: docComment ? _transformDocComment(docComment) : undefined, export: {_type: 'reference', _ref: ctx.export._id}, extends: node.extendsTypes.map((t, idx) => { return { _type: 'api.extend', _key: `extend${idx}`, type: _transformTokens( ctx, t.excerpt.tokens.slice(t.excerpt.tokenRange.startIndex, t.excerpt.tokenRange.endIndex), ), } }), members: node.members.map((m, idx) => ({ _key: `member${idx}`, ..._transformInterfaceMember(ctx, m), })), name, package: {_type: 'reference', _ref: ctx.package._id}, release: {_type: 'reference', _ref: ctx.release._id}, releaseTag: RELEASE_TAGS[node.releaseTag], slug: {_type: 'slug', current: _slugify(name)}, typeParameters: node.typeParameters.map((p, idx: number) => { return _transformTypeParameter(ctx, node, p, idx) }), } } function _transformInterfaceMember( ctx: TransformContext, m: ApiItem, ): SerializedAPIInterfaceMember { if (m.kind === 'CallSignature') { const mem = m as ApiCallSignature const docComment = mem.tsdocComment return { _type: 'api.callSignature', comment: docComment ? _transformDocComment(docComment) : undefined, // members: mem.members.map((m) => _transformInterfaceMember(ctx, m)), parameters: mem.parameters.map((p, idx) => _transformParameter(ctx, mem, p, idx)), releaseTag: RELEASE_TAGS[mem.releaseTag], returnType: _transformTokens( ctx, mem.excerptTokens.slice( mem.returnTypeExcerpt.tokenRange.startIndex, mem.returnTypeExcerpt.tokenRange.endIndex, ), ), typeParameters: mem.typeParameters.map((p, idx) => _transformTypeParameter(ctx, mem, p, idx)), } } if (m.kind === 'ConstructSignature') { const mem = m as ApiConstructSignature const docComment = mem.tsdocComment return { _type: 'api.constructSignature', comment: docComment ? _transformDocComment(docComment) : undefined, // members: mem.members.map((m) => _transformInterfaceMember(ctx, m)), parameters: mem.parameters.map((p, idx) => _transformParameter(ctx, mem, p, idx)), releaseTag: RELEASE_TAGS[mem.releaseTag], returnType: _transformTokens( ctx, mem.excerptTokens.slice( mem.returnTypeExcerpt.tokenRange.startIndex, mem.returnTypeExcerpt.tokenRange.endIndex, ), ), typeParameters: mem.typeParameters.map((p, idx) => _transformTypeParameter(ctx, mem, p, idx)), } } if (m.kind === 'MethodSignature') { const mem = m as ApiMethodSignature const docComment = mem.tsdocComment return { _type: 'api.methodSignature', comment: docComment ? _transformDocComment(docComment) : undefined, isOptional: mem.isOptional, // members: mem.members.map((m) => _transformInterfaceMember(ctx, m)), name: mem.name, parameters: mem.parameters.map((p, idx) => _transformParameter(ctx, mem, p, idx)), releaseTag: RELEASE_TAGS[mem.releaseTag], returnType: _transformTokens( ctx, mem.excerptTokens.slice( mem.returnTypeExcerpt.tokenRange.startIndex, mem.returnTypeExcerpt.tokenRange.endIndex, ), ), typeParameters: mem.typeParameters.map((p, idx) => _transformTypeParameter(ctx, mem, p, idx)), } } if (m.kind === 'PropertySignature') { const mem = m as ApiPropertySignature const docComment = mem.tsdocComment return { _type: 'api.propertySignature', comment: docComment ? _transformDocComment(docComment) : undefined, isOptional: mem.isOptional, name: mem.name, releaseTag: RELEASE_TAGS[mem.releaseTag], type: _transformTokens( ctx, mem.excerptTokens.slice( mem.propertyTypeExcerpt.tokenRange.startIndex, mem.propertyTypeExcerpt.tokenRange.endIndex, ), ), } } if (m.kind === 'IndexSignature') { const mem = m as ApiIndexSignature const docComment = mem.tsdocComment return { _type: 'api.indexSignature', comment: docComment ? _transformDocComment(docComment) : undefined, parameters: mem.parameters.map((p, idx) => _transformParameter(ctx, mem, p, idx)), releaseTag: RELEASE_TAGS[mem.releaseTag], returnType: _transformTokens( ctx, mem.excerptTokens.slice( mem.returnTypeExcerpt.tokenRange.startIndex, mem.returnTypeExcerpt.tokenRange.endIndex, ), ), } } throw new Error(`Unknown interface member kind: ${m.kind}`) }