Skip to content

Commit

Permalink
feat(docusaurus-typedoc-json-parser): render classes
Browse files Browse the repository at this point in the history
  • Loading branch information
RealShadowNova committed Oct 23, 2022
1 parent dda3ee6 commit 1af8f47
Show file tree
Hide file tree
Showing 6 changed files with 149 additions and 8 deletions.
6 changes: 3 additions & 3 deletions docusaurus-typedoc-json-parser/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@ import { writeCategoryYaml } from './renderer/writeCategoryYaml';
import { renderOutputFiles } from './renderer/render';

ReferenceTypeParser.formatToString = (parser) => {
const typeArguments = parser.typeArguments.length > 0 ? `<${parser.typeArguments.map((type) => type.toString()).join(', ')}>` : '';
const typeArguments = parser.typeArguments.length > 0 ? `<${parser.typeArguments.map((type) => type.toString()).join(', ')}\\>` : '';

if (parser.id || parser.packageName) {
return `[${parser.name}](${parser.id ? parser.id : parser.packageName})${typeArguments}`;
return `[\`${parser.name}\`](${parser.id ? parser.id : parser.packageName})${typeArguments}`;
}

return `${parser.name}${typeArguments}`;
return `\`${parser.name}\`${typeArguments}`;
};

export default function docusaurusTypeDocJsonParser(context: LoadContext, options: PluginOptions): Plugin {
Expand Down
117 changes: 114 additions & 3 deletions docusaurus-typedoc-json-parser/src/renderer/renderClass.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { writeFileSync } from 'node:fs';
import { resolve } from 'node:path';
import type { ClassParser, ProjectParser, TypeParser } from 'typedoc-json-parser';
import { ClassMethodParser, ClassParser, ClassPropertyParser, ProjectParser, TypeParser } from 'typedoc-json-parser';
import { parseExamples } from './utilities/parseExamples';
import { parseParameters } from './utilities/parseParameters';
import { parseSee } from './utilities/parseSee';
import { parseTypeParameters } from './utilities/parseTypeParameters';
import { writeCategoryYaml } from './writeCategoryYaml';

function renderClass(classParser: ClassParser, outputDir: string, fileSidebarPosition: number) {
Expand All @@ -23,11 +25,29 @@ custom_edit_url: null
${classExtendsType === null ? '' : `**extends ${classExtendsType}**`}
${classImplementsTypes.length === 0 ? '' : `**implements ${classImplementsTypes.join(', ')}**`}
${classParser.comment.description ?? ''}
${
classParser.typeParameters.length
? `## Type Parameters
${parseTypeParameters(classParser.typeParameters)}`
: ''
}
${classParser.comment.description ?? 'No description provided.'}
${parseSee(classParser.comment.see)}
${parseExamples(classParser.comment.example)}
${
classParser.comment.example.length
? `## Examples
${parseExamples(classParser.comment.example)}`
: ''
}
${parseConstructor(classParser)}
${parseProperties(classParser.properties)}
${parseMethods(classParser.methods)}
`;

writeFileSync(resolve(outputDir, `${slug}.mdx`), result);
Expand All @@ -54,3 +74,94 @@ function parseExtendsType(typeParser: TypeParser | null): string | null {
function parseImplementsType(typeParsers: TypeParser[]): string[] {
return typeParsers.map((typeParser) => typeParser.toString());
}

function parseConstructor(classParser: ClassParser): string {
return `## Constructor
\`\`\`typescript ts2esm2cjs
new ${classParser.name}(${classParser.construct.parameters.map((parameter) => parameter.name).join(', ')})
\`\`\`
${
classParser.construct.parameters.length
? `${
classParser.construct.parameters.length
? `### Parameters
${parseParameters(classParser.construct.parameters)}`
: ''
}`
: ''
}`;
}

function parseProperties(properties: ClassPropertyParser[]): string {
if (!properties.length) return '';

return `
## Properties
${properties
.map(
(property) => `### ${
property.accessibility === ClassParser.Accessibility.Protected
? '`PROTECTED` '
: property.accessibility === ClassParser.Accessibility.Private
? '`PRIVATE` '
: ''
}${property.static ? '`STATIC` ' : ''}${property.readonly ? '`READONLY` ' : ''}${property.name}${
property.type ? `${property.optional ? '?' : ''}: ${property.type.toString()}` : ''
}
${property.comment.description ?? 'No description provided.'}`
)
.join('\n\n')}`;
}

function parseMethods(methods: ClassMethodParser[]): string {
if (!methods.length) return '';

return `
## Methods
${methods
.map((method) =>
method.signatures
.map(
(signature) =>
`### ${signature.name}${
signature.typeParameters.length ? `<${signature.typeParameters.map((typeParameter) => typeParameter.name).join(', ')}\\>` : ''
}(${signature.parameters.map((parameter) => parameter.name).join(', ')}): ${signature.returnType.toString()}
${signature.comment.description ?? 'No description provided.'}
${parseSee(signature.comment.see)}
${
signature.comment.example.length
? `#### Examples
${parseExamples(signature.comment.example)}`
: ''
}
${
signature.typeParameters.length
? `#### Type Parameters
${parseTypeParameters(signature.typeParameters)}`
: ''
}
${
signature.parameters.length
? `#### Parameters
${parseParameters(signature.parameters)}`
: ''
}`
)
.join('\n\n')
)
.join('\n\n')}`;
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ import type { CommentParser } from 'typedoc-json-parser';
export function parseExamples(blockTags: CommentParser.BlockTag[]): string {
if (blockTags.length === 0) return '';

return `## Examples\n\n${blockTags.map((blockTag) => blockTag.text.replace(/(```typescript)\n/g, '$1 ts2esm2cjs\n'))}`;
return `${blockTags.map((blockTag) => blockTag.text.replace(/(```typescript)\n/g, '$1 ts2esm2cjs\n'))}`;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import type { ParameterParser } from 'typedoc-json-parser';

export function parseParameters(parameters: ParameterParser[]): string {
if (!parameters.length) return '';

return `| Name | Type | Description |
| :---: | :---: | :---: | :---: |
${parameters
.map(
(parameter) =>
`| ${parameter.name} | ${parameter.type.toString().replace('/', '\\/')} | ${
parameter.comment.description ?? 'No description provided.'
} |`
)
.join('\n')}`;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import type { CommentParser } from 'typedoc-json-parser';

export function parseSee(blockTags: CommentParser.BlockTag[]): string {
return blockTags.map((blockTag) => `\n**\`See Also:\`** ${blockTag.text}`).join('\n');
if (blockTags.length === 0) return '';

return blockTags.map((blockTag) => `\n**See Also:** ${blockTag.text}`).join('\n');
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import type { TypeParameterParser } from 'typedoc-json-parser';

export function parseTypeParameters(typeParameters: TypeParameterParser[]): string {
if (!typeParameters.length) return '';

return `| Name | Type | Default |
| :---: | :---: | :---: |
${typeParameters.map(
(typeParameter) =>
`| ${typeParameter.name} | ${typeParameter.type?.toString() ?? 'Not provided.'} | ${typeParameter.default?.toString() ?? 'Not provided.'}`
)}`;
}

0 comments on commit 1af8f47

Please sign in to comment.