<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alan Schio</title>
    <description>The latest articles on DEV Community by Alan Schio (@schirrel).</description>
    <link>https://dev.to/schirrel</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F393499%2F0f625a7b-f6b9-46e8-a1ad-a7126db044af.png</url>
      <title>DEV Community: Alan Schio</title>
      <link>https://dev.to/schirrel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/schirrel"/>
    <language>en</language>
    <item>
      <title>Deja de Ejecutar Toda Tu Suite de Pruebas en Cada Commit 🚫🧪</title>
      <dc:creator>Alan Schio</dc:creator>
      <pubDate>Tue, 10 Feb 2026 19:20:56 +0000</pubDate>
      <link>https://dev.to/schirrel/deja-de-ejecutar-toda-tu-suite-de-pruebas-en-cada-commit-1bfp</link>
      <guid>https://dev.to/schirrel/deja-de-ejecutar-toda-tu-suite-de-pruebas-en-cada-commit-1bfp</guid>
      <description>&lt;p&gt;Todos hemos pasado por esto. Haces una pequeña corrección en un archivo, haces commit de tus cambios y te quedas viendo cómo toda tu suite de pruebas se ejecuta durante los próximos 5 minutos. ¿Te suena familiar?&lt;/p&gt;

&lt;p&gt;¿Y si te dijera que hay una manera de &lt;strong&gt;ejecutar solo las pruebas que están realmente relacionadas con tus cambios&lt;/strong&gt;? Conoce &lt;a href="https://github.com/test-staged/test-staged" rel="noopener noreferrer"&gt;test-staged&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  El Problema
&lt;/h2&gt;

&lt;p&gt;Ejecutar toda tu suite de pruebas antes de cada commit es:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⏰ &lt;strong&gt;Lento&lt;/strong&gt; - Desperdiciando tiempo precioso de desarrollo&lt;/li&gt;
&lt;li&gt;😤 &lt;strong&gt;Frustrante&lt;/strong&gt; - Rompiendo tu estado de flujo&lt;/li&gt;
&lt;li&gt;🔄 &lt;strong&gt;Redundante&lt;/strong&gt; - Probando código que ni siquiera tocaste&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La mayoría de los desarrolladores:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Se saltan las pruebas completamente (¡peligroso!)&lt;/li&gt;
&lt;li&gt;Esperan largas ejecuciones de pruebas (¡frustrante!)&lt;/li&gt;
&lt;li&gt;Hacen push y rezan para que el CI atrape los problemas (¡arriesgado!)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tiene que haber una mejor manera.&lt;/p&gt;

