UNPKG

@jsdocs-io/extractor

Version:

The API extractor for npm packages powering jsdocs.io

188 lines (187 loc) 7.95 kB
import { orderBy } from "natural-orderby"; import { docs } from "./docs.js"; import { formatSignature } from "./format-signature.js"; import { headText } from "./head-text.js"; import { id } from "./id.js"; import { isHidden } from "./is-hidden.js"; import { sourceFilePath } from "./source-file-path.js"; import { typeCheckerType } from "./type-checker-type.js"; export async function extractInterface(containerName, exportName, declaration) { const interfaceId = id(containerName, "+interface", exportName); return { kind: "interface", id: interfaceId, name: exportName, docs: docs(declaration), file: sourceFilePath(declaration), line: declaration.getStartLineNumber(), signature: await interfaceSignature(declaration), properties: await extractInterfaceProperties(interfaceId, declaration), methods: await extractInterfaceMethods(interfaceId, declaration), constructSignatures: await extractInterfaceConstructSignatures(interfaceId, declaration), callSignatures: await extractInterfaceCallSignatures(interfaceId, declaration), indexSignatures: await extractInterfaceIndexSignatures(interfaceId, declaration), getAccessors: await extractInterfaceGetAccessors(interfaceId, declaration), setAccessors: await extractInterfaceSetAccessors(interfaceId, declaration), }; } async function interfaceSignature(declaration) { const signature = headText(declaration); return await formatSignature("interface", signature); } async function extractInterfaceProperties(interfaceId, interfaceDeclaration) { const properties = []; for (const declaration of interfaceDeclaration.getProperties()) { if (isHidden(declaration)) continue; const name = declaration.getName(); properties.push({ kind: "interface-property", id: id(interfaceId, "+property", name), name, docs: docs(declaration), file: sourceFilePath(declaration), line: declaration.getStartLineNumber(), signature: await interfacePropertySignature(declaration), }); } return orderBy(properties, "id"); } async function interfacePropertySignature(declaration) { const signature = declaration.getText(); return await formatSignature("interface-property", signature); } async function extractInterfaceMethods(interfaceId, interfaceDeclaration) { const methods = []; const seenMethods = new Set(); for (const declaration of interfaceDeclaration.getMethods()) { const name = declaration.getName(); // Skip overloaded methods. if (seenMethods.has(name)) continue; if (isHidden(declaration)) continue; seenMethods.add(name); methods.push({ kind: "interface-method", id: id(interfaceId, "+method", name), name, docs: docs(declaration), file: sourceFilePath(declaration), line: declaration.getStartLineNumber(), signature: await interfaceMethodSignature(name, declaration), }); } return orderBy(methods, "id"); } async function interfaceMethodSignature(name, declaration) { const type = typeCheckerType(declaration); return await formatSignature("interface-method", `${name}: ${type}`); } async function extractInterfaceConstructSignatures(interfaceId, interfaceDeclaration) { const constructSignatures = []; for (const [index, declaration] of interfaceDeclaration.getConstructSignatures().entries()) { if (isHidden(declaration)) continue; constructSignatures.push({ kind: "interface-construct-signature", id: id(interfaceId, "construct-signature", index > 0 ? `${index}` : ""), name: "construct-signature", docs: docs(declaration), file: sourceFilePath(declaration), line: declaration.getStartLineNumber(), signature: await interfaceConstructSignatureSignature(declaration), }); } return orderBy(constructSignatures, "id"); } async function interfaceConstructSignatureSignature(declaration) { const signature = declaration.getText(); return await formatSignature("interface-construct-signature", signature); } async function extractInterfaceCallSignatures(interfaceId, interfaceDeclaration) { const callSignatures = []; for (const [index, declaration] of interfaceDeclaration.getCallSignatures().entries()) { if (isHidden(declaration)) continue; callSignatures.push({ kind: "interface-call-signature", id: id(interfaceId, "call-signature", index > 0 ? `${index}` : ""), name: "call-signature", docs: docs(declaration), file: sourceFilePath(declaration), line: declaration.getStartLineNumber(), signature: await interfaceCallSignatureSignature(declaration), }); } return orderBy(callSignatures, "id"); } async function interfaceCallSignatureSignature(declaration) { const signature = declaration.getText(); return await formatSignature("interface-call-signature", signature); } async function extractInterfaceIndexSignatures(interfaceId, interfaceDeclaration) { const indexSignatures = []; for (const [index, declaration] of interfaceDeclaration.getIndexSignatures().entries()) { if (isHidden(declaration)) continue; indexSignatures.push({ kind: "interface-index-signature", id: id(interfaceId, "index-signature", index > 0 ? `${index}` : ""), name: "index-signature", docs: docs(declaration), file: sourceFilePath(declaration), line: declaration.getStartLineNumber(), signature: await interfaceIndexSignatureSignature(declaration), }); } return orderBy(indexSignatures, "id"); } async function interfaceIndexSignatureSignature(declaration) { const signature = declaration.getText(); return await formatSignature("interface-index-signature", signature); } async function extractInterfaceGetAccessors(interfaceId, interfaceDeclaration) { const getAccessors = []; for (const declaration of interfaceDeclaration.getGetAccessors()) { if (isHidden(declaration)) continue; const name = declaration.getName(); getAccessors.push({ kind: "interface-get-accessor", id: id(interfaceId, "+get-accessor", name), name, docs: docs(declaration), file: sourceFilePath(declaration), line: declaration.getStartLineNumber(), signature: await interfaceGetAccessorSignature(declaration), }); } return orderBy(getAccessors, "id"); } async function interfaceGetAccessorSignature(declaration) { const signature = declaration.getText(); return await formatSignature("interface-get-accessor", signature); } async function extractInterfaceSetAccessors(interfaceId, interfaceDeclaration) { const setAccessors = []; for (const declaration of interfaceDeclaration.getSetAccessors()) { if (isHidden(declaration)) continue; const name = declaration.getName(); setAccessors.push({ kind: "interface-set-accessor", id: id(interfaceId, "+set-accessor", name), name, docs: docs(declaration), file: sourceFilePath(declaration), line: declaration.getStartLineNumber(), signature: await interfaceSetAccessorSignature(declaration), }); } return orderBy(setAccessors, "id"); } async function interfaceSetAccessorSignature(declaration) { const signature = declaration.getText(); return await formatSignature("interface-get-accessor", signature); }