03 / Ejemplo con un paquete real / 7 min de lectura

slugify: ¿por qué sigue «!» en mi URL?

«Déjà Vu!» se convierte en «deja-vu!», pero querías «deja-vu». Usa REA para inspeccionar el paquete JavaScript, encontrar el ajuste que controla la puntuación y comprobar el resultado.

En esta página
slugify 1.6.6 / MITREA 6.4.0Comprobado el 12 de octubre de 2026

LA RESPUESTA BREVE

lower: true solo convierte las mayúsculas en minúsculas. Añade strict: true para eliminar también la puntuación. Es una opción que debes activar, no un error de la biblioteca.

La configuración que funciona
slugify("Déjà Vu!", { lower: true, strict: true })
// → "deja-vu"

01. La URL que queríamos

Un slug es la última parte legible de una URL, como deja-vu en example.com/posts/deja-vu. Este ejemplo utiliza la versión real de slugify 1.6.6 publicada en npm. Los resultados siguientes proceden de ejecutar esa versión localmente.

Prueba el título de abajo. Después activa Eliminar puntuación para ver la diferencia.

Probar el paquete real slugify 1.6.6
URL GENERADA
example.com/posts/deja-vu!

¿Todavía aparece «!»? Activa Eliminar puntuación.

Opciones de JavaScript{ lower: true, strict: false }

Se ejecuta en tu navegador. No se sube nada. REA se utiliza en la guía escrita.

Esta es la misma comparación en JavaScript:

Comportamiento real del paquete
slugify("Déjà Vu!")
// → "Deja-Vu!"

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

Desapareció el acento; quedó el signo de exclamación. Usamos REA para localizar el archivo principal del paquete, leer el código de filtrado y comprobar qué opción lo elimina. Puedes repetir los pasos siguientes.

02. Descargar el paquete e inspeccionarlo con REA

Descargamos el archivo tar de npm de la versión fijada y lo descomprimimos sin instalar ni ejecutar el paquete. Los siguientes comandos de preparación funcionan en una shell con tar:

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

Después ejecutamos el analizador de aplicaciones JavaScript de REA sobre el directorio package extraído:

Si prefieres usar tu agente de programación, sustituye la ruta y pega esta instrucción:

Copiar en tu agente de programación
Usa REA para inspeccionar /absolute/path/to/rea-slugify-case/package. Uso slugify para crear las URL de artículos. ¿Por qué slugify('Déjà Vu!', { lower: true }) conserva el signo de exclamación? Encuentra el archivo de entrada, muestra el código que lo permite e identifica la opción que lo elimina. No modifiques el paquete.

O recoge el análisis directamente en tu terminal:

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

REA identificó el paquete como slugify, versión 1.6.6, con el punto de entrada ./slugify.js. El informe registró tres archivos relevantes y ningún fallo de análisis sintáctico. También marcó la cobertura general del grafo como parcial, dato que conservamos en el resumen publicado.

Esta distribución JavaScript es legible. REA proporcionó el inventario de artefactos y el contexto del análisis; la inspección posterior del código y las comprobaciones directas establecieron el comportamiento. No hubo descompilación nativa.

03. Encontrar la opción que elimina la puntuación

En el archivo distribuido slugify.js, las líneas 33–42 normalizan la cadena, aplican sustituciones según la configuración regional o el mapa de caracteres y filtran caracteres. El filtro predeterminado permite explícitamente el signo de exclamación.

slugify.js · líneas 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 rama strict se ejecuta después y elimina los caracteres que no son letras, números ni espacios en blanco. La conversión a minúsculas es una operación separada en las líneas 57–58. Esto nos da una predicción comprobable:

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

El mismo archivo también explica por qué los espacios se agrupan en un solo separador, por qué & se convierte en and, y por qué la configuración regional alemana transforma Ä en AE.

04. Ejecutar las comprobaciones sobre el paquete real

Ejecutamos ocho aserciones sobre la versión 1.6.6 sin modificar, incluida la pregunta original y algunos comportamientos relacionados.

8 / 8
Comprobaciones superadas.

Paquete original · Node.js 22.23.1 · macOS arm64

EntradaOpcionesResultado observado
Déjà Vu!PredeterminadoDeja-Vu!
Déjà Vu!lowerdeja-vu!
Déjà Vu!lower + strictdeja-vu
hello world (con espacios alrededor)Predeterminadohello-world
Rock & RollPredeterminadoRock-and-Roll
ÄpfelConfiguración regional alemana + loweraepfel
Cadena vacíaPredeterminadoCadena vacía
42 (un número)PredeterminadoLanza «string argument expected»

Consulta los resultados registrados de las comprobaciones, o usa la demostración interactiva del paquete de arriba. La demostración ejecuta el mismo paquete con versión fijada en tu navegador.

05. Qué probamos

Para esta versión y estas entradas, el código y las salidas observadas coinciden. Si quieres deja-vu, usa tanto lower: true como strict: true.

El alcance importa. Ocho comprobaciones no establecen todos los comportamientos de Unicode ni de configuración regional. El grafo de REA es parcial; que falte una relación en él no demuestra su inexistencia. No reconstruimos un binario nativo ni recuperamos código fuente inaccesible.

Como el código distribuido es legible, la inspección habitual del código también es válida. Este caso demuestra el hábito completo: identificar el artefacto, inspeccionar una regla y comprobar después la afirmación frente a la implementación original.

06. Descargar y ejecutar este ejemplo

Descarga el pequeño kit de reproducción. Incluye la dependencia con versión fijada, las ocho aserciones y los pasos para recopilar tus propias pruebas con REA.

Descargar el kit de reproducción

Dentro del kit extraído
npm install --ignore-scripts
node verify.mjs

El ejecutor de aserciones imprime cada resultado y termina con error si una comprobación falla. Node.js ejecuta el paquete npm solo en esta fase de verificación; la inspección estática anterior de REA no lo ejecuta.

Probar otro tutorialDescubrir dónde guarda una aplicación los archivos exportados.

Pruebas: Resumen del análisis de REA · resultados de las comprobaciones · código inspeccionado · licencia MIT. Paquete de simov y colaboradores. Análisis y comprobaciones de ejecución realizados localmente el 12 de octubre de 2026. Los resúmenes públicos omiten las rutas del sistema de archivos local.

¿Acabas de conocer la herramienta? ¿Qué es REA? · Cómo revisamos nuestras guías