UNPKG

atikin-autodoc

Version:

A dynamic auto-documentation generator for codebases.

95 lines (79 loc) 2.5 kB
#!/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);