use std::path::Path;
use crate::config::migrate::parsers::prettier;
use crate::config::migrate::{ConversionResult, DetectedConfig};
pub(crate) fn convert(
detected: &DetectedConfig,
project_root: &Path,
dry_run: bool,
) -> Result<ConversionResult, String> {
let config = prettier::parse(&detected.path)?;
let prettier_js = generate_prettier_js(&config);
let config_dir = project_root.join(".linthis/configs/javascript");
let config_path = config_dir.join("prettierrc.js");
let mut result = ConversionResult {
created_files: Vec::new(),
changes: Vec::new(),
warnings: Vec::new(),
};
result.changes.push(format!(
"Create {} (migrated from {})",
config_path.display(),
detected.path.display()
));
if !dry_run {
std::fs::create_dir_all(&config_dir)
.map_err(|e| format!("Failed to create directory: {}", e))?;
std::fs::write(&config_path, prettier_js)
.map_err(|e| format!("Failed to write config: {}", e))?;
result.created_files.push(config_path);
}
Ok(result)
}
fn generate_prettier_js(config: &prettier::PrettierConfig) -> String {
[
"// Migrated from existing Prettier config by linthis",
"// Review and adjust as needed",
"",
"module.exports = ",
&config.to_js_object(),
";",
]
.join("\n")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_generate_prettier_js() {
let config = prettier::PrettierConfig {
tab_width: Some(4),
semi: Some(true),
single_quote: Some(true),
..Default::default()
};
let js = generate_prettier_js(&config);
assert!(js.contains("tabWidth: 4"));
assert!(js.contains("semi: true"));
assert!(js.contains("singleQuote: true"));
}
}