@scalvert/readme-api-generator
Version:
Generates API documentation in your README
72 lines (71 loc) • 2.14 kB
JavaScript
// src/index.ts
import { join, extname, resolve } from "path";
import { statSync, existsSync, readdirSync, readFileSync, writeFileSync } from "fs";
import { fileURLToPath } from "url";
import jsdoc2md from "jsdoc-to-markdown";
var DEFAULT_MARKER = "DOCS";
var _placeholder;
var _marker = DEFAULT_MARKER;
function setMarker(marker = DEFAULT_MARKER) {
_marker = marker;
_placeholder = new RegExp(`<!--${_marker}_START-->[\\S\\s]*<!--${_marker}_END-->`);
}
function getFiles(filesOrDirectory) {
if (filesOrDirectory.length === 1 && statSync(filesOrDirectory[0]).isDirectory() && existsSync(filesOrDirectory[0])) {
return readdirSync(filesOrDirectory[0]).filter((file) => [".js", ".ts"].includes(extname(file))).map((file) => join(filesOrDirectory[0], file));
} else {
return filesOrDirectory;
}
}
function getReadme(workingDir) {
const readmePath = resolve(workingDir, "README.md");
try {
const readmeContent = readFileSync(readmePath, "utf8");
if (!readmeContent.match(_placeholder)) {
throw new Error(
`The README does not contain a valid placeholder (<!--${_marker}_START--> followed by a <!--${_marker}_END--> HTML comment)`
);
}
return [readmePath, readmeContent];
} catch (error) {
if (isNodeError(error) && error.code === "ENOENT") {
throw new Error(
"No README found. Please run readme-api-generator from a directory that contains a README.md file."
);
}
throw error;
}
}
async function generateMarkdown(files, flags) {
let options = {
files: getFiles(files)
};
if (flags.typescript) {
options = {
...options,
...{
configure: fileURLToPath(new URL("../jsdoc2md.json", import.meta.url))
}
};
}
return await jsdoc2md.render(options);
}
function writeDocs(readmePath, readmeContent, docsContent) {
writeFileSync(
readmePath,
readmeContent.replace(
_placeholder,
`<!--${_marker}_START-->
${docsContent}
<!--${_marker}_END-->`
)
);
}
var isNodeError = (error) => error instanceof Error;
export {
generateMarkdown,
getFiles,
getReadme,
setMarker,
writeDocs
};