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)
}