&lt;h2&gt;
  
  
  La Solución: test-staged
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;test-staged&lt;/code&gt; es como &lt;code&gt;lint-staged&lt;/code&gt;, pero para pruebas. Identifica inteligentemente qué pruebas están relacionadas con tus cambios en stage y ejecuta solo esas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué Tan Inteligente Es?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;test-staged&lt;/code&gt; usa &lt;strong&gt;diferentes estrategias&lt;/strong&gt; dependiendo de tu test runner:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Jest/Vitest&lt;/strong&gt;: Usa análisis nativo de grafo de dependencias (&lt;code&gt;--findRelatedTests&lt;/code&gt; / &lt;code&gt;vitest related&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mocha/Ava&lt;/strong&gt;: Mapea inteligentemente archivos fuente a archivos de prueba (ej: &lt;code&gt;user.ts&lt;/code&gt; → &lt;code&gt;user.test.ts&lt;/code&gt;, &lt;code&gt;src/api/users.ts&lt;/code&gt; → &lt;code&gt;src/api/__tests__/users.test.ts&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Empezando en 30 Segundos
&lt;/h2&gt;

&lt;p&gt;La instalación es muy sencilla:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; test-staged
&lt;span class="c"&gt;# o&lt;/span&gt;
pnpm add &lt;span class="nt"&gt;-D&lt;/span&gt; test-staged
&lt;span class="c"&gt;# o&lt;/span&gt;
yarn add &lt;span class="nt"&gt;-D&lt;/span&gt; test-staged
&lt;span class="c"&gt;# o&lt;/span&gt;
bun add &lt;span class="nt"&gt;-D&lt;/span&gt; test-staged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y eso es todo. &lt;strong&gt;En serio.&lt;/strong&gt; Es cero configuración por defecto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configúralo como un Hook de Pre-Commit
&lt;/h3&gt;

&lt;p&gt;La magia ocurre cuando lo combinas con Husky:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Instala husky&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; husky
npx husky init

&lt;span class="c"&gt;# Agrega test-staged al pre-commit&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"npx test-staged"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .husky/pre-commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora cada commit:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;✅ Solo ejecutará pruebas relacionadas con tus cambios&lt;/li&gt;
&lt;li&gt;⚡ Se completará en segundos en lugar de minutos&lt;/li&gt;
&lt;li&gt;🛡️ Bloqueará commits si las pruebas fallan&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Ejemplos del Mundo Real
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Ejemplo 1: Cambio en un Solo Archivo
&lt;/h3&gt;

&lt;p&gt;Estás trabajando en una funcionalidad de autenticación de usuario:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Modificaste:&lt;/span&gt;
git add src/auth/login.ts

&lt;span class="c"&gt;# test-staged ejecuta SOLO:&lt;/span&gt;
src/auth/__tests__/login.test.ts
src/integration/__tests__/auth-flow.test.ts  &lt;span class="c"&gt;# (porque importa login.ts)&lt;/span&gt;

&lt;span class="c"&gt;# NO ejecuta:&lt;/span&gt;
src/payments/__tests__/&lt;span class="k"&gt;*&lt;/span&gt;.test.ts  ❌
src/dashboard/__tests__/&lt;span class="k"&gt;*&lt;/span&gt;.test.ts  ❌
&lt;span class="o"&gt;(&lt;/span&gt;y más de 200 pruebas no relacionadas&lt;span class="o"&gt;)&lt;/span&gt;  ❌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resultado&lt;/strong&gt;: Las pruebas se completan en 3 segundos en lugar de 2 minutos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ejemplo 2: Refactorizando Utilidades
&lt;/h3&gt;

&lt;p&gt;Refactorizaste una función utilitaria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Modificaste:&lt;/span&gt;
git add src/utils/formatDate.ts

&lt;span class="c"&gt;# test-staged automáticamente encuentra TODAS las pruebas que dependen de ella:&lt;/span&gt;
src/utils/__tests__/formatDate.test.ts
src/components/__tests__/DatePicker.test.ts
src/pages/__tests__/Dashboard.test.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lo suficientemente inteligente&lt;/strong&gt; para capturar dependencias indirectas, &lt;strong&gt;lo suficientemente rápido&lt;/strong&gt; para mantenerte productivo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ejemplo 3: Soporte para Monorepo
&lt;/h3&gt;

&lt;p&gt;¿Trabajando en un monorepo? test-staged te cubre:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Estás en packages/ui&lt;/span&gt;
git add Button.tsx

&lt;span class="c"&gt;# Solo ejecuta:&lt;/span&gt;
packages/ui/__tests__/Button.test.tsx

&lt;span class="c"&gt;# No ejecuta pruebas de:&lt;/span&gt;
packages/api/  ❌
packages/cli/  ❌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Por Qué Te Encantará
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎯 Cero Configuración
&lt;/h3&gt;

&lt;p&gt;Detecta automáticamente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tu gestor de paquetes (npm, pnpm, yarn, bun)&lt;/li&gt;
&lt;li&gt;Tu test runner (Jest, Vitest, Mocha, Ava)&lt;/li&gt;
&lt;li&gt;Tu estructura de proyecto (monorepo o paquete único)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚡ Extremadamente Rápido
&lt;/h3&gt;

&lt;p&gt;En un proyecto típico con 500+ pruebas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes&lt;/strong&gt;: 2-3 minutos por commit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Después&lt;/strong&gt;: 2-5 segundos por commit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eso es una &lt;strong&gt;mejora de 36x&lt;/strong&gt; en uso del mundo real.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Realmente Inteligente
&lt;/h3&gt;

&lt;p&gt;Para Jest y Vitest, usa el grafo de dependencias nativo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Si cambias userService.ts&lt;/span&gt;
&lt;span class="c1"&gt;// encuentra las pruebas que lo importan:&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createUser&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./userService&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;validateUser&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./userService&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para Mocha y Ava, usa coincidencia de patrones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/models/user.ts → src/models/user.test.ts
src/api/users.ts   → src/api/__tests__/users.test.ts
lib/parser.ts      → lib/parser.spec.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🛠️ Personalizable Cuando Sea Necesario
&lt;/h3&gt;

&lt;p&gt;Aunque funciona sin configuración, puedes personalizarlo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;package.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"test-staged"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"runner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"related"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"testExtensions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;".test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".spec"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".e2e"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O crea un &lt;code&gt;.test-stagedrc.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"runner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vitest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"testExtensions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;".test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".spec"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"E2E"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Test Runners Soportados
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Runner&lt;/th&gt;
&lt;th&gt;Método de Detección&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Vitest&lt;/strong&gt; ⭐&lt;/td&gt;
&lt;td&gt;Nativo &lt;code&gt;vitest related&lt;/code&gt; (grafo de dependencias)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Jest&lt;/strong&gt; ⭐&lt;/td&gt;
&lt;td&gt;Nativo &lt;code&gt;--findRelatedTests&lt;/code&gt; (grafo de dependencias)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Mocha&lt;/strong&gt; ✅&lt;/td&gt;
&lt;td&gt;Coincidencia de patrones de archivo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Ava&lt;/strong&gt; ✅&lt;/td&gt;
&lt;td&gt;Coincidencia de patrones de archivo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;¡Más runners próximamente!&lt;/p&gt;

&lt;h2&gt;
  
  
  La Experiencia del Desarrollador
&lt;/h2&gt;

&lt;p&gt;Así es como se ve tu flujo de trabajo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Haz tus cambios&lt;/span&gt;
vim src/components/Button.tsx

&lt;span class="c"&gt;# Ponlos en stage&lt;/span&gt;
git add src/components/Button.tsx

&lt;span class="c"&gt;# Commit (test-staged se ejecuta automáticamente vía hook de pre-commit)&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix: estado hover del botón"&lt;/span&gt;

&lt;span class="c"&gt;# Salida:&lt;/span&gt;
Running tests &lt;span class="k"&gt;for &lt;/span&gt;staged files...
✓ src/components/__tests__/Button.test.tsx &lt;span class="o"&gt;(&lt;/span&gt;2 tests&lt;span class="o"&gt;)&lt;/span&gt; 0.8s

Tests passed! ✨
&lt;span class="o"&gt;[&lt;/span&gt;main abc1234] fix: estado hover del botón
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Sin comandos de prueba manuales. Sin espera. Sin commits rotos.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas Frecuentes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;P: ¿Y si quiero ejecutar todas las pruebas?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
R: Solo omite el hook: &lt;code&gt;git commit --no-verify&lt;/code&gt; o ejecuta tu suite de pruebas manualmente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: ¿Funciona con CI?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
R: ¡Sí! Tu CI aún debe ejecutar la suite de pruebas completa. test-staged es para velocidad en desarrollo local.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: ¿Qué pasa con las pruebas de integración/E2E?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
R: test-staged las encontrará si importan tus archivos modificados. También puedes personalizar qué pruebas ejecutar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: ¿Puedo usarlo sin hooks de Git?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
R: ¡Absolutamente! Solo ejecuta &lt;code&gt;npx test-staged&lt;/code&gt; manualmente cuando quieras.&lt;/p&gt;
&lt;h2&gt;
  
  
  Pruébalo Hoy
&lt;/h2&gt;

&lt;p&gt;Empieza en menos de un minuto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; test-staged husky
npx husky init
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"npx test-staged"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .husky/pre-commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego haz un commit y observa la magia suceder. ✨&lt;/p&gt;

&lt;h2&gt;
  
  
  Enlaces
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;a href="https://www.npmjs.com/package/test-staged" rel="noopener noreferrer"&gt;Paquete NPM&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://test-staged.github.io/test-staged/" rel="noopener noreferrer"&gt;Documentación&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;a href="https://github.com/test-staged/test-staged" rel="noopener noreferrer"&gt;Repositorio GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐛 &lt;a href="https://github.com/test-staged/test-staged/issues" rel="noopener noreferrer"&gt;Reportar Problemas&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  En Resumen
&lt;/h2&gt;

&lt;p&gt;Si todavía estás ejecutando toda tu suite de pruebas en cada commit, estás perdiendo tiempo. test-staged te da:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ &lt;strong&gt;Commits más rápidos&lt;/strong&gt; (segundos en lugar de minutos)&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Mejor enfoque&lt;/strong&gt; (prueba solo lo que cambió)&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;Código más seguro&lt;/strong&gt; (las pruebas realmente se ejecutan en lugar de ser omitidas)&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;Mejor DX&lt;/strong&gt; (cero configuración, simplemente funciona)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;¡Pruébalo y dime qué te parece! Tu yo del futuro te lo agradecerá. 🙌&lt;/p&gt;




&lt;p&gt;&lt;em&gt;¿Has probado test-staged? ¿Cuál es tu estrategia actual de pruebas en pre-commit? ¡Comparte en los comentarios abajo! 👇&lt;/em&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>jest</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Pare de Executar Toda a Sua Suite de Testes em Cada Commit 🚫🧪</title>
      <dc:creator>Alan Schio</dc:creator>
      <pubDate>Tue, 10 Feb 2026 19:18:09 +0000</pubDate>
      <link>https://dev.to/schirrel/pare-de-executar-toda-a-sua-suite-de-testes-em-cada-commit-1b56</link>
      <guid>https://dev.to/schirrel/pare-de-executar-toda-a-sua-suite-de-testes-em-cada-commit-1b56</guid>
      <description>&lt;p&gt;Todos nós já passamos por isso. Você faz uma pequena correção em um arquivo, commita suas mudanças e fica assistindo toda a sua suite de testes rodar pelos próximos 5 minutos. Familiar?&lt;/p&gt;

&lt;p&gt;E se eu te dissesse que existe uma maneira de &lt;strong&gt;executar apenas os testes que estão realmente relacionados às suas mudanças&lt;/strong&gt;? Conheça o &lt;a href="https://github.com/test-staged/test-staged" rel="noopener noreferrer"&gt;test-staged&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Problema
&lt;/h2&gt;

&lt;p&gt;Executar toda a sua suite de testes antes de cada commit é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⏰ &lt;strong&gt;Lento&lt;/strong&gt; - Desperdiçando tempo precioso de desenvolvimento&lt;/li&gt;
&lt;li&gt;😤 &lt;strong&gt;Frustrante&lt;/strong&gt; - Quebrando seu estado de fluxo&lt;/li&gt;
&lt;li&gt;🔄 &lt;strong&gt;Redundante&lt;/strong&gt; - Testando código que você nem tocou&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A maioria dos desenvolvedores:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pula os testes completamente (perigoso!)&lt;/li&gt;
&lt;li&gt;Espera por longas execuções de testes (frustrante!)&lt;/li&gt;
&lt;li&gt;Faz push e torce para o CI pegar os problemas (arriscado!)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tem que haver uma maneira melhor.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Solução: test-staged
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;test-staged&lt;/code&gt; é como o &lt;code&gt;lint-staged&lt;/code&gt;, mas para testes. Ele identifica inteligentemente quais testes estão relacionados às suas mudanças em stage e executa apenas esses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quão Inteligente É?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;test-staged&lt;/code&gt; usa &lt;strong&gt;diferentes estratégias&lt;/strong&gt; dependendo do seu test runner:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Jest/Vitest&lt;/strong&gt;: Usa análise nativa de grafo de dependências (&lt;code&gt;--findRelatedTests&lt;/code&gt; / &lt;code&gt;vitest related&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mocha/Ava&lt;/strong&gt;: Mapeia inteligentemente arquivos fonte para arquivos de teste (ex: &lt;code&gt;user.ts&lt;/code&gt; → &lt;code&gt;user.test.ts&lt;/code&gt;, &lt;code&gt;src/api/users.ts&lt;/code&gt; → &lt;code&gt;src/api/__tests__/users.test.ts&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Começando em 30 Segundos
&lt;/h2&gt;

&lt;p&gt;A instalação é moleza:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; test-staged
&lt;span class="c"&gt;# ou&lt;/span&gt;
pnpm add &lt;span class="nt"&gt;-D&lt;/span&gt; test-staged
&lt;span class="c"&gt;# ou&lt;/span&gt;
yarn add &lt;span class="nt"&gt;-D&lt;/span&gt; test-staged
&lt;span class="c"&gt;# ou&lt;/span&gt;
bun add &lt;span class="nt"&gt;-D&lt;/span&gt; test-staged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E é isso. &lt;strong&gt;Sério.&lt;/strong&gt; É zero configuração por padrão.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure como um Hook de Pre-Commit
&lt;/h3&gt;

&lt;p&gt;A mágica acontece quando você combina com o Husky:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Instale o husky&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; husky
npx husky init

&lt;span class="c"&gt;# Adicione test-staged ao pre-commit&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"npx test-staged"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .husky/pre-commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora cada commit vai:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;✅ Executar apenas testes relacionados às suas mudanças&lt;/li&gt;
&lt;li&gt;⚡ Completar em segundos ao invés de minutos&lt;/li&gt;
&lt;li&gt;🛡️ Bloquear commits se os testes falharem&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Exemplos do Mundo Real
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Exemplo 1: Mudança em um Único Arquivo
&lt;/h3&gt;

&lt;p&gt;Você está trabalhando em uma funcionalidade de autenticação de usuário:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Você modificou:&lt;/span&gt;
git add src/auth/login.ts

&lt;span class="c"&gt;# test-staged executa APENAS:&lt;/span&gt;
src/auth/__tests__/login.test.ts
src/integration/__tests__/auth-flow.test.ts  &lt;span class="c"&gt;# (porque importa login.ts)&lt;/span&gt;

&lt;span class="c"&gt;# NÃO executa:&lt;/span&gt;
src/payments/__tests__/&lt;span class="k"&gt;*&lt;/span&gt;.test.ts  ❌
src/dashboard/__tests__/&lt;span class="k"&gt;*&lt;/span&gt;.test.ts  ❌
&lt;span class="o"&gt;(&lt;/span&gt;e mais de 200 testes não relacionados&lt;span class="o"&gt;)&lt;/span&gt;  ❌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resultado&lt;/strong&gt;: Testes completam em 3 segundos ao invés de 2 minutos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 2: Refatorando Utilitários
&lt;/h3&gt;

&lt;p&gt;Você refatorou uma função utilitária:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Você modificou:&lt;/span&gt;
git add src/utils/formatDate.ts

&lt;span class="c"&gt;# test-staged automaticamente encontra TODOS os testes que dependem dela:&lt;/span&gt;
src/utils/__tests__/formatDate.test.ts
src/components/__tests__/DatePicker.test.ts
src/pages/__tests__/Dashboard.test.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Inteligente o suficiente&lt;/strong&gt; para capturar dependências indiretas, &lt;strong&gt;rápido o suficiente&lt;/strong&gt; para te manter produtivo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 3: Suporte a Monorepo
&lt;/h3&gt;

&lt;p&gt;Trabalhando em um monorepo? test-staged te cobre:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Você está em packages/ui&lt;/span&gt;
git add Button.tsx

&lt;span class="c"&gt;# Executa apenas:&lt;/span&gt;
packages/ui/__tests__/Button.test.tsx

&lt;span class="c"&gt;# Não executa testes de:&lt;/span&gt;
packages/api/  ❌
packages/cli/  ❌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Por Que Você Vai Amar
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎯 Zero Configuração
&lt;/h3&gt;

&lt;p&gt;Detecta automaticamente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seu gerenciador de pacotes (npm, pnpm, yarn, bun)&lt;/li&gt;
&lt;li&gt;Seu test runner (Jest, Vitest, Mocha, Ava)&lt;/li&gt;
&lt;li&gt;Sua estrutura de projeto (monorepo ou pacote único)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚡ Extremamente Rápido
&lt;/h3&gt;

&lt;p&gt;Em um projeto típico com 500+ testes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes&lt;/strong&gt;: 2-3 minutos por commit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Depois&lt;/strong&gt;: 2-5 segundos por commit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso é uma &lt;strong&gt;melhoria de 36x&lt;/strong&gt; no uso do mundo real.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Realmente Inteligente
&lt;/h3&gt;

&lt;p&gt;Para Jest e Vitest, usa o grafo de dependências nativo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Se você mudar userService.ts&lt;/span&gt;
&lt;span class="c1"&gt;// ele encontra testes que o importam:&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createUser&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./userService&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;validateUser&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./userService&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para Mocha e Ava, usa correspondência de padrões:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/models/user.ts → src/models/user.test.ts
src/api/users.ts   → src/api/__tests__/users.test.ts
lib/parser.ts      → lib/parser.spec.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🛠️ Personalizável Quando Necessário
&lt;/h3&gt;

&lt;p&gt;Embora funcione sem configuração, você pode customizá-lo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;package.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"test-staged"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"runner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"related"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"testExtensions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;".test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".spec"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".e2e"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou crie um &lt;code&gt;.test-stagedrc.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"runner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vitest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"testExtensions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;".test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".spec"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"E2E"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Test Runners Suportados
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Runner&lt;/th&gt;
&lt;th&gt;Método de Detecção&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Vitest&lt;/strong&gt; ⭐&lt;/td&gt;
&lt;td&gt;Nativo &lt;code&gt;vitest related&lt;/code&gt; (grafo de dependências)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Jest&lt;/strong&gt; ⭐&lt;/td&gt;
&lt;td&gt;Nativo &lt;code&gt;--findRelatedTests&lt;/code&gt; (grafo de dependências)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Mocha&lt;/strong&gt; ✅&lt;/td&gt;
&lt;td&gt;Correspondência de padrões de arquivo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Ava&lt;/strong&gt; ✅&lt;/td&gt;
&lt;td&gt;Correspondência de padrões de arquivo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Mais runners em breve!&lt;/p&gt;

&lt;h2&gt;
  
  
  A Experiência do Desenvolvedor
&lt;/h2&gt;

&lt;p&gt;Veja como fica seu fluxo de trabalho:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Faça suas mudanças&lt;/span&gt;
vim src/components/Button.tsx

&lt;span class="c"&gt;# Coloque em stage&lt;/span&gt;
git add src/components/Button.tsx

&lt;span class="c"&gt;# Commit (test-staged executa automaticamente via hook de pre-commit)&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix: estado hover do botão"&lt;/span&gt;

&lt;span class="c"&gt;# Saída:&lt;/span&gt;
Running tests &lt;span class="k"&gt;for &lt;/span&gt;staged files...
✓ src/components/__tests__/Button.test.tsx &lt;span class="o"&gt;(&lt;/span&gt;2 tests&lt;span class="o"&gt;)&lt;/span&gt; 0.8s

Tests passed! ✨
&lt;span class="o"&gt;[&lt;/span&gt;main abc1234] fix: estado hover &lt;span class="k"&gt;do &lt;/span&gt;botão
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Sem comandos de teste manuais. Sem espera. Sem commits quebrados.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Perguntas Comuns
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;P: E se eu quiser executar todos os testes?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
R: Apenas pule o hook: &lt;code&gt;git commit --no-verify&lt;/code&gt; ou execute sua suite de testes manualmente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: Funciona com CI?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
R: Sim! Seu CI ainda deve executar a suite de testes completa. test-staged é para velocidade no desenvolvimento local.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: E quanto a testes de integração/E2E?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
R: test-staged vai encontrá-los se eles importarem seus arquivos modificados. Você também pode customizar quais testes executar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: Posso usar sem hooks do Git?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
R: Absolutamente! Apenas execute &lt;code&gt;npx test-staged&lt;/code&gt; manualmente quando quiser.&lt;/p&gt;
&lt;h2&gt;
  
  
  Experimente Hoje
&lt;/h2&gt;

&lt;p&gt;Comece em menos de um minuto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; test-staged husky
npx husky init
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"npx test-staged"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .husky/pre-commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois faça um commit e veja a mágica acontecer. ✨&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;a href="https://www.npmjs.com/package/test-staged" rel="noopener noreferrer"&gt;Pacote NPM&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://test-staged.github.io/test-staged/" rel="noopener noreferrer"&gt;Documentação&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;a href="https://github.com/test-staged/test-staged" rel="noopener noreferrer"&gt;Repositório GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐛 &lt;a href="https://github.com/test-staged/test-staged/issues" rel="noopener noreferrer"&gt;Reportar Problemas&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Resumindo
&lt;/h2&gt;

&lt;p&gt;Se você ainda está executando toda sua suite de testes em cada commit, está desperdiçando tempo. test-staged te dá:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ &lt;strong&gt;Commits mais rápidos&lt;/strong&gt; (segundos ao invés de minutos)&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Melhor foco&lt;/strong&gt; (teste apenas o que mudou)&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;Código mais seguro&lt;/strong&gt; (testes realmente executam ao invés de serem pulados)&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;Melhor DX&lt;/strong&gt; (zero configuração, simplesmente funciona)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Experimente e me diga o que você achou! Seu eu do futuro vai te agradecer. 🙌&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Você já experimentou test-staged? Qual é sua estratégia atual de testes em pre-commit? Compartilhe nos comentários abaixo! 👇&lt;/em&gt;&lt;/p&gt;

</description>
      <category>npm</category>
      <category>testing</category>
      <category>javascript</category>
      <category>jest</category>
    </item>
    <item>
      <title>Stop Running Your Entire Test Suite on Every Commit 🚫🧪</title>
      <dc:creator>Alan Schio</dc:creator>
      <pubDate>Tue, 10 Feb 2026 19:15:59 +0000</pubDate>
      <link>https://dev.to/schirrel/stop-running-your-entire-test-suite-on-every-commit-44hd</link>
      <guid>https://dev.to/schirrel/stop-running-your-entire-test-suite-on-every-commit-44hd</guid>
      <description>&lt;p&gt;We've all been there. You make a small fix in one file, commit your changes, and watch as your entire test suite runs for the next 5 minutes. Sound familiar?&lt;/p&gt;

&lt;p&gt;What if I told you there's a way to &lt;strong&gt;run only the tests that are actually related to your changes&lt;/strong&gt;? Enter &lt;a href="https://github.com/test-staged/test-staged" rel="noopener noreferrer"&gt;test-staged&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Running your complete test suite before every commit is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⏰ &lt;strong&gt;Slow&lt;/strong&gt; - Wasting precious development time&lt;/li&gt;
&lt;li&gt;😤 &lt;strong&gt;Frustrating&lt;/strong&gt; - Breaking your flow state&lt;/li&gt;
&lt;li&gt;🔄 &lt;strong&gt;Redundant&lt;/strong&gt; - Testing code you didn't even touch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most developers either:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Skip tests entirely (dangerous!)&lt;/li&gt;
&lt;li&gt;Wait through long test runs (frustrating!)&lt;/li&gt;
&lt;li&gt;Push and pray the CI catches issues (risky!)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There has to be a better way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: test-staged
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;test-staged&lt;/code&gt; is like &lt;code&gt;lint-staged&lt;/code&gt;, but for tests. It intelligently identifies which tests are related to your staged changes and runs only those.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Smart Is It?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;test-staged&lt;/code&gt; uses &lt;strong&gt;different strategies&lt;/strong&gt; depending on your test runner:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Jest/Vitest&lt;/strong&gt;: Uses native dependency graph analysis (&lt;code&gt;--findRelatedTests&lt;/code&gt; / &lt;code&gt;vitest related&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mocha/Ava&lt;/strong&gt;: Intelligently maps source files to test files (e.g., &lt;code&gt;user.ts&lt;/code&gt; → &lt;code&gt;user.test.ts&lt;/code&gt;, &lt;code&gt;src/api/users.ts&lt;/code&gt; → &lt;code&gt;src/api/__tests__/users.test.ts&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started in 30 Seconds
&lt;/h2&gt;

&lt;p&gt;Installation is a breeze:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; test-staged
&lt;span class="c"&gt;# or&lt;/span&gt;
pnpm add &lt;span class="nt"&gt;-D&lt;/span&gt; test-staged
&lt;span class="c"&gt;# or&lt;/span&gt;
yarn add &lt;span class="nt"&gt;-D&lt;/span&gt; test-staged
&lt;span class="c"&gt;# or&lt;/span&gt;
bun add &lt;span class="nt"&gt;-D&lt;/span&gt; test-staged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's it. &lt;strong&gt;Seriously.&lt;/strong&gt; It's zero-config by default.&lt;/p&gt;

&lt;h3&gt;
  
  
  Set Up as a Pre-Commit Hook
&lt;/h3&gt;

&lt;p&gt;The magic happens when you combine it with Husky:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install husky&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; husky
npx husky init

&lt;span class="c"&gt;# Add test-staged to pre-commit&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"npx test-staged"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .husky/pre-commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now every commit will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;✅ Only run tests related to your changes&lt;/li&gt;
&lt;li&gt;⚡ Complete in seconds instead of minutes&lt;/li&gt;
&lt;li&gt;🛡️ Block commits if tests fail&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Real-World Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Example 1: Single File Change
&lt;/h3&gt;

&lt;p&gt;You're working on a user authentication feature:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# You modified:&lt;/span&gt;
git add src/auth/login.ts

&lt;span class="c"&gt;# test-staged runs ONLY:&lt;/span&gt;
src/auth/__tests__/login.test.ts
src/integration/__tests__/auth-flow.test.ts  &lt;span class="c"&gt;# (because it imports login.ts)&lt;/span&gt;

&lt;span class="c"&gt;# NOT running:&lt;/span&gt;
src/payments/__tests__/&lt;span class="k"&gt;*&lt;/span&gt;.test.ts  ❌
src/dashboard/__tests__/&lt;span class="k"&gt;*&lt;/span&gt;.test.ts  ❌
&lt;span class="o"&gt;(&lt;/span&gt;and 200+ other unrelated tests&lt;span class="o"&gt;)&lt;/span&gt;  ❌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;: Tests complete in 3 seconds instead of 2 minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 2: Refactoring Utilities
&lt;/h3&gt;

&lt;p&gt;You refactored a utility function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# You modified:&lt;/span&gt;
git add src/utils/formatDate.ts

&lt;span class="c"&gt;# test-staged automatically finds ALL tests that depend on it:&lt;/span&gt;
src/utils/__tests__/formatDate.test.ts
src/components/__tests__/DatePicker.test.ts
src/pages/__tests__/Dashboard.test.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Smart enough&lt;/strong&gt; to catch indirect dependencies, &lt;strong&gt;fast enough&lt;/strong&gt; to keep you productive.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 3: Monorepo Support
&lt;/h3&gt;

&lt;p&gt;Working in a monorepo? test-staged has you covered:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# You're in packages/ui&lt;/span&gt;
git add Button.tsx

&lt;span class="c"&gt;# Only runs:&lt;/span&gt;
packages/ui/__tests__/Button.test.tsx

&lt;span class="c"&gt;# Doesn't run tests from:&lt;/span&gt;
packages/api/  ❌
packages/cli/  ❌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why You'll Love It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎯 Zero Configuration
&lt;/h3&gt;

&lt;p&gt;It automatically detects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your package manager (npm, pnpm, yarn, bun)&lt;/li&gt;
&lt;li&gt;Your test runner (Jest, Vitest, Mocha, Ava)&lt;/li&gt;
&lt;li&gt;Your project structure (monorepo or single package)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚡ Lightning Fast
&lt;/h3&gt;

&lt;p&gt;On a typical project with 500+ tests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before&lt;/strong&gt;: 2-3 minutes per commit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After&lt;/strong&gt;: 2-5 seconds per commit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's a &lt;strong&gt;36x speed improvement&lt;/strong&gt; in real-world usage.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Actually Intelligent
&lt;/h3&gt;

&lt;p&gt;For Jest and Vitest, it uses the native dependency graph:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// If you change userService.ts&lt;/span&gt;
&lt;span class="c1"&gt;// it finds tests that import it:&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createUser&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./userService&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;validateUser&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./userService&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Mocha and Ava, it uses pattern matching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/models/user.ts → src/models/user.test.ts
src/api/users.ts   → src/api/__tests__/users.test.ts
lib/parser.ts      → lib/parser.spec.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🛠️ Customizable When Needed
&lt;/h3&gt;

&lt;p&gt;While it works out-of-the-box, you can customize it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;package.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"test-staged"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"runner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"related"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"testExtensions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;".test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".spec"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".e2e"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or create a &lt;code&gt;.test-stagedrc.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"runner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vitest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"testExtensions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;".test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".spec"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"E2E"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Supported Test Runners
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Runner&lt;/th&gt;
&lt;th&gt;Detection Method&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Vitest&lt;/strong&gt; ⭐&lt;/td&gt;
&lt;td&gt;Native &lt;code&gt;vitest related&lt;/code&gt; (dependency graph)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Jest&lt;/strong&gt; ⭐&lt;/td&gt;
&lt;td&gt;Native &lt;code&gt;--findRelatedTests&lt;/code&gt; (dependency graph)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Mocha&lt;/strong&gt; ✅&lt;/td&gt;
&lt;td&gt;File pattern matching&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Ava&lt;/strong&gt; ✅&lt;/td&gt;
&lt;td&gt;File pattern matching&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;More runners coming soon!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Developer Experience
&lt;/h2&gt;

&lt;p&gt;Here's what your workflow looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Make your changes&lt;/span&gt;
vim src/components/Button.tsx

&lt;span class="c"&gt;# Stage them&lt;/span&gt;
git add src/components/Button.tsx

&lt;span class="c"&gt;# Commit (test-staged runs automatically via pre-commit hook)&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix: button hover state"&lt;/span&gt;

&lt;span class="c"&gt;# Output:&lt;/span&gt;
Running tests &lt;span class="k"&gt;for &lt;/span&gt;staged files...
✓ src/components/__tests__/Button.test.tsx &lt;span class="o"&gt;(&lt;/span&gt;2 tests&lt;span class="o"&gt;)&lt;/span&gt; 0.8s

Tests passed! ✨
&lt;span class="o"&gt;[&lt;/span&gt;main abc1234] fix: button hover state
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;No manual test commands. No waiting. No broken commits.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: What if I want to run all tests?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: Just bypass the hook: &lt;code&gt;git commit --no-verify&lt;/code&gt; or run your test suite manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Does it work with CI?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: Yes! Your CI should still run the full test suite. test-staged is for local development speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What about integration/E2E tests?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: test-staged will find them if they import your changed files. You can also customize which tests run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Can I use it without Git hooks?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: Absolutely! Just run &lt;code&gt;npx test-staged&lt;/code&gt; manually whenever you want.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try It Today
&lt;/h2&gt;

&lt;p&gt;Get started in less than a minute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; test-staged husky
npx husky init
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"npx test-staged"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .husky/pre-commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then make a commit and watch the magic happen. ✨&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;a href="https://www.npmjs.com/package/test-staged" rel="noopener noreferrer"&gt;NPM Package&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://test-staged.github.io/test-staged/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;a href="https://github.com/test-staged/test-staged" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐛 &lt;a href="https://github.com/test-staged/test-staged/issues" rel="noopener noreferrer"&gt;Report Issues&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;If you're still running your entire test suite on every commit, you're wasting time. test-staged gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ &lt;strong&gt;Faster commits&lt;/strong&gt; (seconds instead of minutes)&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Better focus&lt;/strong&gt; (test only what changed)&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;Safer code&lt;/strong&gt; (tests actually run instead of being skipped)&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;Better DX&lt;/strong&gt; (zero config, just works)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Give it a try and let me know what you think! Your future self will thank you. 🙌&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you tried test-staged? What's your current pre-commit testing strategy? Share in the comments below! 👇&lt;/em&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>npm</category>
      <category>javascript</category>
      <category>jest</category>
    </item>
    <item>
      <title>Mastering Nuxt hooks - Disable SSG default pages (200, 400) .</title>
      <dc:creator>Alan Schio</dc:creator>
      <pubDate>Thu, 23 Jan 2025 14:23:20 +0000</pubDate>
      <link>https://dev.to/schirrel/mastering-nuxt-hooks-disable-ssg-default-pages-200-400--10n</link>
      <guid>https://dev.to/schirrel/mastering-nuxt-hooks-disable-ssg-default-pages-200-400--10n</guid>
      <description>&lt;p&gt;Nuxt is an awesome framework, build on top of another awesome framework, Vue, with a powerful structure that cover mostly everything you want and need, it allows you to do both, SPA, SSR and SSG.&lt;/p&gt;

&lt;p&gt;Nuxt's Static Site Generation provider a set of default pages to help you, (root) index.html, 200.html and 400.html.&lt;br&gt;
But image the case: you need to get rid of 200 and 400, for any reason like you need to merge nuxt generated pages into a already in production page/application (e.g. PHP legacy code and Nuxt new generated pages).&lt;/p&gt;

&lt;p&gt;But these pages are hardcoded into Nuxt, so how would we avoid to get rid of then?&lt;/p&gt;

&lt;p&gt;We can of course do a &lt;code&gt;rm 200.html&lt;/code&gt; for example after the build, but lets image this scenario:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A legacy application that you are page by page migrating to Nuxt, using SSG facilitates your work because it will generate the same PHP/NGNIX structure: base HTTP directory driven routing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Perform the build and after the &lt;code&gt;rm 200.html&lt;/code&gt; &lt;code&gt;rm 404.html&lt;/code&gt; &lt;code&gt;rm index.html&lt;/code&gt; can be a pain and even may not work as expected: if we have the same pages on the legacy application root.&lt;/p&gt;

&lt;p&gt;At Nuxt discussion page we can see a entry related to it &lt;a href="https://github.com/nuxt/nuxt/discussions/18831" rel="noopener noreferrer"&gt;Disable 200.html and 404.html #18831&lt;/a&gt;, but the solution there do not work.&lt;/p&gt;

&lt;p&gt;You may think _"not a problem i can extend the routes and remove then". Well... that not work cuz they aren't a route on your project, and this happens in a lower layer than routes, on &lt;a href="https://nitro.build/" rel="noopener noreferrer"&gt;nitro&lt;/a&gt;. Nitro is the web server that powers Nuxt, but you probably already know that.&lt;/p&gt;

&lt;p&gt;Till today (Jan/24/2025) Nuxt has not yet got it into its docs: &lt;a href="https://nuxt.com/docs/guide/concepts/rendering#deploying-a-static-client-rendered-app" rel="noopener noreferrer"&gt;https://nuxt.com/docs/guide/concepts/rendering#deploying-a-static-client-rendered-app&lt;/a&gt; and states that these pages are default with no option to undo that:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzshc8e4wprxfsqco7szg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzshc8e4wprxfsqco7szg.png" alt="Nuxt Static Cliente Rendered - Docs" width="799" height="903"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;After dig a little into the Nuxt's code, we can see the are add into the Nitro's hook: &lt;code&gt;'prerender:routes'&lt;/code&gt;, this hook Taking a look into &lt;a href="https://github.com/nitrojs/nitro/blob/005a74f5173ba81d6f49772dfc6e35570a56beb0/src/types/prerender.ts#L8" rel="noopener noreferrer"&gt;nitro pre render hook interface&lt;/a&gt; we can see it has a &lt;code&gt;skip&lt;/code&gt; property, and its &lt;a href="https://github.com/nitrojs/nitro/blob/main/src/core/prerender/prerender.ts#L263" rel="noopener noreferrer"&gt;implementation&lt;/a&gt; is pretty straight forward and what we are lookin for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\\ https://github.com/nitrojs/nitro/blob/main/src/core/prerender/prerender.ts
    // Check if route is skipped or has errors
    if (_route.skip || _route.error) {
      await nitro.hooks.callHook("prerender:route", _route);
      nitro.logger.log(formatPrerenderRoute(_route));
      dataBuff = undefined; // Free memory
      return _route;
    }

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With that knowledge we can safely skit the generation of this files by doing at your nuxt.config.ts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineNuxtConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;ssr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;nitro&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prerender:generate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;routesToSkip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/200.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/404.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; 
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;routesToSkip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;skip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In my case i even need the general root index on it: &lt;code&gt;const routesToSkip = ['/200.html', '/404.html', 'index.html'];&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And now we have a SSG dist generation without the default Nuxt pages:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2749dq9wi1p9ifa74t6y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2749dq9wi1p9ifa74t6y.png" alt="Image description" width="531" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>nuxt</category>
      <category>nitro</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Deploy to Fly.io with bitbucket-pipelines</title>
      <dc:creator>Alan Schio</dc:creator>
      <pubDate>Wed, 28 Aug 2024 00:25:48 +0000</pubDate>
      <link>https://dev.to/schirrel/deploy-to-flyio-with-bitbucket-pipelines-3lkd</link>
      <guid>https://dev.to/schirrel/deploy-to-flyio-with-bitbucket-pipelines-3lkd</guid>
      <description>&lt;p&gt;It is easy to find integrations for Github or GitLab, but i spent a couple of minutes trying to make it work, so why no sharing?&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Fly Token
&lt;/h2&gt;

&lt;p&gt;First go to your Fly.io App and create a Deploy Token (&lt;code&gt;https://fly.io/apps/your-app/tokens&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwxhu4fss14twil7lqp7o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwxhu4fss14twil7lqp7o.png" alt="Fly.io Create Deploy Token dialog" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let the &lt;code&gt;Expiration&lt;/code&gt; if you want it to never expires&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feqsn6dhsw03bzbf1if2b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feqsn6dhsw03bzbf1if2b.png" alt="Token Generated" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Add a Repository Variable
&lt;/h2&gt;

&lt;p&gt;Now go to your bitbucket repository settings, under Pipeline side menu, at Repository Variables (&lt;code&gt;https://bitbucket.org/YOURORG/YOURPROJECT/YOURREPO/pipelines/repository-variables&lt;/code&gt;).&lt;br&gt;
And create a new variable with the name &lt;code&gt;FLY_API_TOKEN&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feub5v6y7mztjf32o70sf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feub5v6y7mztjf32o70sf.png" alt="Bitbucket add variable" width="800" height="294"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Create the pipeline file
&lt;/h2&gt;

&lt;p&gt;Now create your &lt;code&gt;bitbucket-pipelines.yml&lt;/code&gt; file and use the &lt;code&gt;golang&lt;/code&gt; image so you can install the &lt;code&gt;flyctl&lt;/code&gt; and deploy your app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;image: golang:1.15
pipelines:
  default:
    - step:
        name: Deploy to Fly.io
        deployment: production
        script:
          - apt-get update -qq &amp;amp;&amp;amp; apt-get install -y curl
          - curl -L https://fly.io/install.sh | sh
          - export FLYCTL_INSTALL="/root/.fly"
          - export PATH="$FLYCTL_INSTALL/bin:$PATH"
          - flyctl deploy

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>bitbucket</category>
      <category>fly</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Converting snake_case to camelCase with vscode</title>
      <dc:creator>Alan Schio</dc:creator>
      <pubDate>Wed, 17 Jul 2024 19:02:53 +0000</pubDate>
      <link>https://dev.to/schirrel/converting-snakecase-to-camelcase-with-vscode-ja2</link>
      <guid>https://dev.to/schirrel/converting-snakecase-to-camelcase-with-vscode-ja2</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb6449qdyebvbxby2yidi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb6449qdyebvbxby2yidi.png" alt="The screenshot of the finder tool from VSCode" width="800" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open the find/replace and click on the &lt;code&gt;.*&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In the first input use &lt;code&gt;_([a-zA-Z])&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In the second use &lt;code&gt;\U$1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuschw78zz3mm6dy1ua8g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuschw78zz3mm6dy1ua8g.png" alt="The screenshot of the finder tool from VSCode with the inputs filled" width="800" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now just convert everything and be happy converting SQL/JSON to object variables/params or anything else.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7r0jd9v9i0lyc7aqjqd3.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7r0jd9v9i0lyc7aqjqd3.gif" alt="Gif of the replace working on" width="800" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>vscode</category>
      <category>regex</category>
    </item>
    <item>
      <title>Nem tudo precisa de Micro Frontends, as vezes você só precisa de Web Components</title>
      <dc:creator>Alan Schio</dc:creator>
      <pubDate>Mon, 01 Jul 2024 13:01:48 +0000</pubDate>
      <link>https://dev.to/schirrel/nem-tudo-precisa-de-micro-frontends-as-vezes-voce-so-precisa-de-web-components-2e8i</link>
      <guid>https://dev.to/schirrel/nem-tudo-precisa-de-micro-frontends-as-vezes-voce-so-precisa-de-web-components-2e8i</guid>
      <description>&lt;p&gt;Micro Frontends se tornaram uma das Buzzwords mais atrativas do desenvolvimento frontend moderno, e não é por menos, soluções como o Module Federation trouxeram uma possibilidade que foi procurada por aproximadamente 10 anos e fez o "Micro Services" de fato funcionar no frontend.&lt;/p&gt;

&lt;p&gt;Mas Micro Frontends, assim como mono-repos, não é uma bala de prata,  uma solução para toda e qualquer problema. A maior parte dos casos que necessitam de fato de Micro Frontends são por questões organizacionais, escalabilidade ou aplicações que precisam crescer, talvez rapido demais, e que agora precisam ser quebradas para serem "feitas do jeito certo".&lt;br&gt;
Não vou negar, eu gosto muito de Micro Frontends, não é a toa que fiz meu mestrado em cima do tema, o primeiro no Brasil, mostrando seu uso na prática solucionando um problema de mais de 3 anos na mais importante empresa de agronegócio do país. Mas será que você precisa mesmo de Micro Frontends?&lt;/p&gt;

&lt;p&gt;Alguns meses atrás auxiliei um amigo num impasse sobre isso: "Alan precisamos de uma solução de integração e tudo que eu vejo nos direciona para micro frontends", o cenário: &lt;br&gt;
Múltiplas aplicações, em diferentes frameworks, algumas até sem framework, precisam ter um mesmo componente, digamos que algo que gerencia a autenticação do usuário, uma espécie de "SSO". &lt;br&gt;
Você certamente está pensando que isso é o caso mais óbvio e claro de Micro Frontends, e nisso eu te pergunto, como você vai fazer para integrar casos que não utilizam Webpack/Vite, ouu até mesmo um bundler/builder? Fazer o RequireJS, JQuery, Backbone, Ember,  AngularJS (v1),Vue versões 1, 2 e 3, Nuxt, React, e aplicações que utilizem PHP ou JS, e em alguns casos até aplicações Desktop com Electron… ajustar tudo para usar micro frontends? Imagine ter que adaptar build, adicionar bundler, ajustar roteamento de servidor… e mais um mundaréu de coisas para usar Microfrontends…. Viu nem sempre o óbio é tão óbvio.&lt;/p&gt;

&lt;p&gt;Então eu te pergunto: que tecnologia existe que "rode" em todos os navegadores e que seria possível utilizar em todos os casos acima? Claro, JavaScript + HTML, e que maneira você possui de fazer isso de forma otimizada, encapsulada e que possa ser compartilhado independente de bundler, até mesmo utilizando  importações e links diretos? Web Components, eu sei que além disso você está pensando, mas eu vou ter que "copiar" esse componente para dentro de TODAS as aplicações, vai ser o mesmo "inferno" toda vez um trabalho manual, quando atualizar ou mudar a versão… O problema da modernidade é que pensamos que ela resolve problemas que nós mesmo criamos. Antigamente quando "tudo era mato" na internet, toda solução de problema era: HTML + JavaScript e CDN. E acreditem, essa continua sendo uma solução mágica.&lt;/p&gt;

&lt;p&gt;Você precisa de uma solução ou componente que rode em qualquer aplicação web independente de framework ou render? Web Components.&lt;br&gt;
Você precisa compartilhar esse componente em tempo real sem a necessidade de atualizar suas aplicações quando atualizar uma versão? Content Delivery Network - CDN.&lt;/p&gt;

&lt;p&gt;Nada de avançado, novo ou absurdo, apenas utilizando tudo o que já existe na Web, da maneira correta.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>webcomponents</category>
      <category>microfrontend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Refactoring function signature maintaining backward compatibility</title>
      <dc:creator>Alan Schio</dc:creator>
      <pubDate>Wed, 29 May 2024 14:09:56 +0000</pubDate>
      <link>https://dev.to/schirrel/refactoring-function-signature-maintaining-backward-compatibility-mnp</link>
      <guid>https://dev.to/schirrel/refactoring-function-signature-maintaining-backward-compatibility-mnp</guid>
      <description>&lt;p&gt;Have you ever see yourself with a function (or method, depending on programming language) that has too many arguments and would be a lot better to switch to a single &lt;code&gt;options&lt;/code&gt;/&lt;code&gt;params&lt;/code&gt;/&lt;code&gt;item&lt;/code&gt; object? &lt;br&gt;
This can be stressfull or painfull depending on all the regressions or usages of this functions. Even sometimes it can be a blind spot to how much that function is being used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But no fear my friend, Rest Operators are here to save you! 🦸&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fszt5d6eaepnehemi4ri0.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fszt5d6eaepnehemi4ri0.gif" alt="Bruce from Almighty typing on a keyboard" width="320" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagine you have an add to cart function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addItemToCart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;// ommited for god's sake&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Time (and developers) goes by and we need to add more items to it, but it have so many usages that a refactor will be a hell of a work... After some years this function found itself as&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addItemToCart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;hasPromotion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;addedFrom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cartId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;someOtherInfo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You wish you could change to a simple &lt;code&gt;const addItemToCart = (itemData) =&amp;gt;&lt;/code&gt; but that will make a simple task grows to a hell of a regressions and files to update, right?&lt;/p&gt;

&lt;p&gt;Well let's start a painless refactor:&lt;/p&gt;

&lt;p&gt;1 - of course change the functions arguments to be a single one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addItemToCart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;itemData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2 - let convert this argument to use &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters" rel="noopener noreferrer"&gt;Rest Operators&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addItemToCart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;itemData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3 last but not least let's apply conditional validation to use the arguments data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addItemToCart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;itemData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;itemData&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;itemData&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;    
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="nx"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;hasPromotion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;addedFrom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;cartId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;someOtherInfo&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;itemData&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;hasPromotion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;addedFrom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;cartId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;someOtherInfo&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now all old keeps working and you can start write new function call with a prettier code  😉&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>development</category>
      <category>programming</category>
      <category>code</category>
    </item>
    <item>
      <title>Selenium Webdriver - how to bypass server's basic authentication popup</title>
      <dc:creator>Alan Schio</dc:creator>
      <pubDate>Fri, 22 Dec 2023 12:09:28 +0000</pubDate>
      <link>https://dev.to/schirrel/selenium-webdriver-how-to-bypass-servers-basic-authentication-popup-1dkn</link>
      <guid>https://dev.to/schirrel/selenium-webdriver-how-to-bypass-servers-basic-authentication-popup-1dkn</guid>
      <description>&lt;p&gt;Are you entering on E2E/Automated test world with selenium-webdriver and had faced this issue: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You need to access a page which has basic authentication popup, a secure server.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11hmppt4vwyl1yju8e5c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11hmppt4vwyl1yju8e5c.png" alt="Basic auth popup" width="451" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Well research and found how to do this was a little harsh, so this is a quick guide for you to don't suffer like i did.&lt;/p&gt;

&lt;p&gt;The secret is the &lt;code&gt;createCDPConnection&lt;/code&gt;. With selenium-webdriver we need to get to the browser api and perform a register&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;By&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;selenium-webdriver&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Chrome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;selenium-webdriver/chrome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assert&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://my.server.com/`&lt;/span&gt;

&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Server with basic auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="nf"&gt;before&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;forBrowser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;chrome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;beforeEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;// this is what does the trick&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createCDPConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;page&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// now you can go the url safety&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;


  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bypass the popup&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;className&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;heading&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;getText&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Welcome!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="nf"&gt;after&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>selenium</category>
      <category>seleniumwebdriver</category>
      <category>node</category>
      <category>e2e</category>
    </item>
    <item>
      <title>Testing Hooks on Vue 2 (or Options API)</title>
      <dc:creator>Alan Schio</dc:creator>
      <pubDate>Wed, 27 Sep 2023 20:39:00 +0000</pubDate>
      <link>https://dev.to/schirrel/testing-hooks-on-vue-2-or-options-api-493c</link>
      <guid>https://dev.to/schirrel/testing-hooks-on-vue-2-or-options-api-493c</guid>
      <description>&lt;p&gt;Have you ever spent hours thinking how could you test a method called on mount?&lt;br&gt;
First lets say we have this component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;MyCustomComponent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nf"&gt;mounted&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calledOnMount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;calledOnMount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We want to make sure the &lt;code&gt;calledOnMount&lt;/code&gt; will be called, using &lt;a class="mentioned-user" href="https://dev.to/vue"&gt;@vue&lt;/a&gt;/test-utils and vitest/jest there are two main ways to test validate it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;toHaveBeenCalled&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toBeCalled&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the work with a spy function and usually we write tests like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;mount&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@vue/test-utils&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MyCustomComponent&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../MyCustomComponent.vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;MyCustomComponent.vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MyCustomComponent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nf"&gt;spyOn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;calledOnMount&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When calling the &lt;code&gt;mount&lt;/code&gt; it already runs the &lt;code&gt;mounted&lt;/code&gt; lifecicly, so, even adding a spy it will always fail.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;toHaveBeenCalled&lt;/code&gt; -&amp;gt; we can't intercept the mount proccess to add a spy on here&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;toBeCalled&lt;/code&gt; -&amp;gt; the function has already be called&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But calm down, there is a way to test it, for sure!&lt;br&gt;
We had to bind the spy by accessing the &lt;code&gt;.vue&lt;/code&gt; component and its &lt;code&gt;options.methods&lt;/code&gt; such:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MyCustomComponent&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../MyCustomComponent.vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;MyCustomComponentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;calledOnMount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;vi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spyOn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MyCustomComponent&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;MyCustomComponentType&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;calledOnMount&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This way you dont have to intercept the wrapper functions, but the component signature function.&lt;br&gt;
Once the mounted component is like a new "instance" of a "class" component, the spy we add on the .vue, will also works with the mounted component on test.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;MyCustomComponent.vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Should remove scroll event listener on destroy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MyCustomComponent&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;MyCustomComponentType&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;methods&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;calledOnMount&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toHaveBeenCalled&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can easy test your functions and everything you do on mount.&lt;/p&gt;

</description>
      <category>vue</category>
      <category>testing</category>
      <category>vite</category>
    </item>
    <item>
      <title>Vue and Input File - Clear File or Select same file</title>
      <dc:creator>Alan Schio</dc:creator>
      <pubDate>Wed, 21 Jun 2023 20:28:58 +0000</pubDate>
      <link>https://dev.to/schirrel/vue-and-input-file-clear-file-or-select-same-file-24do</link>
      <guid>https://dev.to/schirrel/vue-and-input-file-clear-file-or-select-same-file-24do</guid>
      <description>&lt;p&gt;Have you ever had the case where ou have a file selector component, you clear the file model but then you can't select the same file again?&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fteencvkudzxowih3kwt4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fteencvkudzxowih3kwt4.gif" alt="File selection" width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
Codepen: &lt;a href="https://codepen.io/schirrel/pen/YzRGrvq" rel="noopener noreferrer"&gt;https://codepen.io/schirrel/pen/YzRGrvq&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Well its kinda hard and curious to explain.&lt;br&gt;
First of all to the TL/DR:&lt;br&gt;
You need to use Vue's &lt;code&gt;$refs&lt;/code&gt; and set the input to null.&lt;/p&gt;

&lt;p&gt;Now if you want to understand why, let's pass thru some important stuff:&lt;/p&gt;

&lt;p&gt;First: Vue doesn't work with v-model and file input, even has a discussion about it on the offical Vue's repo: &lt;a href="https://github.com/vuejs/Discussion/issues/24" rel="noopener noreferrer"&gt;Discussion&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now lets undestand why doesnt work, two main things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;input with &lt;code&gt;type="file"&lt;/code&gt; only triggers &lt;code&gt;change&lt;/code&gt; event, while v-model listen to &lt;code&gt;input&lt;/code&gt; event.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;v-model&lt;/code&gt; needs to set the &lt;code&gt;value&lt;/code&gt; html attribute, if you ever try to do &lt;code&gt;:value="myFileModel"&lt;/code&gt; this error will show up:&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Error in nextTick: "InvalidStateError: Failed to set the 'value' property on 'HTMLInputElement': This input element accepts a filename, which may only be programmatically set to the empty string.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So with this comes a question: &lt;em&gt;&lt;strong&gt;how to a clear a file, and most important, how make it possible to select again?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Lets paint a simple use case: You have your own file wrapper the uses a file input (obviously) but you save the file on the &lt;code&gt;data&lt;/code&gt;. Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"inputFile"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      Click here to select you file
      &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"file"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"inputFile"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"inputFile"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;change=&lt;/span&gt;&lt;span class="s"&gt;"selectFile"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;v-if=&lt;/span&gt;&lt;span class="s"&gt;"file"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      File Selected &lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"clearFile"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;remove&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;selectFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nf"&gt;clearFile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even if &lt;code&gt;clearFile&lt;/code&gt; is setting &lt;code&gt;file&lt;/code&gt; as null, when selecting the file again the @change wont be triggered again. Thats why because the html value attribute still the same, the &lt;code&gt;file&lt;/code&gt; prop on data doesn't affect it. Take a look at the &lt;a href="https://codepen.io/schirrel/pen/YzRGrvq" rel="noopener noreferrer"&gt;codepen&lt;/a&gt; example.&lt;/p&gt;

&lt;p&gt;Once we have seen that &lt;code&gt;:value&lt;/code&gt; don't work with files, the proper way to do this is acessing the HTML &lt;code&gt;&amp;lt;input type="file" /&amp;gt;&lt;/code&gt; and reset this value programmatically.&lt;/p&gt;

&lt;p&gt;By adding a &lt;code&gt;ref="fileInput"&lt;/code&gt; to the &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; and inside the &lt;code&gt;clearFile&lt;/code&gt; method add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$refs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fileInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now it works:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4cgtgl203bd58gak1gk9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4cgtgl203bd58gak1gk9.gif" alt="Vue select same file" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The codepen final solution: &lt;a href="https://codepen.io/schirrel/pen/XWyjeOw" rel="noopener noreferrer"&gt;https://codepen.io/schirrel/pen/XWyjeOw&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: this is common behavior across frameworks;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>input</category>
    </item>
    <item>
      <title>Create a Nuxt Bridge App</title>
      <dc:creator>Alan Schio</dc:creator>
      <pubDate>Wed, 21 Jun 2023 19:26:24 +0000</pubDate>
      <link>https://dev.to/schirrel/create-a-nuxt-bridge-app-2b38</link>
      <guid>https://dev.to/schirrel/create-a-nuxt-bridge-app-2b38</guid>
      <description>&lt;p&gt;Even tho the Nuxt docs is pretty good, i hadn't found a single tutorial on creating a nuxt bridge app, so why not create right? Docs is good, but sometimes is need a more straight forward thing!&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1 - Create a Nuxt 2 App
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn create nuxt-app nuxt-bridge-app&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can select the config of your app as you like, mine was:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fimo3rm8pnycfrqq40quv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fimo3rm8pnycfrqq40quv.png" alt="Nuxt CLI Setup" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After install we can run execute yarn dev and see the app running&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5qlmn4mv04y9uz3ump4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5qlmn4mv04y9uz3ump4.png" alt="New app running on localhost" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 - Upgrade to latest Nuxt 2
&lt;/h2&gt;

&lt;p&gt;As stated at the migration docs we need to use the latest Nuxt 2 release, so far today (16/03/2023) the version is 2.16.2.&lt;br&gt;
We replace the version on package.json and once again execute yarn install, now our main dependencies are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"nuxt": "2.16.2",&lt;/li&gt;
&lt;li&gt;"vue": "2.7.10",&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Step 3 - Install Nuxt Bridge
&lt;/h2&gt;

&lt;p&gt;The docs says to install as&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; @nuxt/bridge@npm:@nuxt/bridge-edge

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4 - Update scripts at package.json
&lt;/h2&gt;

&lt;p&gt;Now we are going to use nuxi instead of nuxt to run and build the app.&lt;br&gt;
At your package.json replace the content at the script's prop to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nuxi dev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nuxi build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nuxi preview"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5 - Update Nuxt config
&lt;/h2&gt;

&lt;p&gt;Now update the nuxt.config file to use Nuxt Bridge, import &lt;code&gt;defineNuxtConfig&lt;/code&gt; from '@nuxt/bridge' and wrap it arount the config object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineNuxtConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nuxt/bridge&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineNuxtConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="c1"&gt;// Your existing configuration&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are using typescript you need to add the below line at your tsconfig:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./.nuxt/tsconfig.json"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And disable typescript from bridge at nuxt.config file to avoid conflict between the Ts on bridge and on your configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;bridge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;typescript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can simply run again yarn dev and now you are using Nuxt Bridge on you project&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frhc4c0nr4850atui05ge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frhc4c0nr4850atui05ge.png" alt="Running nuxt app with Bridge" width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The source code is on &lt;a href="https://github.com/schirrel/nuxt-bridge-app" rel="noopener noreferrer"&gt;https://github.com/schirrel/nuxt-bridge-app&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>vue</category>
      <category>nuxt</category>
    </item>
  </channel>
</rss>
