forklaunch 1.15.0

Launch faster with forklaunch
use std::{fs::read_to_string, path::Path};

use anyhow::Result;

use crate::core::{
    manifest::application::ApplicationManifestData,
    rendered_template::{RenderedTemplate, TEMPLATES_DIR},
};

pub(crate) fn create_or_merge_husky_pre_commit(
    path: &Path,
    manifest_data: &ApplicationManifestData,
) -> Result<Vec<RenderedTemplate>> {
    let mut rendered_templates = Vec::new();

    let husky_pre_commit_path = path.join(".husky").join("pre-commit");

    let content_to_append = format!(
        "cd {}\n{} sort-package-json */package.json\n{} lint-staged --relative\n",
        manifest_data.modules_path,
        if manifest_data.runtime == "bun" {
            "bun"
        } else {
            "pnpm"
        },
        if manifest_data.runtime == "bun" {
            "bun"
        } else {
            "pnpm"
        }
    );

    let content = format!(
        "{}",
        if husky_pre_commit_path.exists() {
            let existing_content = read_to_string(&husky_pre_commit_path)?;
            if !existing_content.contains(content_to_append.as_str()) {
                if existing_content.ends_with("\n") {
                    existing_content + content_to_append.as_str()
                } else {
                    existing_content + "\n" + content_to_append.as_str()
                }
            } else {
                existing_content
            }
        } else {
            content_to_append
        }
    );

    let husky_dir = TEMPLATES_DIR.get_dir("husky/_").unwrap();

    for file in husky_dir.files() {
        rendered_templates.push(RenderedTemplate {
            path: path.join(".husky").join("_").join(
                file.path()
                    .file_name()
                    .unwrap()
                    .to_string_lossy()
                    .to_string(),
            ),
            content: file.contents_utf8().unwrap().to_string(),
            context: None,
        });
    }

    rendered_templates.push(RenderedTemplate {
        path: path.join(".husky").join("_").join(".gitignore"),
        content: "*".to_string(),
        context: None,
    });

    rendered_templates.push(RenderedTemplate {
        path: husky_pre_commit_path,
        content,
        context: None,
    });

    Ok(rendered_templates)
}