@bitjson/typedoc
Version:
Create api documentation for TypeScript projects.
277 lines • 11.9 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var CommentPlugin_1;
Object.defineProperty(exports, "__esModule", { value: true });
const index_1 = require("../../models/comments/index");
const index_2 = require("../../models/types/index");
const index_3 = require("../../models/reflections/index");
const components_1 = require("../components");
const comment_1 = require("../factories/comment");
const converter_1 = require("../converter");
let CommentPlugin = CommentPlugin_1 = class CommentPlugin extends components_1.ConverterComponent {
initialize() {
this.listenTo(this.owner, {
[converter_1.Converter.EVENT_BEGIN]: this.onBegin,
[converter_1.Converter.EVENT_CREATE_DECLARATION]: this.onDeclaration,
[converter_1.Converter.EVENT_CREATE_SIGNATURE]: this.onDeclaration,
[converter_1.Converter.EVENT_CREATE_TYPE_PARAMETER]: this.onCreateTypeParameter,
[converter_1.Converter.EVENT_FUNCTION_IMPLEMENTATION]: this.onFunctionImplementation,
[converter_1.Converter.EVENT_RESOLVE_BEGIN]: this.onBeginResolve,
[converter_1.Converter.EVENT_RESOLVE]: this.onResolve
});
}
storeModuleComment(comment, reflection) {
const isPreferred = (comment.toLowerCase().includes('@preferred'));
if (this.comments[reflection.id]) {
const info = this.comments[reflection.id];
if (!isPreferred && (info.isPreferred || info.fullText.length > comment.length)) {
return;
}
info.fullText = comment;
info.isPreferred = isPreferred;
}
else {
this.comments[reflection.id] = {
reflection: reflection,
fullText: comment,
isPreferred: isPreferred
};
}
}
applyModifiers(reflection, comment) {
if (comment.hasTag('private')) {
reflection.setFlag(index_3.ReflectionFlag.Private);
CommentPlugin_1.removeTags(comment, 'private');
}
if (comment.hasTag('protected')) {
reflection.setFlag(index_3.ReflectionFlag.Protected);
CommentPlugin_1.removeTags(comment, 'protected');
}
if (comment.hasTag('public')) {
reflection.setFlag(index_3.ReflectionFlag.Public);
CommentPlugin_1.removeTags(comment, 'public');
}
if (comment.hasTag('event')) {
reflection.kind = index_3.ReflectionKind.Event;
CommentPlugin_1.removeTags(comment, 'event');
}
if (comment.hasTag('hidden') || comment.hasTag('ignore')) {
if (!this.hidden) {
this.hidden = [];
}
this.hidden.push(reflection);
}
}
onBegin(context) {
this.hidden = undefined;
this.comments = {};
}
onCreateTypeParameter(context, reflection, node) {
const comment = reflection.parent && reflection.parent.comment;
if (comment) {
let tag = comment.getTag('typeparam', reflection.name);
if (!tag) {
tag = comment.getTag('param', `<${reflection.name}>`);
}
if (!tag) {
tag = comment.getTag('param', reflection.name);
}
if (tag) {
reflection.comment = new index_1.Comment(tag.text);
comment.tags.splice(comment.tags.indexOf(tag), 1);
}
}
}
onDeclaration(context, reflection, node) {
if (!node) {
return;
}
const rawComment = comment_1.getRawComment(node);
if (!rawComment) {
return;
}
if (reflection.kindOf(index_3.ReflectionKind.FunctionOrMethod) || (reflection.kindOf(index_3.ReflectionKind.Event) && reflection['signatures'])) {
const comment = comment_1.parseComment(rawComment, reflection.comment);
this.applyModifiers(reflection, comment);
}
else if (reflection.kindOf(index_3.ReflectionKind.Module)) {
this.storeModuleComment(rawComment, reflection);
}
else {
const comment = comment_1.parseComment(rawComment, reflection.comment);
this.applyModifiers(reflection, comment);
reflection.comment = comment;
}
}
onFunctionImplementation(context, reflection, node) {
if (!node) {
return;
}
const comment = comment_1.getRawComment(node);
if (comment) {
reflection.comment = comment_1.parseComment(comment, reflection.comment);
}
}
onBeginResolve(context) {
for (let id in this.comments) {
if (!this.comments.hasOwnProperty(id)) {
continue;
}
const info = this.comments[id];
const comment = comment_1.parseComment(info.fullText);
CommentPlugin_1.removeTags(comment, 'preferred');
this.applyModifiers(info.reflection, comment);
info.reflection.comment = comment;
}
if (this.hidden) {
const project = context.project;
CommentPlugin_1.removeReflections(project, this.hidden);
}
}
onResolve(context, reflection) {
if (!(reflection instanceof index_3.DeclarationReflection)) {
return;
}
const signatures = reflection.getAllSignatures();
if (signatures.length) {
const comment = reflection.comment;
if (comment && comment.hasTag('returns')) {
comment.returns = comment.getTag('returns').text;
CommentPlugin_1.removeTags(comment, 'returns');
}
signatures.forEach((signature) => {
let childComment = signature.comment;
if (childComment && childComment.hasTag('returns')) {
childComment.returns = childComment.getTag('returns').text;
CommentPlugin_1.removeTags(childComment, 'returns');
}
if (comment) {
if (!childComment) {
childComment = signature.comment = new index_1.Comment();
}
childComment.shortText = childComment.shortText || comment.shortText;
childComment.text = childComment.text || comment.text;
childComment.returns = childComment.returns || comment.returns;
}
if (signature.parameters) {
signature.parameters.forEach((parameter) => {
let tag;
if (childComment) {
tag = childComment.getTag('param', parameter.name);
}
if (comment && !tag) {
tag = comment.getTag('param', parameter.name);
}
if (tag) {
parameter.comment = new index_1.Comment(tag.text);
}
});
}
CommentPlugin_1.removeTags(childComment, 'param');
});
CommentPlugin_1.removeTags(comment, 'param');
}
}
static removeTags(comment, tagName) {
if (!comment || !comment.tags) {
return;
}
let i = 0, c = comment.tags.length;
while (i < c) {
if (comment.tags[i].tagName === tagName) {
comment.tags.splice(i, 1);
c--;
}
else {
i++;
}
}
}
static removeReflections(project, reflections) {
const deletedIds = [];
reflections.forEach((reflection) => {
CommentPlugin_1.removeReflection(project, reflection, deletedIds);
});
for (let key in project.symbolMapping) {
if (project.symbolMapping.hasOwnProperty(key) && deletedIds.includes(project.symbolMapping[key])) {
delete project.symbolMapping[key];
}
}
}
static removeReflection(project, reflection, deletedIds) {
reflection.traverse((child) => CommentPlugin_1.removeReflection(project, child, deletedIds));
const parent = reflection.parent;
parent.traverse((child, property) => {
if (child === reflection) {
switch (property) {
case index_3.TraverseProperty.Children:
if (parent.children) {
const index = parent.children.indexOf(reflection);
if (index !== -1) {
parent.children.splice(index, 1);
}
}
break;
case index_3.TraverseProperty.GetSignature:
delete parent.getSignature;
break;
case index_3.TraverseProperty.IndexSignature:
delete parent.indexSignature;
break;
case index_3.TraverseProperty.Parameters:
if (reflection.parent.parameters) {
const index = reflection.parent.parameters.indexOf(reflection);
if (index !== -1) {
reflection.parent.parameters.splice(index, 1);
}
}
break;
case index_3.TraverseProperty.SetSignature:
delete parent.setSignature;
break;
case index_3.TraverseProperty.Signatures:
if (parent.signatures) {
const index = parent.signatures.indexOf(reflection);
if (index !== -1) {
parent.signatures.splice(index, 1);
}
}
break;
case index_3.TraverseProperty.TypeLiteral:
parent.type = new index_2.IntrinsicType('Object');
break;
case index_3.TraverseProperty.TypeParameter:
if (parent.typeParameters) {
const index = parent.typeParameters.indexOf(reflection);
if (index !== -1) {
parent.typeParameters.splice(index, 1);
}
}
break;
}
}
});
let id = reflection.id;
delete project.reflections[id];
if (deletedIds) {
deletedIds.push(id);
}
else {
for (let key in project.symbolMapping) {
if (project.symbolMapping.hasOwnProperty(key) && project.symbolMapping[key] === id) {
delete project.symbolMapping[key];
}
}
}
}
};
CommentPlugin = CommentPlugin_1 = __decorate([
components_1.Component({ name: 'comment' })
], CommentPlugin);
exports.CommentPlugin = CommentPlugin;
//# sourceMappingURL=CommentPlugin.js.map
;