UNPKG

fumadocs-typescript

Version:

Typescript Integration for Fumadocs

60 lines (59 loc) 1.95 kB
import { TypeFormatFlags } from "ts-morph"; //#region src/lib/get-simple-form.ts function getSimpleForm(type, checker, location, options = {}) { const { override, shouldSimplify, noUndefined = false } = options; if (type.isUndefined() && noUndefined) return ""; const overridden = override?.({ checker, type, location }); if (overridden) return overridden; if (shouldSimplify && !shouldSimplify({ checker, type, location })) return type.getText(location, TypeFormatFlags.UseAliasDefinedOutsideCurrentScope); const alias = type.getAliasSymbol(); if (alias) { const args = type.getAliasTypeArguments(); if (args.length === 0) return alias.getName(); const nextOptions = { ...options, noUndefined: false }; return `${alias.getName()}<${args.map((arg) => getSimpleForm(arg, checker, location, nextOptions)).join(", ")}>`; } if (type.isUnion()) { if (noUndefined) { const members = type.getUnionTypes().filter((t) => !t.isUndefined()); if (members.length === 0) return "undefined"; if (members.length === 1) return getSimpleForm(members[0], checker, location, options); } return "union"; } if (type.isIntersection()) { const types = []; for (const t of type.getIntersectionTypes()) { const str = getSimpleForm(t, checker, location, options); if (str.length > 0 && str !== "never") types.unshift(str); } return dedupe(types).join(" & "); } if (type.isTuple()) return "tuple"; if (type.isArray() || type.isReadonlyArray()) return "array"; if (type.getCallSignatures().length > 0) return "function"; if (type.isClassOrInterface() || type.isObject()) return "object"; return type.getText(location, TypeFormatFlags.UseAliasDefinedOutsideCurrentScope); } function dedupe(arr) { const dedupe = /* @__PURE__ */ new Set(); const out = []; for (const item of arr) if (!dedupe.has(item)) { out.push(item); dedupe.add(item); } return out; } //#endregion export { getSimpleForm };