fumadocs-typescript
Version:
Typescript Integration for Fumadocs
60 lines (59 loc) • 1.95 kB
JavaScript
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 };