Deno 2.6, la dernière version du runtime JavaScript et TypeScript moderne, est disponible avec l'outil dx, un contrôle plus granulaire des autorisations et une vérification des types TypeScript plus rapide

Deno 2.6, la dernière version du runtime moderne pour JavaScript et TypeScript, vient d'être publiée. Cette mise à jour introduit un nouvel outil, dx, qui s'aligne sur le workflow npx utilisé dans les projets Node.js, et offre une vérification des types TypeScript plus rapide grâce au moteur expérimental tsgo, écrit en langage Go. Deno 2.6 étend également la compatibilité avec Node.js, renforce la sécurité des projets grâce à un contrôle plus granulaire des autorisations et apporte plusieurs autres améliorations.

Deno est un environnement d'exécution (runtime) pour JavaScript, TypeScript et WebAssembly basé sur le moteur JavaScript V8 et le langage de programmation Rust. Deno a été co-créé par Ryan Dahl, le créateur de Node.js, et Bert Belder. Deno assume explicitement le rôle à la fois d'environnement d'exécution et de gestionnaire de paquets au sein d'un seul exécutable, plutôt que de nécessiter un programme de gestion de paquets séparé.

Deno 2.6 est la dernière mise à jour de ce runtime JavaScript et TypeScript moderne. Le nouvel outil dx, qui constitue l'un des points forts de cette version, permet aux développeurs d'exécuter facilement des binaires à partir de paquets npm et JSR, en s'alignant étroitement sur le workflow npx utilisé dans les projets Node.js. Dans le but d'accélérer le développement, Deno 2.6 intègre désormais tsgo, un vérificateur de types TypeScript expérimental écrit en Go, qui offre une vitesse de vérification des types nettement améliorée par rapport à l'ancien système basé sur TypeScript.

Tout en apportant des changements majeurs au flux de travail, les couches de sécurité et de compatibilité de Deno ont également évolué. Cette version ajoute le drapeau --require pour précharger les modules CommonJS, renforçant ainsi la compatibilité avec les flux de travail Node.js. Le contrôle granulaire des autorisations renforce la sécurité des projets, et la sous-commande deno audit vérifie les dépendances par rapport à la base de données GitHub Common Vulnerabilities and Exposures (CVE), produisant des rapports de sécurité pour les paquets JSR et npm.


Exécuter les binaires de paquets avec dx

Deno 2.6 introduit un nouvel outil, dx, qui est équivalent à npx et constitue un moyen pratique d'exécuter les binaires des paquets npm et JSR.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
$ dx cowsay "Hello, Deno!"
 ______________
< Hello, Deno! >
 --------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Les utilisateurs doivent veiller à installer l'alias dx : deno x --install-aliasLes utilisateurs plus expérimentés remarqueront que dx fonctionne de manière similaire à deno run, mais avec les différences suivantes :

  • dx utilise par défaut les autorisations --allow-all, sauf si un autre indicateur d'autorisation est transmis.
  • dx invite l'utilisateur avant de télécharger un paquet.
  • dx exécute automatiquement les scripts de cycle de vie si l'utilisateur accepte l'invite susmentionnée.
  • dx utilise par défaut npm:<nom_du_paquet> sauf indication contraire.
  • dx génère une erreur si l'utilisateur tente de l'utiliser pour exécuter un fichier local.

Avec l'ajout de dx, les utilisateurs devraient trouver plus facile d'exécuter les binaires des paquets de la manière habituelle. Ils peuvent profiter de la commodité de npx tout en tirant parti du modèle de sécurité robuste et des optimisations de performances de Deno.

Contrôle plus granulaires des autorisations

Cette version offre un contrôle plus granulaire des autorisations. Deno 2.6 introduit les flags --ignore-read et --ignore-env, qui permettent d'ignorer de manière sélective certaines lectures de fichiers ou certains accès à des variables d'environnement. Au lieu de générer une erreur NotCapable, les utilisateurs peuvent demander à Deno de renvoyer respectivement une erreur NotFound et undefined.

Voyons un exemple de fonctionnement :

Code typescript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
const awsSecretKey = Deno.env.get("AWS_SECRET_KEY");
console.log(awsSecretKey);
 
