typedoc-plugin-markdown
Version:
A plugin for TypeDoc that enables TypeScript API documentation to be generated in Markdown.
79 lines (78 loc) • 3.33 kB
JavaScript
import { backTicks, htmlTable, table } from '../../../libs/markdown/index.js';
import { removeLineBreaks } from '../../../libs/utils/index.js';
import { i18n, ReflectionKind, ReflectionType, } from 'typedoc';
export function parametersTable(model) {
const tableColumnsOptions = this.options.getValue('tableColumnSettings');
const leftAlignHeadings = tableColumnsOptions.leftAlignHeaders;
const parseParams = (current, acc) => {
const shouldFlatten = current.type?.declaration?.kind === ReflectionKind.TypeLiteral &&
current.type?.declaration?.children;
return shouldFlatten
? [...acc, current, ...flattenParams(current)]
: [...acc, current];
};
const flattenParams = (current) => {
return current.type?.declaration?.children?.reduce((acc, child) => {
const childObj = {
...child,
name: `${current.name}.${child.name}`,
};
return parseParams(childObj, acc);
}, []);
};
const showDefaults = !tableColumnsOptions.hideDefaults && hasDefaultValues(model);
const parsedParams = model.reduce((acc, current) => parseParams(current, acc), []);
const hasComments = parsedParams.some((param) => Boolean(param.comment));
const headers = [
ReflectionKind.singularString(ReflectionKind.Parameter),
i18n.theme_type(),
];
if (showDefaults) {
headers.push(i18n.theme_default_value());
}
if (hasComments) {
headers.push(i18n.theme_description());
}
const firstOptionalParamIndex = model.findIndex((parameter) => parameter.flags.isOptional);
const rows = [];
parsedParams.forEach((parameter, i) => {
const row = [];
const isOptional = parameter.flags.isOptional ||
(firstOptionalParamIndex !== -1 && i > firstOptionalParamIndex);
const rest = parameter.flags?.isRest ? '...' : '';
const optional = isOptional ? '?' : '';
row.push(`${rest}${backTicks(`${parameter.name}${optional}`)}`);
if (parameter.type) {
const displayType = parameter.type instanceof ReflectionType
? this.partials.reflectionType(parameter.type, {
forceCollapse: true,
})
: this.partials.someType(parameter.type);
row.push(removeLineBreaks(displayType));
}
if (showDefaults) {
row.push(backTicks(this.helpers.getParameterDefaultValue(parameter)));
}
if (hasComments) {
if (parameter.comment) {
const comments = this.partials.comment(parameter.comment, {
isTableColumn: true,
});
row.push(comments.length ? comments : '-');
}
else {
row.push('-');
}
}
rows.push(row);
});
return this.options.getValue('parametersFormat') == 'table'
? table(headers, rows, leftAlignHeadings)
: htmlTable(headers, rows, leftAlignHeadings);
}
function hasDefaultValues(parameters) {
const defaultValues = parameters.map((param) => param.defaultValue !== '{}' &&
param.defaultValue !== '...' &&
!!param.defaultValue);
return !defaultValues.every((value) => !value);
}