# 📌 Deno Installation & VSCode Setup

Deno ist eine moderne Alternative zu Node.js, die **TypeScript nativ unterstützt**, auf **Sicherheit** fokussiert ist und ein **einfaches Modulmanagement** bietet.

## 📖 Inhaltsverzeichnis

- [🚀 Installation von Deno](#🚀-installation-von-deno)
  - [Windows](#windows)
  - [macOS](#macos)
- [🔧 Einrichtung in VSCode](#🔧-einrichtung-in-vscode)
- [🛠️ Wichtige CLI-Befehle](#🛠️-wichtige-cli-befehle)
- [🏗️ Ein neues Deno-Projekt anlegen](#🏗️-ein-neues-deno-projekt-anlegen)
- [📦 Packages in Deno nutzen](#📦-packages-in-deno-nutzen)
- [🗝️ Berechtigung](#🗝️-berechtigung)
- [🐞 Häufige Probleme & Lösungen](#🐞-häufige-probleme--lösungen)
- [🎯 Fazit](#🎯-fazit)

---

## 🚀 Installation von Deno

### Windows

1. **Deno per PowerShell installieren**:

   ```powershell
   irm https://deno.land/install.ps1 | iex
   ```

   Alternativ kannst du Deno über [Chocolatey](https://community.chocolatey.org/packages/deno) installieren:

   ```powershell
   choco install deno
   ```

2. **Den Pfad zu Deno prüfen**:

   ```powershell
   echo $env:PATH
   ```

3. Falls der **Pfad nicht gesetzt** ist, diesen manuell zur Umgebungsvariable `Path` hinzufügen:  
   `C:\Users\<DEIN-BENUTZERNAME>\.deno\bin`

   Wenn VSCode weiterhin nicht deno erkennt, muss dies manuell in den VSCode Settings hinzugefügt werden:
   
   - Öffne die **User Settings (JSON)**
   - über **(`Strg + P` / `Cmd + P` / `F1`)** `>Preferences: Open User Settings (JSON)`
   - Suche nach `terminal.integrated.env.windows`

   <br>

   ```json
     "terminal.integrated.env.windows": {
         "PATH": "C:\\Users\\<DEIN-BENUTZERNAME>\\.deno\\bin;${env:PATH}"
      }
   ```

   Falls der Eintrag noch nicht vorhanden ist, füge ihn einfach hinzu und starte VSCode neu.

---

### macOS

1. **Deno über Homebrew installieren**:

   ```sh
   brew install deno
   ```

   Alternativ kannst du Deno über curl installieren:

   ```sh
   curl -fsSL https://deno.land/install.sh | sh
   ```

2. **Den Pfad zu Deno prüfen**:

   ```sh
   echo $DENO_INSTALL
   ```

   Falls der **Pfad nicht gesetzt** ist, füge ihn zu `.zshrc` oder `.bashrc` hinzu:

   ```sh
   export DENO_INSTALL="$HOME/.deno"
   export PATH="$DENO_INSTALL/bin:$PATH"
   ```

3. Änderungen übernehmen:
   ```sh
   source ~/.zshrc   # oder ~/.bashrc
   ```

<br>

---

<br>
Nach der Installation sollte die ausführbare Datei deno in Ihrem Systempfad verfügbar sein.

Sie können die Installation überprüfen, indem Sie das Programm ausführen:

<br>

```sh
$ deno --version

deno 2.1.9 (stable, release, x86_64-pc-windows-msvc)
v8 13.0.245.12-rusty
typescript 5.6.2
```

<br>

---

## 🔧 Einrichtung in VSCode

1. **VSCode-Erweiterung für Deno installieren**  
   ➜ [Deno VSCode Extension](https://marketplace.visualstudio.com/items?itemName=denoland.vscode-deno)

2. **Deno für das Projekt aktivieren**

   Um Deno in deinem Projekt zu aktivieren und die Deno-APIs sowie Modul-Auflösung zu nutzen, öffne die VS Code-Befehls-Palette und wähle "Deno: Initialize Workspace Configuration".
   ![Deno Command Palette](https://docs.deno.com/runtime/reference/images/command_palette.png)

   Dieser Befehl fügt **'deno.enable': true** zu eurer Workspace-Konfiguration (.vscode/settings.json im Projektordner) hinzu. Alternativ könnt ihr es auch manuell einstellen:

   - Öffne die **Einstellungen (`Strg + ,` / `Cmd + ,`)**
   - Suche nach `"deno.enable"` und aktiviere die Option
   - Alternativ in der `settings.json` hinzufügen:
     ```json
     {
       "deno.enable": true
     }
     ```

3. **Linter und Formatierung aktivieren** (optional):
   ```json
   {
     "deno.lint": true
   }
   ```

---

## 🛠️ Wichtige CLI-Befehle

| Befehl                                    | Beschreibung                                           |
| ----------------------------------------- | ------------------------------------------------------ |
| `deno --version`                          | Zeigt die installierte Deno-Version an                 |
| `deno help`                               | Zeigt eine Liste aller Befehle                         |
| `deno init <my_project>`                  | Erstellt ein neues Deno Projekt                        |
| `deno run <datei.ts>`                     | Führt eine TypeScript-Datei aus                        |
| `deno cache <datei.ts>`                   | Lädt alle Abhängigkeiten in den Cache                  |
| `deno fmt`                                | Formatiert den Code nach Standardregeln                |
| `deno lint`                               | Prüft den Code auf Fehler                              |
| `deno upgrade`                            | Aktualisiert Deno auf die neueste Version              |
| `deno repl`                               | Startet eine interaktive Deno-Shell                    |
| `deno eval "console.log('Hello, Deno!')"` | Führt JavaScript/TypeScript-Code direkt aus            |
| `deno info <datei.ts>`                    | Zeigt Informationen zur TypeScript/JavaScript-Datei an |
|                                           |

---

## 🏗️ Ein neues Deno-Projekt anlegen

1. **Neues Verzeichnis erstellen**:

   ```sh
   mkdir mein-deno-projekt && cd mein-deno-projekt
   ```

2. **Erste Datei erstellen (`main.ts`)**:

   ```ts
   console.log('Hello, Deno!');
   ```

3. **Datei ausführen**:
   ```sh
   deno run main.ts
   ```

---

## 📦 Packages in Deno nutzen

Deno verwendet keine `node_modules`. Stattdessen werden URLs direkt importiert, um Abhängigkeiten zu laden. Du kannst Module entweder direkt von URLs importieren oder einen Paketmanager wie `deno.land/x` verwenden.

### 🛠️ Ein Paket hinzufügen:

```ts
import { something } from 'https://deno.land/x/something/mod.ts';
```

### 📤 Entfernen eines Pakets:

Da es keine `node_modules` gibt, müssen ungenutzte **Imports manuell entfernt** werden.

### 🔄 Update von Abhängigkeiten:

Deno cached Imports automatisch. Falls ein neues Update einer URL verfügbar ist:

```sh
 deno cache --reload main.ts
```

---

## 🗝️ Berechtigung

Deno verwendet ein Berechtigungsmodell für den Zugriff auf Ressourcen. Wenn du ein Skript ausführst, benötigt es möglicherweise bestimmte Berechtigungen, um Aktionen wie den Zugriff auf das Dateisystem oder das Netzwerk auszuführen.

Verwende die --allow-\* Flags, um Berechtigungen zu erteilen.

| Befehl          | Beschreibung                                         |
| --------------- | ---------------------------------------------------- |
| `--allow-read`  | Lesezugriff auf Dateien und Verzeichnisse            |
| `--allow-write` | Schreibzugriff auf Dateien und Verzeichnisse         |
| `--allow-net`   | Netzwerkzugriff                                      |
| `--allow-env`   | Zugriff auf Umgebungsvariablen                       |
| `--allow-run`   | Ausführen anderer Programme                          |
| `--allow-all`   | Gewährt alle Berechtigungen (mit Vorsicht verwenden) |
| `--unstable`    | Aktiviert instabile APIs                             |

<br>

```sh
deno run --allow-read myscript.ts
```

<br>

---


## 🐞 Häufige Probleme & Lösungen

### ❌ `Relative import path "@std/assert" not prefixed with / or ./ or ../`
**Problem:** Nach `deno init` wird die Datei `main_test.ts` generiert, die `@std/assert` importiert, aber nicht findet.

**Lösung:** Das Modul explizit installieren:
```sh
deno add jsr:@std/assert
```
Alternativ den vollständigen Pfad im Import nutzen:
```ts
import { assert } from "https://deno.land/std@0.221.0/assert/mod.ts";
```
Danach den Cache erneuern:
```sh
deno cache --reload main_test.ts
deno test main_test.ts
```

Falls weiterhin Probleme auftreten, überprüfe mit:
```sh
deno info
```
ob das Modul korrekt geladen wurde.

---

## 🎯 Fazit

Deno ist eine einfache und sichere Alternative zu Node.js mit **nativem TypeScript-Support**.

🔗 **Mehr Infos:** [Deno Offizielle Dokumentation](https://deno.land/manual)

---
