morph-cli 0.1.0

AST-based codebase migration and codemod tool for JavaScript and TypeScript projects.
Documentation
use serde::Serialize;

#[derive(Debug, Clone, Serialize)]
pub struct Preset {
    pub name: &'static str,
    pub description: &'static str,
    pub recipes: &'static [&'static str],
    pub recommended_flags: PresetFlags,
    pub risk_level: RiskLevel,
}

#[derive(Debug, Clone, Serialize)]
pub struct PresetFlags {
    pub review: bool,
    pub allow_risky: bool,
    pub strict: bool,
}

#[derive(Debug, Clone, Copy, Serialize)]
pub enum RiskLevel {
    Low,
    Medium,
    High,
}

pub fn all_presets() -> Vec<Preset> {
    vec![
        Preset {
            name: "modern-node",
            description: "Migrate Node.js projects to modern standards (ESM + clean imports)",
            recipes: &["commonjs-to-esm"],
            recommended_flags: PresetFlags {
                review: true,
                allow_risky: false,
                strict: true,
            },
            risk_level: RiskLevel::Medium,
        },
        Preset {
            name: "typescript-adoption",
            description: "Convert JavaScript projects to TypeScript with basic type safety",
            recipes: &["js-to-ts", "commonjs-to-esm"],
            recommended_flags: PresetFlags {
                review: true,
                allow_risky: true,
                strict: false,
            },
            risk_level: RiskLevel::High,
        },
        Preset {
            name: "react-modernization",
            description: "Upgrade React codebase to modern patterns (Class to Hooks)",
            recipes: &["react-class-to-hooks"],
            recommended_flags: PresetFlags {
                review: true,
                allow_risky: false,
                strict: false,
            },
            risk_level: RiskLevel::Medium,
        },
    ]
}

pub fn find_preset(name: &str) -> Option<Preset> {
    all_presets().into_iter().find(|p| p.name == name)
}