fumadocs-openapi
Version:
Generate MDX docs for your OpenAPI spec
47 lines (46 loc) • 2.03 kB
JavaScript
//#region src/utils/schema-to-string.ts
let FormatFlags = /* @__PURE__ */ function(FormatFlags$1) {
FormatFlags$1[FormatFlags$1["None"] = 0] = "None";
FormatFlags$1[FormatFlags$1["UseAlias"] = 1] = "UseAlias";
return FormatFlags$1;
}({});
function schemaToString(value, ctx, flags = FormatFlags.None) {
function union(union$1, sep, flags$1) {
const members = /* @__PURE__ */ new Set();
let nullable = false;
for (const item of union$1) {
const result$1 = run(item, flags$1 | FormatFlags.UseAlias);
if (result$1 === "null") nullable = true;
else if (result$1 !== "unknown") members.add(result$1);
}
const result = Array.from(members).join(sep);
return nullable ? `${result} | null` : result;
}
function run(schema, flags$1) {
if (schema === true) return "any";
else if (schema === false) return "never";
if ((flags$1 & FormatFlags.UseAlias) === FormatFlags.UseAlias) {
if (schema.title) return schema.title;
const ref = ctx?.getRawRef(schema)?.split("/");
if (ref && ref.length > 0) return ref[ref.length - 1];
}
if (Array.isArray(schema.type)) return union(schema.type.map((type) => ({
...schema,
type
})), " | ", flags$1);
if (schema.type === "array") return `array<${schema.items ? run(schema.items, flags$1 | FormatFlags.UseAlias) : "unknown"}>`;
const or = schema.oneOf ?? schema.anyOf;
if (schema.oneOf && schema.anyOf) return `(${union(schema.oneOf, " | ", flags$1)}) & (${union(schema.anyOf, " | ", flags$1)})`;
else if (or) return union(or, " | ", flags$1);
if (schema.allOf) return union(schema.allOf, " & ", flags$1);
if (schema.not) return `not ${run(schema.not, flags$1)}`;
if (schema.type === "string" && schema.format === "binary") return "file";
if (schema.type && Array.isArray(schema.type)) return schema.type.filter((v) => v !== "null").join(" | ");
if (schema.type) return schema.type;
return "unknown";
}
return run(value, flags);
}
//#endregion
export { FormatFlags, schemaToString };
//# sourceMappingURL=schema-to-string.js.map