# Tutoriel : votre premier programme Node dans Turbo JS À la fin de ce tutoriel, vous aurez écrit, lancé et cassé un petit programme Node sans quitter l'éditeur — et vu l'éditeur vous dire où était l'erreur. Aucune connaissance préalable de Turbo JS n'est nécessaire. Il vous faut Go 1.26 ou plus récent pour compiler l'éditeur, et Node pour exécuter le programme. ## Prérequis Vérifiez Go : ```bash go version ``` Vous devriez voir quelque chose comme : ``` go version go1.26.5 linux/arm64 ``` Vérifiez Node et npm : ```bash node --version && npm --version ``` ``` v24.19.0 11.17.0 ``` Si `node` est introuvable, installez-le d'abord — [un gestionnaire de versions ou un installeur suffit](../how-to/install-node.md). ## Étape 1 — Installer l'éditeur et le serveur de langage ```bash git clone https://rickub.com/turbo-editors/turbo-js.git cd turbo-js make install npm install -g typescript-language-server typescript@6 ``` L'installeur compile, installe, puis vérifie ce qu'il a installé. Après le `npm install`, les dernières lignes d'un second `make install` sont : ``` ==> Checking the language server ✓ typescript-language-server at /usr/local/bin/typescript-language-server ==> Ready ``` Nous avons maintenant une commande `turbo-js`. Le `@6` de la dernière ligne compte : TypeScript 7 ne fournit pas de `tsserver.js`, et le serveur refuse de démarrer à côté de lui. ## Étape 2 — Créer un projet ```bash mkdir /tmp/greeter cd /tmp/greeter npm init -y ``` Vous devriez voir le `package.json` que npm a écrit, qui se termine par : ``` "type": "commonjs" } ``` C'est ce fichier qui fait de ce dossier un projet Node. **Le dossier dans lequel vous démarrez l'éditeur** est celui où les commandes du menu JavaScript s'exécuteront, et le `package.json` le plus proche au-dessus du fichier que vous ouvrez est celui où le serveur de langage est démarré — démarrez-le donc ici. ## Étape 3 — Ouvrir un fichier qui n'existe pas encore ```bash turbo-js main.js ``` L'écran se remplit. En haut : ``` File Edit Search Run Code Options Window Snippets Agent JavaScript Help ``` Onze menus, et le dixième porte le nom du langage. Au milieu, une fenêtre vide intitulée `main.js`. En bas, à droite, vous devriez voir : ``` 1:1 LSP: ready ``` `LSP: ready` signifie que `typescript-language-server` a démarré dans ce dossier. Nous nous en servirons à l'étape 8. ## Étape 4 — Écrire le programme Tapez ceci. Tapez-le exactement ; nous allons regarder les couleurs juste après. ```javascript // A greeting, several times over. const { argv } = require("node:process"); /** Greets one person. */ class Greeter { #name; constructor(name) { this.#name = name; } greet(times = 1) { const pattern = /^[A-Z]/; for (let i = 1; i <= times; i++) { console.log(`Hello, ${this.#name}! (${i})`); } return pattern.test(this.#name); } } const who = argv[2] ?? "JavaScript"; new Greeter(who).greet(3); ``` Deux choses sur la saisie. **L'éditeur reprend l'indentation de la ligne précédente quand vous appuyez sur `Entrée`**, ne tapez donc que la différence : deux espaces de plus après une ligne qui se termine par `{`, et deux fois `Retour arrière` avant une `}` fermante. Et si une liste de complétion s'ouvre pendant que vous tapez — un `.` en demande une de lui-même, et `this.` en est un — continuez à taper ou appuyez sur `Échap` ; `Entrée` accepterait la première entrée. Appuyez sur `F2` pour enregistrer. La barre d'état affiche `Saved main.js`. ## Étape 5 — Lire les couleurs Regardez ce que vous venez de taper. Dans le thème par défaut `turbo-classic` : | Quoi | Couleur | | --- | --- | | `const`, `class`, `for`, `let`, `return`, `new` | blanc vif, gras — mots-clés | | `Greeter`, là où il est déclaré comme là où il est appelé | cyan vif — une classe | | `constructor`, `greet`, `log`, `test` | jaune vif, gras — fonctions et méthodes | | `console`, `require` | cyan vif, gras — les globales que Node fournit | | `argv`, `name`, `times`, `who`, `#name` | jaune vif — noms ordinaires | | `"node:process"`, `` `Hello, ${this.#name}! (${i})` `` | vert — chaînes | | `/^[A-Z]/` | vert — une expression régulière, dessinée avec la couleur des chaînes dans ce thème | | `1`, `3`, `this` | magenta — nombres et constantes | | `// A greeting…`, `/** Greets one person. */` | gris — commentaires | | `=`, `<=`, `++`, `??`, `{`, `}`, `.` | blanc — opérateurs et ponctuation | Trois de ces lignes méritent un second regard. **`Greeter` est cyan et `greet` est jaune**, et personne n'a dit à l'éditeur lequel des deux est une classe. C'est la convention de JavaScript qui tranche : les classes sont les noms que l'on écrit avec une majuscule, une majuscule est donc colorée comme une classe — même dans `new Greeter(who)`, où une parenthèse suit. **`/^[A-Z]/` est une expression régulière, pas deux divisions.** Le scanner lit le `=` qui la précède et sait qu'une barre oblique à cet endroit ouvre un littéral. Remplacez la ligne par `const half = times / 2;` et la barre oblique redevient blanche. **`#name` est un seul nom**, `#` compris, et il est jaune là où un commentaire serait gris — [une règle délibérée](../explanation/colouring-and-completion.md), parce que `#` ouvre un commentaire dans la moitié des autres langages que cet éditeur colore. ## Étape 6 — Donner ses outils au projet Appuyez sur `F10` pour ouvrir la barre de menus, puis sur `→` **neuf fois** pour atteindre **JavaScript** — après Edit, Search, Run, Code, Options, Window, Snippets et Agent. Plus rapide : `Alt-J`. Le menu contient deux entrées, et une seule est disponible : ``` ┌───────────────────┐ │ Create tools file │ │ Open tools file │ ← grisée ; il n'y a pas encore de fichier à ouvrir └───────────────────┘ ``` Choisissez **Create tools file**. Une seconde fenêtre s'ouvre sur le fichier qui vient d'être écrit, `.turbo-js/tools.toml`. Lisez-le si vous voulez — il explique chacune de ses clés — puis fermez-le avec `Ctrl-W`. Regardez la barre de menus : un menu **Tools** est apparu entre JavaScript et Help. La dernière entrée du fichier de départ nomme un menu à elle, et cette seule ligne est tout le mécanisme. Rouvrez le menu JavaScript. Il contient maintenant six commandes, et les deux entrées ont échangé leurs rôles : `Create tools file` est grisée, et c'est `Open tools file` qui est choisissable. ## Étape 7 — Le lancer Appuyez sur `Alt-J` et choisissez **Run**. Une boîte demande une valeur avant de lancer la commande, parce qu'un projet Node n'a pas de point d'entrée unique que l'éditeur pourrait connaître : ``` ┌──────────────── Run ────────────────┐ │ script, e.g. main.js │ │ [ ] │ └─────────────────────────────────────┘ ``` Tapez `main.js` et appuyez sur `Entrée`. Une fenêtre de terminal s'ouvre et le programme s'y exécute : ``` Hello, JavaScript! (1) Hello, JavaScript! (2) Hello, JavaScript! (3) ``` Un terminal plutôt qu'une boîte de dialogue, parce qu'un programme qui lit le clavier doit pouvoir recevoir une réponse. Le programme est terminé, la fenêtre a donc cessé de se comporter comme un terminal et toutes les touches reviennent à l'éditeur : appuyez sur `Ctrl-W` pour la fermer. ## Étape 8 — Le casser, et voir où Allez à la dernière ligne, `new Greeter(who).greet(3);`, et supprimez sa parenthèse fermante, pour qu'elle devienne : ```javascript new Greeter(who).greet(3; ``` Appuyez sur `F2` pour enregistrer. En moins d'une seconde, deux choses se produisent. Un `×` apparaît dans la gouttière, juste à gauche du numéro de cette ligne. Et la barre d'état affiche : ``` ⚠ ')' expected. ``` Personne ne l'a demandé. `typescript-language-server` le publie de lui-même chaque fois que le fichier change — c'est ce que le serveur fait pour un simple fichier `.js` : il trouve les erreurs de syntaxe. Remettez la parenthèse et enregistrez de nouveau ; la marque et le message disparaissent tous les deux. Placez maintenant le curseur sur `greet` dans cette dernière ligne et appuyez sur `F1`. Une boîte intitulée **Symbol** s'ouvre avec la signature de la méthode, qui commence par `(method) Greeter.greet(times?: number)` — le serveur a déduit le type du paramètre de sa valeur par défaut et le type de retour de la ligne `return pattern.test(…)`, dans un langage qui n'a jamais déclaré ni l'un ni l'autre. Appuyez sur `Échap` pour la fermer, puis sur `F12` sur le même mot : le curseur saute à la ligne où `greet` est déclarée. ## Étape 9 — Changer de thème `F10`, puis `→` **cinq fois** pour atteindre **Options** — après Edit, Search, Run et Code. Choisissez **Theme…**. Une liste s'ouvre sur le thème dans lequel vous êtes, `turbo-classic`. Appuyez sur `↑` jusqu'à ce que `cobalt` soit sélectionné — cinq fois — puis `Entrée`. Tout l'écran change, en gardant la même forme. Appuyez sur `Alt-X` pour quitter. L'éditeur pose d'abord la question des fichiers non enregistrés, s'il y en a. ## Et maintenant ? Vous avez écrit un programme Node dans l'éditeur, l'avez lancé, cassé, et vu l'éditeur dire où. Pour aller plus loin : - Pour faire des choses précises → les [guides pratiques](../how-to/) - Pour savoir exactement ce qui est coloré et comment → [langages colorés](../reference/languages.md) - Pour comprendre pourquoi l'éditeur est bâti ainsi → les [explications](../explanation/)