UNPKG

userpravah

Version:

UserPravah is an extensible, framework-agnostic tool for analyzing user flows and navigation patterns in web applications. It supports multiple frameworks (Angular, React) and output formats (DOT/Graphviz, JSON) with a plugin-based architecture for easy e

182 lines (175 loc) • 7.21 kB
#!/usr/bin/env node import { FlowAnalyzer } from "./core/flow-analyzer.js"; import { AngularAnalyzer } from "./frameworks/angular/angular-analyzer.js"; import { ReactAnalyzer } from "./frameworks/react/react-analyzer.js"; import { DotGenerator } from "./outputs/dot/dot-generator.js"; import { JsonGenerator } from "./outputs/json/json-generator.js"; async function main() { console.log("šŸš€ UserPravah - Universal User Flow Analyzer"); // Check for help flag first if (process.argv.includes("--help") || process.argv.includes("-h")) { showHelp(); process.exit(0); } // CLI argument parsing if (process.argv.length < 3) { console.error("āŒ Error: Please provide the path to your project"); console.log("Usage: user-pravah <project-path> [options]"); console.log(""); console.log("Options:"); console.log(" --framework <name> Specify framework (auto-detect if not provided)"); console.log(" --output <formats> Output formats (comma-separated, default: dot)"); console.log(" --output-dir <path> Output directory (default: current directory)"); console.log(" --theme <theme> Theme for DOT output (default, dark, colorful)"); console.log(" --layout <layout> Layout for DOT output (LR, TB, BT, RL)"); console.log(" --no-image Skip image generation for DOT output"); console.log(""); console.log("Examples:"); console.log(" user-pravah ./my-angular-app"); console.log(" user-pravah ./my-app --framework angular --output dot,json"); console.log(" user-pravah ./my-app --theme dark --layout TB"); process.exit(1); } const projectPath = process.argv[2]; // Parse CLI arguments const args = process.argv.slice(3); const options = { projectPath, framework: "auto", outputFormats: ["dot"], }; const outputOptions = { outputDirectory: process.cwd(), generateImage: true, theme: "light", layout: "LR", }; // Parse arguments for (let i = 0; i < args.length; i++) { const arg = args[i]; const nextArg = args[i + 1]; switch (arg) { case "--framework": if (nextArg) { options.framework = nextArg; i++; } break; case "--output": if (nextArg) { options.outputFormats = nextArg.split(",").map((f) => f.trim()); i++; } break; case "--output-dir": if (nextArg) { outputOptions.outputDirectory = nextArg; i++; } break; case "--theme": if (nextArg) { outputOptions.theme = nextArg; i++; } break; case "--layout": if (nextArg) { outputOptions.layout = nextArg; outputOptions.rankdir = nextArg; // For DOT compatibility i++; } break; case "--no-image": outputOptions.generateImage = false; break; } } try { // Initialize the flow analyzer const analyzer = new FlowAnalyzer(); // Register framework analyzers analyzer.registerFrameworkAnalyzer(new AngularAnalyzer()); analyzer.registerFrameworkAnalyzer(new ReactAnalyzer()); // Future: analyzer.registerFrameworkAnalyzer(new VueAnalyzer()); // Register output generators analyzer.registerOutputGenerator(new DotGenerator()); analyzer.registerOutputGenerator(new JsonGenerator()); // Future: analyzer.registerOutputGenerator(new MermaidGenerator()); // Future: analyzer.registerOutputGenerator(new HtmlGenerator()); console.log(`šŸ” Project path: ${options.projectPath}`); console.log(`šŸŽÆ Framework: ${options.framework === "auto" ? "auto-detect" : options.framework}`); console.log(`šŸ“„ Output formats: ${options.outputFormats.join(", ")}`); console.log(`šŸ“ Output directory: ${outputOptions.outputDirectory}`); // Available frameworks and formats console.log(`\nšŸ“‹ Available frameworks: ${analyzer .getAvailableFrameworks() .join(", ")}`); console.log(`šŸ“‹ Available output formats: ${analyzer .getAvailableOutputFormats() .join(", ")}`); // Perform analysis and generate outputs const result = await analyzer.analyzeAndGenerate(options, outputOptions); console.log("\n✨ Analysis Summary:"); console.log(` šŸ“ Routes found: ${result.analysis.routes.length}`); console.log(` šŸ”„ Navigation flows: ${result.analysis.flows.length}`); console.log(` šŸ“‚ Menu definitions: ${result.analysis.menus.length}`); console.log("\nšŸŽØ Generated Outputs:"); result.outputs.forEach((output) => { console.log(` šŸ“„ ${output.format.toUpperCase()}: ${output.filePath}`); if (output.additionalFiles) { output.additionalFiles.forEach((file) => { console.log(` šŸ–¼ļø Image: ${file}`); }); } }); console.log("\nšŸŽ‰ Analysis complete!"); } catch (error) { console.error("āŒ Fatal Error during analysis:", error); process.exit(1); } } // Handle unhandled promise rejections process.on("unhandledRejection", (reason, promise) => { console.error("Unhandled Rejection at:", promise, "reason:", reason); process.exit(1); }); // Handle uncaught exceptions process.on("uncaughtException", (error) => { console.error("Uncaught Exception:", error); process.exit(1); }); // Run the main function main().catch((error) => { console.error("āŒ Startup Error:", error); process.exit(1); }); function showHelp() { console.log(` šŸš€ UserPravah - Universal User Flow Analyzer USAGE: userpravah <project-path> [options] ARGUMENTS: <project-path> Path to the project to analyze OPTIONS: --framework <name> Force specific framework (angular, react) --output <formats> Output formats (dot, json) - comma separated --output-dir <path> Output directory (default: current directory) --theme <theme> Theme for DOT output (light, dark) --layout <direction> Graph layout direction (LR, TB, BT, RL) --no-image Skip PNG image generation --help Show this help message EXAMPLES: userpravah ./my-angular-app userpravah ./my-react-app --framework react --output dot,json userpravah ./project --theme dark --layout TB userpravah ./project --output-dir ./output --no-image SUPPORTED FRAMEWORKS: - Angular (routing modules, standalone components) - React (React Router, Next.js App Router) OUTPUT FORMATS: - DOT: Graphviz format with PNG image generation - JSON: Structured data format `); }