typedoc-better-json
Version:
Transforms typedoc's json output to a format that is better for creating custom documentation website
68 lines (53 loc) • 1.76 kB
text/typescript
/* eslint-disable @typescript-eslint/no-explicit-any */
import { TransformedDoc, transform } from "../src/index";
import { expect, test } from "vitest";
import TypeDoc, { JSONOutput } from "typedoc";
import { writeFile, readFile } from "node:fs/promises";
test("validate", async () => {
const app = await TypeDoc.Application.bootstrapWithPlugins({
entryPoints: ["tests/code.ts"],
});
const project = await app.convert();
if (!project) {
throw new Error("Failed to create project");
}
await app.generateJson(project, "tests/typedoc.json");
const outputData = await readFile("tests/typedoc.json", "utf8");
const fileData = JSON.parse(outputData) as JSONOutput.ProjectReflection;
// generate output
const output = transform(fileData);
cleanup(output);
// Write output to file for debugging
const outputFile = JSON.stringify(output, null, 2);
await writeFile("tests/output.json", outputFile);
// compare output to expected output
const expectedOutput = await readFile("tests/expectedOutput.json", "utf8");
const expectedOutputData = JSON.parse(expectedOutput);
cleanup(expectedOutputData);
expect(JSON.stringify(expectedOutputData, null, 2)).toBe(
JSON.stringify(output, null, 2),
);
});
/**
* Remove meta and sources that keeps changing
*/
function cleanup(doc: TransformedDoc) {
const REDCATED = "__REDACTED__";
doc.meta = {
typedocBetterJsonVersion: REDCATED,
};
function removeSource(obj: any) {
if (typeof obj === "object" && obj !== null) {
if ("source" in obj) {
obj.source = REDCATED;
}
for (const k in obj) {
removeSource(obj[k]);
}
}
if (Array.isArray(obj)) {
obj.forEach(removeSource);
}
}
removeSource(doc);
}