typedoc
Version:
Create api documentation for TypeScript projects.
60 lines (59 loc) • 1.94 kB
JavaScript
import ts from "typescript";
import { isFile, isDir, readFile } from "./fs.js";
import { createRequire } from "module";
export function findTsConfigFile(path) {
let fileToRead = path;
if (isDir(fileToRead)) {
fileToRead = ts.findConfigFile(path, isFile);
}
if (!fileToRead || !isFile(fileToRead)) {
return;
}
return fileToRead;
}
// We don't need recursive read checks because that would cause a diagnostic
// when reading the tsconfig for compiler options, which happens first, and we bail before
// doing this in that case.
export function getTypeDocOptionsFromTsConfig(file) {
const readResult = ts.readConfigFile(file, readFile);
const result = {};
if (readResult.error) {
return result;
}
if ("extends" in readResult.config) {
const resolver = createRequire(file);
const extended = Array.isArray(readResult.config.extends)
? readResult.config.extends.map(String)
: [String(readResult.config.extends)];
for (const extendedFile of extended) {
let resolvedParent;
try {
resolvedParent = resolver.resolve(extendedFile);
}
catch {
continue;
}
Object.assign(result, getTypeDocOptionsFromTsConfig(resolvedParent));
}
}
if ("typedocOptions" in readResult.config) {
Object.assign(result, readResult.config.typedocOptions);
}
return result;
}
const tsConfigCache = {};
export function readTsConfig(path, logger) {
if (tsConfigCache[path]) {
return tsConfigCache[path];
}
const parsed = ts.getParsedCommandLineOfConfigFile(path, {}, {
...ts.sys,
onUnRecoverableConfigFileDiagnostic: logger.diagnostic.bind(logger),
});
if (!parsed) {
return;
}
logger.diagnostics(parsed.errors);
tsConfigCache[path] = parsed;
return parsed;
}