# Proto

För att hantera verktyg och beroenden i våra projekt använder vi proto.\
Proto gör det enkelt att installera och hantera olika verktyg som Node.js, npm, yarn, pnpm och många fler.\
Vi använder den främst för att hantera Node.js och dess pakethanterare, men man kan använda det för att hantera andra verktyg också.

<https://moonrepo.dev/docs/proto>

Valet av proto är baserat på denna genomgång där man jämfört olika alternativ för att hantera verktyg och beroenden i JavaScript-projekt. <https://github.com/TheJaredWilcurt/blog/discussions/40>

Vi har även lagt in de tillägg till protos inställningar som förespråkas, detta för att slå av telemetri och för att automatiskt installera verktyg:\
<https://github.com/TheJaredWilcurt/blog/discussions/41>

## Installation

Finns stöd för Windows, Linux, macOS och WSL, följ instruktionerna nedan.

* Windows

  1. Öppna PowerShell som admin

     Starta Terminal appen som **admin** och öppna en ny PowerShell instans, eller öppna PowerShell direkt.

     > **Använd inte Windows PowerShell 5.1**
     >
     > Se till att du använder PowerShell 7 eller senare, **inte** Windows PowerShell (5.1).\
     > Installera via Företagsportalen eller `winget install --id Microsoft.PowerShell`.

  2. Säkerställ att en PowerShell profil finns

     Kör följande kommando i PowerShell för att kontrollera om profilen finns, annars skapas den:

     ```powershell
     if (Test-Path $profile) { "Profile exists at $profile" } else { New-Item -ItemType Directory -Path (Split-Path -Parent $profile) -Force | Out-Null; New-Item -ItemType File -Path $profile -Force | Out-Null }
     ```

  3. Skapa konfigurationsfil för proto

     Skapa filen `C:\Users\{användarnamn}\.proto\.prototools` och lägg i följande innehåll.

     ```plaintext
     [settings]
     telemetry = false
     auto-install = true
     ```

     Du kan skapa filen manuellt eller köra följande kommando i PowerShell:

     ```powershell
     New-Item -Path "~/.proto" -ItemType Directory -Force | Out-Null; @'
     [settings]
     telemetry = false
     auto-install = true
     '@ | Set-Content -Path "~/.proto/.prototools"
     ```

  4. Installera proto

     Installera proto enligt instruktionerna här: <https://moonrepo.dev/docs/proto/install#windows>

     ```powershell
     irm https://moonrepo.dev/install/proto.ps1 | iex
     ```

     > **Kör setup kommandot**
     >
     > Kör därefter kommandot som visas i terminalen för att slutföra konfigurationen. Ex:
     >
     > ```ps1
     > C:\Users\{användarnamn}\.proto\bin\proto.exe setup
     > ```

  5. Installera Node.js, npm och yarn

     Sätt globalt vilka verktyg du vill använda och installera sedan dessa. Kan behöva starta en ny PowerShell eller ladda om din profil med `& $profile` för att få tillgång till proto kommandot.

     ```powershell
     proto pin node lts --to=global && proto pin npm latest --to=global && proto pin yarn 1 --to=global && proto install --config-mode=global
     ```

  6. Lägg till anpassning av proto anrop i din PowerShell profil

     Vi har en anpassning av proto anropet, denna ser till att när du kör `proto pin` eller `proto unpin` i en katalog med en `package.json` så kommer den att lägga till `--resolve --tool-native` eller `--tool-native` flaggorna automatiskt, vilket gör att proto kommer att använda [devEngines](https://docs.npmjs.com/cli/v11/configuring-npm/package-json#devengines) fältet i `package.json`.

     Vi sätter även miljövariabeln `PROTO_CONFIG_MODE` till `upwards-global` vilket gör att proto kommer att leta efter en `.prototools` fil i projektets katalog och dess föräldrakataloger, om ingen konfigurationsfil hittas används den globala konfigurationen.

     Lägg till följande funktion längst ner i din PowerShell profil:

     ```powershell
     function proto {
       param(
         [Parameter(ValueFromRemainingArguments = $true)]
         [string[]]$Args
       )


       $protoCmd = (Get-Command proto -CommandType Application).Source


       if ($Args.Count -gt 0 -and $Args[0] -eq "pin" -and (Test-Path "package.json")) {
         & $protoCmd @Args --resolve --tool-native
       }
       elseif ($Args.Count -gt 0 -and $Args[0] -eq "unpin" -and (Test-Path "package.json")) {
         & $protoCmd @Args --tool-native
       }
       else {
         & $protoCmd @Args
       }
     }


     $env:PROTO_CONFIG_MODE = "upwards-global"
     ```

     Du kan öppna din PowerShell profil i Notepad med:

     ```powershell
     notepad.exe $profile
     ```

     Alternativt kan du köra följande kommando i PowerShell för att automatiskt lägga till funktionen i din profil:

     ```powershell
     @'
     function proto {
       param(
         [Parameter(ValueFromRemainingArguments = $true)]
         [string[]]$Args
       )


       $protoCmd = (Get-Command proto -CommandType Application).Source


       if ($Args.Count -gt 0 -and $Args[0] -eq "pin" -and (Test-Path "package.json")) {
         & $protoCmd @Args --resolve --tool-native
       }
       elseif ($Args.Count -gt 0 -and $Args[0] -eq "unpin" -and (Test-Path "package.json")) {
         & $protoCmd @Args --tool-native
       }
       else {
         & $protoCmd @Args
       }
     }


     $env:PROTO_CONFIG_MODE = "upwards-global"
     '@ | Add-Content -Path $profile
     ```

     Ladda om profilen för att aktivera funktionen:

     ```powershell
     & $profile
     ```

* Linux, macOS, WSL

  1. Öppna en terminal

     Starta en terminal (Bash, Zsh, etc).

  2. Skapa konfigurationsfil för proto

     ```bash
     mkdir -p ~/.proto
     cat > ~/.proto/.prototools <<'EOF'
     [settings]
     telemetry = false
     auto-install = true
     EOF
     ```

  3. Installera Node.js, npm och yarn

     Starta en ny terminal eller ladda om din bash konfiguration med `source ~/.bashrc` (eller motsvarande för ditt shell) sätt globalt vilka verktyg du vill använda och installera sedan dessa.

     ```bash
     proto pin node lts --to=global && proto pin npm latest --to=global && proto pin yarn 1 --to=global && proto install --config-mode=global
     ```

     Detta funkar möjligtvis inte för mac, använd då istället:

     ```sh
     proto pin node lts --to=global && proto pin npm bundled --to=global && proto pin yarn 1 --to=global && proto install --config-mode=global
     ```

  4. Installera proto

     Installera proto enligt instruktionerna här: <https://moonrepo.dev/docs/proto/install#linux-macos-wsl>

     ```bash
     bash <(curl -fsSL https://moonrepo.dev/install/proto.sh)
     ```

  5. Lägg till anpassning av proto anrop i din shell-profil

     Lägg till följande längst ner i din profil, denna funktion ser till att när du kör `proto pin` eller `proto unpin` i en katalog med en `package.json` så kommer den att lägga till `--resolve --tool-native` eller `--tool-native` flaggorna automatiskt, vilket gör att proto kommer att använda [devEngines](https://docs.npmjs.com/cli/v11/configuring-npm/package-json#devengines).

     Vi sätter även miljövariabeln `PROTO_CONFIG_MODE` till `upwards-global` vilket gör att proto kommer att leta efter en `.prototools` fil i projektets katalog och dess föräldrakataloger, om ingen konfigurationsfil hittas används den globala konfigurationen.

     ```bash
     proto() {
       if [[ "$1" == "pin" ]] && [[ -f "package.json" ]]; then
           command proto "$@" --resolve --tool-native
       elif [[ "$1" == "unpin" ]] && [[ -f "package.json" ]]; then
           command proto "$@" --tool-native
       else
           command proto "$@"
       fi
     }


     export PROTO_CONFIG_MODE="upwards-global";
     ```

     För att automatiskt lägga till detta i din profil, kör följande kommando i terminalen:

     ```bash
     cat <<'EOF' >> ~/.bashrc
     proto() {
       if [[ "$1" == "pin" ]] && [[ -f "package.json" ]]; then
           command proto "$@" --resolve --tool-native
       elif [[ "$1" == "unpin" ]] && [[ -f "package.json" ]]; then
           command proto "$@" --tool-native
       else
           command proto "$@"
       fi
     }


     export PROTO_CONFIG_MODE="upwards-global";
     EOF
     ```

     Ladda om profilen för att aktivera funktionen:

     ```bash
     source ~/.bashrc   # eller source ~/.zshrc
     ```