@jsdocs-io/extractor
Version:
The API extractor for npm packages powering jsdocs.io
68 lines (67 loc) • 2.53 kB
JavaScript
import { format } from "prettier";
export async function formatSignature(kind, signature) {
const s = signature
.trim()
// Remove unnecessary keywords at declaration start.
.replace(/^export\s+/, "")
.replace(/^default\s+/, "")
.replace(/^declare\s+/, "");
switch (kind) {
case "variable": {
// Temporarily replace the invalid variable name `default` before the type.
const raw = s.replace("default:", "_______:");
const formatted = await formatWithPrettier(raw);
return formatted.replace("_______:", "default:");
}
case "function": {
// Temporarily add `let` to format the function like a variable signature.
const raw = `let ${s.replace("default:", "_______:")}`;
const formatted = await formatWithPrettier(raw);
return formatted.replace("_______:", "default:").replace(/^let\s/, "");
}
case "class":
case "interface":
case "enum":
case "type":
case "namespace": {
// Just format the signature as-is.
const formatted = await formatWithPrettier(s);
return formatted;
}
case "class-constructor":
case "class-property":
case "class-method":
case "interface-property":
case "interface-method":
case "interface-construct-signature":
case "interface-call-signature":
case "interface-index-signature":
case "interface-get-accessor":
case "interface-set-accessor":
case "enum-member": {
// Temporarily wrap members in their parent declaration for formatting.
const parentKind = kind.split("-")[0];
const raw = `${parentKind} P { ${s} }`;
const formattedParent = await formatWithPrettier(raw);
const formatted = formattedParent
// Remove parent wrapper on first and last lines.
.split("\n")
.slice(1, -1)
// Remove indentation.
.map((line) => line.replace(/^\s{2}/, ""))
.join("\n")
// Remove trailing comma in enum member signature.
.replace(/,$/, "");
return formatted;
}
}
}
async function formatWithPrettier(s) {
try {
const formatted = (await format(s, { parser: "typescript" })).trim();
return formatted;
}
catch {
return s;
}
}