forklaunch 1.15.0

Launch faster with forklaunch
use std::path::Path;

use anyhow::Result;
use serde_json::{json, to_string_pretty};

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

pub(crate) fn generate_vscode_settings(path_dir: &Path) -> Result<Option<RenderedTemplate>> {
    let path = path_dir.join(".vscode").join("settings.json");
    if path.exists() {
        return Ok(None);
    }

    Ok(Some(RenderedTemplate {
        path,
        content: to_string_pretty(&json!({
          "js/ts.experimental.useTsgo": true,
          "editor.codeActionsOnSave": {
            "source.organizeImports": "explicit"
          },
          "editor.formatOnPaste": true,
          "editor.formatOnSave": true,
          "[plaintext]": {
            "editor.formatOnSave": false
          },
          "[markdown]": {
            "editor.formatOnSave": false
          }
        }))?,
        context: None,
    }))
}

pub(crate) fn generate_vscode_tasks(
    path_dir: &Path,
    manifest_data: &ApplicationManifestData,
) -> Result<Option<RenderedTemplate>> {
    let path = path_dir.join(".vscode").join("tasks.json");
    if path.exists() {
        return Ok(None);
    }

    Ok(Some(RenderedTemplate {
        path,
        content: to_string_pretty(&json!({
          "version": "2.0.0",
          "tasks": [
            {
              "label": "Watch Types",
              "type": "shell",
              "command": format!("cd {} && {} run types:watch", manifest_data.modules_path, match manifest_data.runtime.parse()? {
                Runtime::Bun => "bun",
                Runtime::Node => "pnpm",
              }),
              "problemMatcher": "$tsc-watch",
              "group": "build",
              "runOptions": { "runOn": "folderOpen" },
              "presentation": {
                "reveal": "silent",
                "panel": "shared",
                "clear": true,
                "showReuseMessage": false,
                "close": true
              },
              "isBackground": true
            }
          ]
        }))?,
        context: None,
    }))
}