const passwd = await Deno.readTextFile("/etc/passwd");
console.log(passwd);


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
$ deno run --ignore-read=/etc --ignore-env=AWS_SECRET_KEY main.ts
undefined
error: Uncaught (in promise) NotFound: No such file or directory (os error 2)
const passwd = await Deno.readTextFile("/etc/passwd");
                          ^
    at Object.readTextFile (ext:deno_fs/30_fs.js:799:24)
    at file:///dev/main.ts:4:27

Ces nouveaux indicateurs offrent davantage de flexibilité lors de l'exécution de code non fiable. Souvent, le développeur ne souhaite pas ouvrir un sandbox, mais une certaine dépendance insiste pour lire 20 variables d'environnement ou fichiers de configuration à partir de son répertoire personnel. Ces dépendances gèrent correctement les variables d'environnement ou les fichiers manquants, mais elles ne sont pas en mesure de gérer les erreurs NotCapable de Deno. Grâce à ces nouveaux flags, il est possible d'exécuter ce type de code sans accorder toutes les autorisations.

De plus, Deno.env.toObject() fonctionne désormais avec des autorisations d'environnement partielles. Si le développeur n'accorde l'accès qu'à un sous-ensemble de variables d'environnement, Deno.env.toObject() ne renverra que les variables autorisées.

Code typescript : Sélectionner tout - Visualiser dans une fenêtre à part
console.log(Deno.env.toObject());


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
$ SOME_SECRET=foo deno run --allow-env=SOME_SECRET main.ts
{ SOME_SECRET: "foo" }

Cette version comprend également un courtier d'autorisations expérimental. Il s'agit d'une nouvelle fonctionnalité qui permet un contrôle avancé des autorisations grâce à un processus distinct chargé de gérer les demandes d'autorisation.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
$ DENO_PERMISSION_BROKER_PATH=/perm_broker.sock deno run untrusted_code.ts

Cela peut être utile pour les auteurs de plateformes qui souhaitent exécuter du code non fiable, mais qui disposent d'un processus de niveau supérieur pour gérer les demandes d'autorisation.

Lorsque le courtier d'autorisations est actif, tous les indicateurs d'autorisation --allow-*, --deny-* et --ignore-* sont ignorés, et toutes les demandes d'autorisation sont envoyées au processus du courtier à la place.

Vérification des types plus rapide grâce à tsgo et aux améliorations apportées au langage serveur

Deno 2.6 intègre tsgo, un nouveau vérificateur de types expérimental pour TypeScript écrit en Go. Ce nouveau vérificateur de types est nettement plus rapide que la précédente implémentation, qui était écrite en TypeScript.

tsgo peut être activé en utilisant le drapeau --unstable-tsgo ou la variable d'environnement DENO_UNSTABLE_TSGO=1 avec deno check :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
$ deno check --unstable-tsgo main.ts

L'équipe de Deno a constaté une amélioration de 2 fois la vitesse des temps de vérification des types pour les projets internes lors de l'utilisation de TSGO.

Du côté de la vérification des types, plusieurs points faibles de longue date ont été corrigés. Deno est désormais plus tolérant envers les schémas d'importation non standard et les déclarations de modules ambiants nus, ce qui signifie moins d'erreurs de faux positifs lors de l'utilisation d'outils de framework ou de chargeurs de modules personnalisés.

La prise en charge des options courantes de tsconfig.json a également été améliorée :

  • compilerOptions.paths fonctionne désormais comme prévu pour la résolution des modules,
  • skipLibCheck est respecté pour les erreurs de graphe,
  • les paramètres avancés tels que isolatedDeclarations sont pris en charge.

Ces améliorations contribuent à une expérience de vérification plus prévisible, en particulier dans les espaces de travail multi-paquets.

Le langage serveur (LSP) a également bénéficié de quelques améliorations en termes de qualité de vie. L'action source.organizeImports est désormais prise en charge, ce qui permet de trier et de nettoyer automatiquement les importations depuis l'éditeur. Deno utilisera l'implémentation native de l'éditeur lorsqu'elle est disponible et évitera tout travail de résolution inutile, rendant ainsi la fonctionnalité plus intuitive. La création de tests est également améliorée grâce à une meilleure intégration des fonctions de test du style describe et it. Les éditeurs peuvent désormais comprendre et afficher des informations sur les cas de test individuels.

Plusieurs corrections en arrière-plan rendent le langage serveur moins intrusif : les mises à jour de configuration sont détectées immédiatement lorsque tsconfig.json change, les fichiers de verrouillage ne sont pas écrits pendant le « cache on save » et les directives lint-ignore se comportent de manière plus cohérente avec les commentaires en tête. Ces améliorations réduisent les frictions et permettent aux outils de langage de ne pas gêner l'utilisateur pendant que son travail.

