atikin-autodoc
Version:
A dynamic auto-documentation generator for codebases.
95 lines (79 loc) • 2.5 kB
JavaScript
#!/usr/bin/env node
const fs = require("fs");
const path = require("path");
const chalk = require("chalk");
const { execSync } = require("child_process");
const yargs = require("yargs");
const prettier = require("prettier");
const { parse } = require("@babel/parser");
const glob = require("glob");
// CLI Options
const options = yargs
.usage("Usage: $0 [options]")
.option("input", {
alias: "i",
describe: "Input directory containing source code",
demandOption: true,
type: "string",
})
.option("output", {
alias: "o",
describe: "Output directory for generated documentation",
demandOption: true,
type: "string",
})
.option("format", {
alias: "f",
describe: "Documentation format (Markdown, HTML, PDF)",
default: "Markdown",
type: "string",
})
.option("theme", {
alias: "t",
describe: "Theme for documentation (default, dark, light)",
default: "default",
type: "string",
})
.help("h")
.alias("h", "help").argv;
const generateDocumentation = (inputDir, outputDir, format, theme) => {
console.log(chalk.blue(`Generating documentation...`));
// Find all source code files
const files = glob.sync(`${inputDir}/**/*.js`);
if (files.length === 0) {
console.error(chalk.red(`No source files found in ${inputDir}`));
process.exit(1);
}
const docsDir = path.resolve(outputDir);
if (!fs.existsSync(docsDir)) {
fs.mkdirSync(docsDir, { recursive: true });
}
files.forEach((file) => {
try {
const sourceCode = fs.readFileSync(file, "utf-8");
const ast = parse(sourceCode, {
sourceType: "module",
plugins: ["jsx", "typescript"],
});
const formattedCode = prettier.format(sourceCode, { parser: "babel" });
const output = `
# Documentation for ${path.basename(file)}
## Code Snippet
\`\`\`javascript
${formattedCode}
\`\`\`
## AST Tree
\`\`\`json
${JSON.stringify(ast, null, 2)}
\`\`\`
`;
const outputPath = path.join(docsDir, `${path.basename(file, ".js")}.md`);
fs.writeFileSync(outputPath, output);
console.log(chalk.green(`Generated: ${outputPath}`));
} catch (error) {
console.error(chalk.red(`Error processing ${file}: ${error.message}`));
}
});
console.log(chalk.green(`Documentation generated at ${docsDir}`));
};
generateDocumentation(options.input, options.output, options.format, options.theme);