Skip to main content

morph_cli/core/presets/
mod.rs

1use serde::Serialize;
2
3#[derive(Debug, Clone, Serialize)]
4pub struct Preset {
5    pub name: &'static str,
6    pub description: &'static str,
7    pub recipes: &'static [&'static str],
8    pub recommended_flags: PresetFlags,
9    pub risk_level: RiskLevel,
10}
11
12#[derive(Debug, Clone, Serialize)]
13pub struct PresetFlags {
14    pub review: bool,
15    pub allow_risky: bool,
16    pub strict: bool,
17}
18
19#[derive(Debug, Clone, Copy, Serialize)]
20pub enum RiskLevel {
21    Low,
22    Medium,
23    High,
24}
25
26pub fn all_presets() -> Vec<Preset> {
27    vec![
28        Preset {
29            name: "modern-node",
30            description: "Migrate Node.js projects to modern standards (ESM + clean imports)",
31            recipes: &["commonjs-to-esm"],
32            recommended_flags: PresetFlags {
33                review: true,
34                allow_risky: false,
35                strict: true,
36            },
37            risk_level: RiskLevel::Medium,
38        },
39        Preset {
40            name: "typescript-adoption",
41            description: "Convert JavaScript projects to TypeScript with basic type safety",
42            recipes: &["js-to-ts", "commonjs-to-esm"],
43            recommended_flags: PresetFlags {
44                review: true,
45                allow_risky: true,
46                strict: false,
47            },
48            risk_level: RiskLevel::High,
49        },
50        Preset {
51            name: "react-modernization",
52            description: "Upgrade React codebase to modern patterns (Class to Hooks)",
53            recipes: &["react-class-to-hooks"],
54            recommended_flags: PresetFlags {
55                review: true,
56                allow_risky: false,
57                strict: false,
58            },
59            risk_level: RiskLevel::Medium,
60        },
61    ]
62}
63
64pub fn find_preset(name: &str) -> Option<Preset> {
65    all_presets().into_iter().find(|p| p.name == name)
66}