Exécuter CommonJS avec --require

Deno v2.4 est livré avec le drapeau --preload qui permet de charger des fichiers avant d'exécuter le module principal, ce qui permet de personnaliser l'environnement d'exécution.

Cette version ajoute le flag --require qui sert le même objectif, mais qui est destiné à l'exécution de modules CommonJS plutôt que de modules ES.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
$ deno run --require ./setup.cjs main.ts

Cela rapproche Deno de la compatibilité Node.js en prenant en charge un modèle commun pour le préchargement des modules.

Audit de sécurité avec deno audit

L'une des nouveautés les plus importantes est la nouvelle sous-commande deno audit, qui aide les développeurs à identifier les failles de sécurité dans leurs dépendances en vérifiant la base de données CVE de GitHub. Cette commande analyse et génère un rapport pour les paquets JSR et npm.

Pour renforcer la sécurité, Deno a également ajouté le drapeau expérimental deno audit --socket qui s'intègre à socket.dev :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ deno install npm:lodahs
Add npm:lodahs@0.0.1-security
 
Dependencies:
+ npm:lodahs 0.0.1-security
 
$ deno audit --socket
 
No known vulnerabilities found
 
Socket.dev firewall report
 
╭ pkg:npm/lodahs@0.0.1-security
│ Supply Chain Risk: 0
│ Maintenance: 76
│ Quality: 41
│ Vulnerabilities: 100
│ License: 100
╰ Alerts (1/0/0): [critical] malware
 
Found 1 alerts across 1 packages
Severity: 0 low, 0 medium, 0 high, 1 critical

La commande deno audit analyse l'ensemble de votre graphe de dépendances, vérifie chaque paquet par rapport à la base de données CVE de GitHub et, si --socket est présent, par rapport à la base de données de vulnérabilités de socket.dev. Cela s'avère particulièrement utile dans les pipelines CI/CD où l'utilisateur souhaite interrompre les builds si des vulnérabilités sont détectées.

Si Deno détecte la variable d'environnement SOCKET_API_KEY, il l'utilisera lors de ses échanges avec socket.dev afin de générer des rapports encore plus détaillés, en appliquant les politiques et les règles d'accès de l'organisation.

Autres améliorations

Outre les changements fondamentaux précédents, Deno 2.6 offre une nouvelle prise en charge des importations en phase source, permettant d'accéder à la source brute des modules d'une manière différente des importations standard. Parallèlement, des améliorations notables apportées au bundler renforcent la fiabilité, tandis que la compatibilité avec Node.js progresse grâce à des améliorations continues des opérations sur les fichiers, des normes cryptographiques, de la gestion des processus et des API de bases de données.

Plusieurs nouvelles API et stabilisations élargissent également les possibilités offertes par la plateforme, et les utilisateurs bénéficient d'améliorations continues des performances et de nombreuses petites améliorations du flux de travail intégrées dans cette version.

Pour passer à Deno 2.6, exécutez la commande suivante dans votre terminal : deno upgrade. Si Deno n'est pas encore installé, exécutez l'une des commandes suivantes pour l'installer :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
# Using Shell (macOS and Linux):
curl -fsSL https://deno.land/install.sh | sh
 
# Using PowerShell (Windows):
iwr https://deno.land/install.ps1 -useb | iex

Source : Deno 2.6

Et vous ?

Quel est votre avis sur le sujet ?
Que pensez-vous des nouveautés proposées par cette version de Deno ? Les trouvez-vous utiles et intéressantes ?
Avez-vous déjà utilisé cet outil pour votre usage ou le développement d'applications, et si oui, qu'en pensez-vous ?

Voir aussi :

La Version 1.9 de Deno, le runtime pour exécuter JavaScript et TypeScript, est disponible, elle améliore les appels de commande dans Rust et apporte de nouvelles fonctionnalités

Pendant que Deno, le runtime de JS et TS, gagne en maturité, certaines entreprises tentent de l'utiliser en production, mais d'autres repartent non satisfaites à la suite des tests effectués

Deno contre Oracle : Deno a déposé une demande d'annulation de la marque JavaScript d'Oracle, Oracle a jusqu'au 4 janvier 2025 pour agir, sinon la marque sera probablement annulée