03 / Exemple sur un paquet réel / 7 min de lecture

slugify : pourquoi mon URL contient-elle encore « ! » ?

« Déjà Vu! » devient « deja-vu! », alors que vous vouliez « deja-vu ». Inspectez le paquet JavaScript avec REA, trouvez le réglage de ponctuation et vérifiez le résultat.

Sur cette page
slugify 1.6.6 / MITREA 6.4.0Vérifié le 12 octobre 2026

LA RÉPONSE COURTE

lower: true convertit seulement les majuscules en minuscules. Ajoutez strict: true pour supprimer aussi la ponctuation. C’est une option à activer, pas un bogue de la bibliothèque.

La configuration qui convient
slugify("Déjà Vu!", { lower: true, strict: true })
// → "deja-vu"

01. L’URL souhaitée

Un slug est la partie finale lisible d’une URL, comme deja-vu dans example.com/posts/deja-vu. Cet exemple utilise la véritable version npm slugify 1.6.6. Les résultats ci-dessous proviennent de l’exécution locale de cette version.

Essayez le titre ci-dessous. Activez ensuite Supprimer la ponctuation pour voir la différence.

Essayez le vrai paquet slugify 1.6.6
URL GÉNÉRÉE
example.com/posts/deja-vu!

Encore un « ! » ? Activez Supprimer la ponctuation.

Options JavaScript{ lower: true, strict: false }

S’exécute dans votre navigateur. Rien n’est envoyé. REA intervient dans le tutoriel écrit.

Voici la même comparaison en JavaScript :

Comportement réel du paquet
slugify("Déjà Vu!")
// → "Deja-Vu!"

slugify("Déjà Vu!", { lower: true })
// → "deja-vu!"

L’accent a disparu ; le point d’exclamation est resté. Nous avons utilisé REA pour localiser le fichier principal du paquet, lire le filtre et déterminer quelle option le supprime. Vous pouvez reproduire ces étapes ci-dessous.

02. Téléchargez le paquet et inspectez-le avec REA

Nous avons téléchargé l’archive npm de la version fixée et l’avons extraite sans installer ni exécuter le paquet. Les commandes de préparation suivantes fonctionnent dans un shell disposant de tar:

Terminal
mkdir rea-slugify-case
cd rea-slugify-case
npm pack slugify@1.6.6
tar -xzf slugify-1.6.6.tgz

Nous avons ensuite lancé l’analyseur d’applications JavaScript de REA sur le répertoire extrait package :

Si vous préférez votre agent de programmation, remplacez le chemin et collez cette consigne :

À copier dans votre agent de programmation
Utilise REA pour inspecter /absolute/path/to/rea-slugify-case/package. J’utilise slugify pour créer les URL de mes articles. Pourquoi slugify('Déjà Vu!', { lower: true }) conserve-t-il le point d’exclamation ? Trouve le fichier d’entrée, montre le code qui l’autorise et identifie l’option qui le supprime. Ne modifie pas le paquet.

Ou recueillez directement l’analyse dans votre terminal :

Terminal
npx -y rea-agents@6.4.0 analyze-javascript-application ./package --json > analysis.json

REA a identifié le paquet comme slugify, version 1.6.6, avec pour point d’entrée ./slugify.js. Le rapport a relevé trois fichiers pertinents et aucune erreur d’analyse syntaxique. Il indique aussi que la couverture globale du graphe est partielle, ce que nous avons conservé dans le résumé publié.

Cette distribution JavaScript est lisible. REA a fourni l’inventaire des fichiers et le contexte d’analyse ; l’inspection du code et les vérifications directes qui ont suivi ont établi le comportement. Aucune décompilation native n’a été nécessaire.

03. Trouvez l’option qui supprime la ponctuation

Dans le fichier livré slugify.js, les lignes 33–42 normalisent la chaîne, appliquent les substitutions de langue ou de caractères et filtrent les caractères. Le filtre par défaut autorise explicitement le point d’exclamation.

slugify.js · lignes 41–47
// remove not allowed characters
.replace(options.remove || /[^\w\s$*_+~.()'"!\-:@]+/g, '')
}, '');

if (options.strict) {
  slug = slug.replace(/[^A-Za-z0-9\s]/g, '');
}

La branche strict intervient ensuite et retire tout ce qui n’est ni lettre, ni chiffre, ni espace. Le passage en minuscules est une opération distincte aux lignes 57–58. Nous pouvons donc formuler une prédiction vérifiable :

Prédiction
slugify("Déjà Vu!", { lower: true, strict: true })
// should return "deja-vu"

Le même fichier explique aussi pourquoi les espaces se regroupent en un séparateur, pourquoi & devient and, et pourquoi le paramètre de langue allemand transforme Ä en AE.

04. Exécutez les vérifications sur le vrai paquet

Nous avons exécuté huit assertions sur la version 1.6.6 non modifiée, couvrant la question initiale et quelques comportements voisins.

8 / 8
Vérifications réussies.

Paquet d’origine · Node.js 22.23.1 · macOS arm64

EntréeOptionsRésultat observé
Déjà Vu!Par défautDeja-Vu!
Déjà Vu!lowerdeja-vu!
Déjà Vu!lower + strictdeja-vu
hello world (avec espaces autour)Par défauthello-world
Rock & RollPar défautRock-and-Roll
ÄpfelLangue allemande + loweraepfel
Chaîne videPar défautChaîne vide
42 (un nombre)Par défautLève l’erreur « string argument expected »

Lire les résultats enregistrés, ou utilisez la démonstration interactive ci-dessus. Elle exécute le même paquet, dans sa version fixée, dans votre navigateur.

05. Ce que nous avons testé

Pour cette version et ces entrées, le code et les sorties observées concordent. Si vous voulez deja-vu, utilisez à la fois lower: true et strict: true.

Le périmètre compte. Huit vérifications ne couvrent pas tous les comportements Unicode ou linguistiques. Le graphe REA est partiel ; une relation absente du graphe n’est pas une preuve de son inexistence. Nous n’avons ni reconstruit un binaire natif ni récupéré un code source indisponible.

Puisque le code livré est lisible, son inspection directe est aussi une démarche valable. Ce cas illustre une méthode complète : identifier l’artefact, examiner une règle, puis vérifier l’hypothèse avec l’implémentation d’origine.

06. Téléchargez et exécutez cet exemple

Téléchargez le petit kit de reproduction. Il contient la dépendance dans sa version fixée, les huit assertions et les étapes permettant de recueillir vos propres éléments d’analyse avec REA.

Télécharger le kit de reproduction

Dans le kit extrait
npm install --ignore-scripts
node verify.mjs

Le programme de vérification affiche chaque résultat et se termine en erreur si une assertion échoue. Node.js n’exécute le paquet npm qu’à cette étape ; l’inspection statique précédente avec REA ne l’exécute pas.

Essayez un autre tutorielTrouvez où une application enregistre les fichiers exportés.

Éléments vérifiables : Résumé de l’analyse REA · résultats des vérifications · code inspecté · licence MIT. Paquet de simov et des contributeurs. Analyse et vérifications d’exécution réalisées localement le 12 octobre 2026. Les résumés publics omettent les chemins locaux.

Vous découvrez l’outil ? Qu’est-ce que REA ? · Comment nous vérifions nos guides