@nestia/sdk
Version:
Nestia SDK and Swagger generator
65 lines (60 loc) • 2.12 kB
text/typescript
import { IJsDocTagInfo } from "typia";
export namespace SwaggerDescriptionComposer {
export const compose = <Kind extends "summary" | "title">(props: {
description: string | null;
jsDocTags: IJsDocTagInfo[];
kind: Kind;
}): Kind extends "summary"
? { summary?: string; description?: string }
: { title?: string; description?: string } => {
const title: string | undefined = (() => {
const [explicit] = getJsDocTexts({
jsDocTags: props.jsDocTags,
name: props.kind,
});
if (explicit?.length) return explicit;
else if (!props.description?.length) return undefined;
const index: number = props.description.indexOf("\n");
const top: string = (
index === -1 ? props.description : props.description.substring(0, index)
).trim();
return top.endsWith(".") ? top.substring(0, top.length - 1) : undefined;
})();
return {
[props.kind]: title,
description: props.description?.length ? props.description : undefined,
} as any;
};
export const descriptionFromJsDocTag = (props: {
jsDocTags: IJsDocTagInfo[];
tag: string;
parameter?: string;
}): string | undefined => {
const parametric: (elem: IJsDocTagInfo) => boolean = props.parameter
? (tag) =>
tag.text!.find(
(elem) =>
elem.kind === "parameterName" && elem.text === props.parameter,
) !== undefined
: () => true;
const tag: IJsDocTagInfo | undefined = props.jsDocTags.find(
(tag) => tag.name === props.tag && tag.text && parametric(tag),
);
return tag && tag.text
? tag.text.find((elem) => elem.kind === "text")?.text
: undefined;
};
export const getJsDocTexts = (props: {
jsDocTags: IJsDocTagInfo[];
name: string;
}): string[] =>
props.jsDocTags
.filter(
(tag) =>
tag.name === props.name &&
tag.text &&
tag.text.find((elem) => elem.kind === "text" && elem.text.length) !==
undefined,
)
.map((tag) => tag.text!.find((elem) => elem.kind === "text")!.text);
}