aboutsummaryrefslogtreecommitdiff
path: root/scripts/apidocs/processing/jsdocs.ts
diff options
context:
space:
mode:
authorST-DDT <[email protected]>2024-04-01 10:21:18 +0200
committerGitHub <[email protected]>2024-04-01 10:21:18 +0200
commit6191a5d883048b694404dbf42527caba395828ea (patch)
treed0f18f17789cb0bbdb5d6087f1a95772438dfe27 /scripts/apidocs/processing/jsdocs.ts
parent7dae52bfcd93c41ec9d2c4dd4d96a07f31c3dfc1 (diff)
downloadfaker-6191a5d883048b694404dbf42527caba395828ea.tar.xz
faker-6191a5d883048b694404dbf42527caba395828ea.zip
docs: rewrite api-docs generation using ts-morph (#2628)
Diffstat (limited to 'scripts/apidocs/processing/jsdocs.ts')
-rw-r--r--scripts/apidocs/processing/jsdocs.ts91
1 files changed, 91 insertions, 0 deletions
diff --git a/scripts/apidocs/processing/jsdocs.ts b/scripts/apidocs/processing/jsdocs.ts
new file mode 100644
index 00000000..4a8e5b08
--- /dev/null
+++ b/scripts/apidocs/processing/jsdocs.ts
@@ -0,0 +1,91 @@
+import type { JSDoc, JSDocTag, JSDocableNode } from 'ts-morph';
+import { JSDocParameterTag, JSDocTemplateTag } from 'ts-morph';
+import {
+ allRequired,
+ exactlyOne,
+ optionalOne,
+ required,
+} from '../utils/value-checks';
+
+export type JSDocableLikeNode = Pick<JSDocableNode, 'getJsDocs'>;
+
+export function getJsDocs(node: JSDocableLikeNode): JSDoc {
+ return exactlyOne(node.getJsDocs(), 'jsdocs');
+}
+
+export function getDeprecated(jsdocs: JSDoc): string | undefined {
+ return getOptionalTagFromJSDoc(jsdocs, 'deprecated');
+}
+
+export function getDescription(jsdocs: JSDoc | JSDocTag): string {
+ return required(jsdocs.getCommentText(), 'jsdocs description');
+}
+
+export function getSince(jsdocs: JSDoc): string {
+ return getExactlyOneTagFromJSDoc(jsdocs, 'since');
+}
+
+export function getTypeParameterTags(jsdocs: JSDoc): Record<string, JSDocTag> {
+ return Object.fromEntries(
+ jsdocs
+ .getTags()
+ .filter((tag) => tag.getTagName() === 'template')
+ .filter((tag) => tag instanceof JSDocTemplateTag)
+ .map((tag) => tag as JSDocTemplateTag)
+ .map((tag) => [tag.getTypeParameters()[0].getName(), tag] as const)
+ );
+}
+
+export function getParameterTags(jsdocs: JSDoc): Record<string, JSDocTag> {
+ return Object.fromEntries(
+ jsdocs
+ .getTags()
+ .filter((tag) => tag.getTagName() === 'param')
+ .filter((tag) => tag instanceof JSDocParameterTag)
+ .map((tag) => tag as JSDocParameterTag)
+ .map((tag) => [tag.getName(), tag] as const)
+ );
+}
+
+export function getDefault(jsdocs: JSDoc): string | undefined {
+ return getOptionalTagFromJSDoc(jsdocs, `default`);
+}
+
+export function getThrows(jsdocs: JSDoc): string[] {
+ return getTagsFromJSDoc(jsdocs, 'throws');
+}
+
+export function getExamples(jsdocs: JSDoc): string[] {
+ return getTagsFromJSDoc(jsdocs, 'example');
+}
+
+export function getSeeAlsos(jsdocs: JSDoc): string[] {
+ return getTagsFromJSDoc(jsdocs, 'see', true);
+}
+
+function getOptionalTagFromJSDoc(
+ jsdocs: JSDoc,
+ type: string
+): string | undefined {
+ return optionalOne(getTagsFromJSDoc(jsdocs, type), `@${type}`);
+}
+
+function getExactlyOneTagFromJSDoc(jsdocs: JSDoc, type: string): string {
+ return exactlyOne(getTagsFromJSDoc(jsdocs, type), `@${type}`);
+}
+
+function getTagsFromJSDoc(
+ jsdocs: JSDoc,
+ type: string,
+ full: boolean = false
+): string[] {
+ return allRequired(
+ jsdocs
+ .getTags()
+ .filter((tag) => tag.getTagName() === type)
+ .map((tag) =>
+ full ? tag.getStructure().text?.toString() : tag.getCommentText()
+ ),
+ `@${type}`
+ );
+}