<?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>Forem: Mario Blas 🇮🇨</title>
    <description>The latest articles on Forem by Mario Blas 🇮🇨 (@marioblas).</description>
    <link>https://forem.com/marioblas</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%2F160753%2F5562a40e-4b64-4307-9a71-a5771edeb955.png</url>
      <title>Forem: Mario Blas 🇮🇨</title>
      <link>https://forem.com/marioblas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/marioblas"/>
    <language>en</language>
    <item>
      <title>Integrando Prettier con ESLint</title>
      <dc:creator>Mario Blas 🇮🇨</dc:creator>
      <pubDate>Thu, 27 Feb 2020 18:24:02 +0000</pubDate>
      <link>https://forem.com/capua/integrando-prettier-con-eslint-41ml</link>
      <guid>https://forem.com/capua/integrando-prettier-con-eslint-41ml</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Este post fue publicado originalmente en mayo de 2019.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;En el siguiente artículo vamos a conocer &lt;a href="https://prettier.io/" rel="noopener noreferrer"&gt;Prettier&lt;/a&gt; y cómo podemos integrarlo con &lt;a href="https://eslint.org/" rel="noopener noreferrer"&gt;ESLint&lt;/a&gt; para mejorar nuestro flujo de trabajo.&lt;/p&gt;

&lt;p&gt;Configurar estas herramientas será una inversión que haremos una vez y sus beneficios los notaremos durante todo el proyecto.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es ESLint?
&lt;/h2&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%2Fi%2Fvvkde4oarpvkciqmxnws.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%2Fi%2Fvvkde4oarpvkciqmxnws.png" alt="Alt Text" width="128" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si aun no lo conocéis, ESLint es un linter para JavaScript y JSX. Ayuda a identificar e informar sobre patrones que se encuentran en el código con el objetivo de evitar errores.&lt;/p&gt;

&lt;p&gt;Principalmente, hay que tener en cuenta que las reglas de los linters se dividen en dos categorías:&lt;/p&gt;

&lt;h3&gt;
  
  
  Reglas de formato
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Por ejemplo: longitud de línea máxima, tipo de indentación, tamaño de la indentación...&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Reglas de calidad del código
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Por ejemplo: no permitir variables que no se usen, no permitir declaraciones de variables globales...&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Son las más importantes que ofrecen los linters ya que pueden detectar errores en el código.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es Prettier?
&lt;/h2&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%2Fi%2Fo8gyc53s3dmnvro0tvd6.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%2Fi%2Fo8gyc53s3dmnvro0tvd6.png" alt="Alt Text" width="128" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prettier es una herramienta para formatear el código, tiene soporte para &lt;em&gt;HMTL, CSS, JavaScript, JSX, TypeScript, GraphQL...&lt;/em&gt; entre otros.&lt;/p&gt;

&lt;p&gt;Se encarga de garantizar que el código se ajuste a un estilo consistente de manera automática. Para ello, analiza el código y lo re-escribe cada vez que se ejecuta.&lt;/p&gt;

&lt;p&gt;Su objetivo es acabar con los debates sobre el estilo del código, de ahí que no trate de cubrir todos los casos de uso. Es una herramienta dogmática, por tanto, los debates sobre estilo simplemente pasarán a ser debates sobre qué &lt;a href="https://prettier.io/docs/en/options.html" rel="noopener noreferrer"&gt;opciones de Prettier&lt;/a&gt; usar.&lt;/p&gt;

&lt;p&gt;Gracias a Prettier ahorraremos tiempo y energía en hacer que el estilo de nuestro código esté normalizado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuración
&lt;/h2&gt;

&lt;p&gt;Como hemos visto, cada herramienta tiene sus puntos fuertes e intentaremos aprovechar lo mejor de cada una. En definitiva, ESLint estará enfocado en lo relacionado a la calidad del código mientras que Prettier se encargará de su formato.&lt;/p&gt;

&lt;p&gt;En la siguiente configuración nos centraremos en su uso con &lt;em&gt;JavaScript&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalar Dependencias
&lt;/h3&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;--save-dev&lt;/span&gt; eslint prettier eslint-config-prettier eslint-plugin-prettier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/prettier/eslint-config-prettier" rel="noopener noreferrer"&gt;eslint-config-prettier&lt;/a&gt;: desactiva las reglas de ESLint que entren en conflicto con Prettier.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/prettier/eslint-plugin-prettier" rel="noopener noreferrer"&gt;eslint-plugin-prettier&lt;/a&gt;: añade una regla que formatea el contenido usando Prettier.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Configurar ESLint
&lt;/h3&gt;

&lt;p&gt;En nuestra configuración de ESLint añadiremos las siguientes líneas:&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;// .eslintrc.js&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;extends&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="s1"&gt;eslint:recommended&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;plugin:prettier/recommended&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;rules&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="s1"&gt;prettier/prettier&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;warn&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;De esta manera será ESLint el que se encargará de ejecutar Prettier.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;He añadido &lt;em&gt;eslint:recommended&lt;/em&gt; a modo de ejemplo, se puede usar la configuración que deseemos. Por otro lado, también he configurado que los elementos que no cumplan con las reglas de Prettier se muestren en forma de aviso, si queremos que muestren en forma de error simplemente hay que sustituir &lt;em&gt;'warn'&lt;/em&gt; por &lt;em&gt;'error'&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Configurar Prettier
&lt;/h3&gt;

&lt;p&gt;En la configuración de Prettier vamos a añadir algunas reglas, por ejemplo:&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;// .prettierrc.js&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;printWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;singleQuote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;trailingComma&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;all&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;h3&gt;
  
  
  Script de npm
&lt;/h3&gt;

&lt;p&gt;Añadiremos la siguiente línea en los scripts de nuestro package.json&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;"lint:fix"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eslint --fix ./src"&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;&lt;em&gt;ESLint&lt;/em&gt; corregirá los problemas que sea capaz de resolver automáticamente y aplicará el estilo al código con &lt;em&gt;Prettier&lt;/em&gt;, tal y como hemos configurado anteriormente.&lt;/p&gt;
&lt;h2&gt;
  
  
  Resultado
&lt;/h2&gt;

&lt;p&gt;Si con la configuración anterior ejecutamos el script con &lt;code&gt;npm run lint:fix&lt;/code&gt; obtendremos para el siguiente fichero de ejemplo un resultado como este:&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%2Fi%2F9ix54m30x4s7tbm2xqbo.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%2Fi%2F9ix54m30x4s7tbm2xqbo.png" alt="Alt Text" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;
Antes de ejecutar el script



&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%2Fi%2Fwhglsyagr88ym53cyc9d.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%2Fi%2Fwhglsyagr88ym53cyc9d.png" alt="Alt Text" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;
Después de ejecutar el script



&lt;p&gt;Ahora podremos cambiar entre proyectos con distintas configuraciones de manera cómoda, no deberemos preocuparnos si usar 2 espacios o 4, comillas simples o dobles… simplemente nos centraremos en la solución que estamos implementando.&lt;/p&gt;


&lt;h2&gt;
  
  
  Integración con VSCode
&lt;/h2&gt;

&lt;p&gt;Vamos a configurar VSCode para que ejecute ESLint y dé formato al código cuando guardemos un fichero, para ello:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Instalaremos la &lt;a href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint" rel="noopener noreferrer"&gt;extensión ESLint&lt;/a&gt; en caso de no tenerla.&lt;/li&gt;
&lt;li&gt;Abriremos preferencias de VSCode y haremos click en el primer icono situado en la esquina superior derecha para editar el fichero settings.json y añadimos lo siguiente:
&lt;/li&gt;
&lt;/ol&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;"editor.codeActionsOnSave"&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;"source.fixAll.eslint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;&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%2Fi%2Fadkb5rj0yt2k20jrbv3o.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%2Fi%2Fadkb5rj0yt2k20jrbv3o.gif" alt="Alt Text" width="720" height="399"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Conflictos con la opción editor.formatOnSave
&lt;/h3&gt;

&lt;p&gt;En caso de tener configurado que VSCode formatee nuestro código al guardar un fichero (con la opción editor.formatOnSave), deberemos desactivarla para JavaScript y JSX, ya que de este proceso se encargará ESLint.&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;"editor.formatOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[javascript]"&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;"editor.formatOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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;"[javascriptreact]"&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;"editor.formatOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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;"editor.codeActionsOnSave"&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;"source.fixAll.eslint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;h2&gt;
  
  
  Pre-commit hook
&lt;/h2&gt;

&lt;p&gt;Si queremos asegurarnos de que el código que se sube al repositorio cumple con las reglas establecidas, podemos configurar un &lt;a href="https://git-scm.com/docs/githooks" rel="noopener noreferrer"&gt;hook de git&lt;/a&gt; para automatizar el proceso.&lt;/p&gt;

&lt;p&gt;Una de las ventajas es que es agnóstico al editor que utilicemos, además de ser muy útil si trabajamos en equipo.&lt;/p&gt;
&lt;h3&gt;
  
  
  Instalar dependencias
&lt;/h3&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;--save-dev&lt;/span&gt; husky lint-staged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/typicode/husky" rel="noopener noreferrer"&gt;husky&lt;/a&gt;: es una herramienta que facilita la configuración de hooks de git.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/okonet/lint-staged" rel="noopener noreferrer"&gt;lint-staged&lt;/a&gt;: es una herramienta para ejecutar linters sobre los ficheros que se encuentren preparados para el commit.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Configurar Husky
&lt;/h3&gt;

&lt;p&gt;En la configuración de Husky añadiremos lo siguiente:&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;// .huskyrc.js&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&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="s1"&gt;pre-commit&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;lint-staged&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;Ahora cada vez que vayamos a hacer un commit antes se disparará el hook &lt;em&gt;pre-commit&lt;/em&gt; y este ejecutará &lt;em&gt;lint-staged&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Configurar Lint-staged
&lt;/h3&gt;

&lt;p&gt;En la configuración de Lint-staged añadimos lo siguiente:&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;// .lintstagedrc.js&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&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;*.js&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eslint --fix&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;git add&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;Para todos los ficheros con extensión &lt;em&gt;.js&lt;/em&gt; ejecutará ESLint para corregir los problemas automáticamente y dará formato a los ficheros preparados, una vez modificados vuelve a prepararlos para el commit.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Recuerda que &lt;strong&gt;ESLint&lt;/strong&gt; ejecutará &lt;strong&gt;Prettier&lt;/strong&gt; tal y como vimos antes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Repositorio de ejemplo
&lt;/h2&gt;

&lt;p&gt;En el siguiente enlace he preparado un ejemplo con el mítico &lt;a href="https://github.com/facebook/create-react-app" rel="noopener noreferrer"&gt;create-react-app&lt;/a&gt; usando la configuración de ESLint que ofrece por defecto (la cual no incluye reglas de estilo) e integrando lo que hemos visto en el artículo.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/capua" rel="noopener noreferrer"&gt;
        capua
      &lt;/a&gt; / &lt;a href="https://github.com/capua/cra-prettier-eslint-example" rel="noopener noreferrer"&gt;
        cra-prettier-eslint-example
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Ejemplo para el artículo: Integrando Prettier con ESLint 
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;¡Nos vemos en la próxima publicación!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>prettier</category>
      <category>eslint</category>
    </item>
    <item>
      <title>Desplegando apps en Meteor con Heroku y mLab</title>
      <dc:creator>Mario Blas 🇮🇨</dc:creator>
      <pubDate>Wed, 12 Feb 2020 20:05:23 +0000</pubDate>
      <link>https://forem.com/capua/desplegando-apps-en-meteor-con-heroku-y-mlab-4ae8</link>
      <guid>https://forem.com/capua/desplegando-apps-en-meteor-con-heroku-y-mlab-4ae8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Este post fue publicado originalmente en noviembre de 2016.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A continuación veremos como desplegar nuestra aplicación Meteor en 6 sencillos pasos. Los servicios que usaremos para ello son:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Heroku&lt;/strong&gt;, una plataforma como servicio (PaaS) que permite crear, ejecutar y escalar aplicaciones web, su medio principal para el despliegue es git.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;mLab&lt;/strong&gt;, una plataforma de base de datos como servicio (DBaaS) para alojar y gestionar bases de datos MongoDB, actualmente ofrece alojamiento en AWS, Azure y Google.&lt;/p&gt;




&lt;h2&gt;
  
  
  0. Requisitos para empezar
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Registrarnos en &lt;a href="https://mlab.com/" rel="noopener noreferrer"&gt;mLab&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Registrarnos en &lt;a href="https://www.heroku.com/" rel="noopener noreferrer"&gt;Heroku&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Instalar &lt;a href="https://devcenter.heroku.com/articles/heroku-cli" rel="noopener noreferrer"&gt;Heroku CLI&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Crear la Base de datos
&lt;/h2&gt;

&lt;p&gt;Creamos una base de datos Mongo con el proveedor y plan que más se adapte a nuestras necesidades.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;En el apartado Single-node el plan Sandbox es &lt;strong&gt;gratuito&lt;/strong&gt; y ofrece 0.5Gb aunque no se aconseja para producción.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Asignamos un nombre a la base de datos, pulsamos en &lt;em&gt;Create new MongoDB deployment&lt;/em&gt; y una vez creada entramos en ella.&lt;/p&gt;

&lt;p&gt;Para terminar hacemos click en la pestaña &lt;em&gt;Users&lt;/em&gt;, creamos un nuevo usuario y listo.&lt;/p&gt;

&lt;p&gt;En la parte superior podemos ver nuestra &lt;em&gt;MongoDB URI&lt;/em&gt;, que será la que usaremos más adelante y que tiene un aspecto parecido a lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mongodb://&amp;lt;dbuser&amp;gt;:&amp;lt;dbpassword&amp;gt;@ds&amp;lt;012345&amp;gt;.mlab.com:&amp;lt;12345&amp;gt;/&amp;lt;dbname&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Autenticarse con Heroku CLI
&lt;/h2&gt;

&lt;p&gt;Desde la terminal nos identificamos con nuestras credenciales usando el siguiente comando:&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="nv"&gt;$ &lt;/span&gt;heroku login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Crear la app en Heroku
&lt;/h2&gt;

&lt;p&gt;Nos situamos en nuestro proyecto git y creamos la aplicación en Heroku indicando el nombre que deseamos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Además podemos definir el nombre con el que vamos a referirnos a nuestro repositorio remoto y la región donde queremos alojar nuestra aplicación (por defecto son &lt;strong&gt;heroku&lt;/strong&gt; y &lt;strong&gt;us&lt;/strong&gt; respectivamente).&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;my-git-project&amp;gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;heroku apps:create &amp;lt;app-name&amp;gt; &lt;span class="nt"&gt;--remote&lt;/span&gt; &amp;lt;remote-name&amp;gt; &lt;span class="nt"&gt;--region&lt;/span&gt; &amp;lt;us|eu&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Aplicar un buildpack
&lt;/h2&gt;

&lt;p&gt;El buildpack preparará nuestra aplicación Meteor para ser ejecutada por Heroku.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;En este ejemplo vamos a utilizar el genial &lt;a href="https://github.com/AdmitHub/meteor-buildpack-horse" rel="noopener noreferrer"&gt;meteor-buildpack-horse&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;heroku buildpacks:set https://github.com/AdmitHub/meteor-buildpack-horse.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Configurar las variables de nuestra aplicación
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Variable para la URL&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;heroku config:set &lt;span class="nv"&gt;ROOT_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://&amp;lt;app-name&amp;gt;.herokuapp.com"&lt;/span&gt;

&lt;span class="c"&gt;# Variable para enlazar a nuestra Base de datos (MongoDB URI)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;heroku config:set &lt;span class="nv"&gt;MONGO_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;mlab-uri&amp;gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Settings de Meteor (suponiendo que están en settings.json)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;heroku config:set &lt;span class="nv"&gt;METEOR_SETTINGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;settings.json&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Desplegar
&lt;/h2&gt;

&lt;p&gt;Una vez tenemos todo configurado lo último que tenemos que hacer es un &lt;em&gt;git push&lt;/em&gt; a la rama master de nuestro repositorio remoto en Heroku.&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="nv"&gt;$ &lt;/span&gt;git push &amp;lt;remote-name&amp;gt; master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Bonus
&lt;/h2&gt;

&lt;p&gt;Para terminar os dejo algunas anotaciones que os pueden ser de utilidad…&lt;/p&gt;

&lt;h3&gt;
  
  
  *Trabajar en equipo
&lt;/h3&gt;

&lt;p&gt;Para que el resto del equipo de desarrollo pueda desplegar sus cambios tan solo tienen que añadir el repositorio remoto a su proyecto git usando:&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="nv"&gt;$ &lt;/span&gt;heroku git:remote &lt;span class="nt"&gt;-a&lt;/span&gt; &amp;lt;app-name&amp;gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &amp;lt;remote-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  *Mostrar el log
&lt;/h3&gt;

&lt;p&gt;Si queremos ver el log de nuestra aplicación tan solo tenemos que ejecutar:&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="nv"&gt;$ &lt;/span&gt;heroku logs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  *Integrar add-ons
&lt;/h3&gt;

&lt;p&gt;Podemos agregar &lt;a href="https://elements.heroku.com/addons" rel="noopener noreferrer"&gt;herramientas y servicios&lt;/a&gt; desde la terminal con el siguiente comando:&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="nv"&gt;$ &lt;/span&gt;heroku addons:create &amp;lt;proveedor:plan&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  *Desplegar una rama distinta de master
&lt;/h3&gt;

&lt;p&gt;Lo haremos de la misma manera que haríamos con git:&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="nv"&gt;$ &lt;/span&gt;git push &amp;lt;remote-name&amp;gt; &amp;lt;local-branch&amp;gt;:master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  *Trabajar con varias instancias de Heroku
&lt;/h3&gt;

&lt;p&gt;Si tenemos varios repositorios remotos de Heroku en un mismo proyecto para ejecutar algunos comandos tendremos que especificar la aplicación, por ejemplo:&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;# Development&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;heroku config:add &lt;span class="nv"&gt;METEOR_SETTINGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;settings-development.json&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--app&lt;/span&gt; &amp;lt;dev-app-name&amp;gt;

&lt;span class="c"&gt;# Production&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;heroku config:add &lt;span class="nv"&gt;METEOR_SETTINGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;settings-production.json&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--app&lt;/span&gt; &amp;lt;prod-app-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>devops</category>
      <category>meteor</category>
      <category>heroku</category>
      <category>mongodb</category>
    </item>
    <item>
      <title>Intro a Sublime Text</title>
      <dc:creator>Mario Blas 🇮🇨</dc:creator>
      <pubDate>Wed, 05 Feb 2020 20:44:24 +0000</pubDate>
      <link>https://forem.com/capua/intro-a-sublime-text-15ng</link>
      <guid>https://forem.com/capua/intro-a-sublime-text-15ng</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Este post fue publicado originalmente en abril de 2015.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Como buenos gladiadores además de estar bien preparados es importante familiarizarnos con nuestras armas. Cuanto más cómodos y adaptados estemos en nuestro entorno de batalla mayor será nuestro rendimiento. Una de las herramientas más importantes para un programador es su editor.&lt;/p&gt;

&lt;p&gt;Personalmente somos de los que prefieren editor de texto en vez de IDE por su simplicidad y ligereza, para nuestros menesteres no nos hace falta más.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.sublimetext.com/" rel="noopener noreferrer"&gt;Sublime Text&lt;/a&gt; en su versión 3, a pesar de estar en beta es bastante estable y funciona realmente bien. Al abrirlo por primera vez sientes que viene casi “pelado” y es una de sus ventajas, ya que se puede personalizar prácticamente todo.&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%2Fi%2F3dmcq5d3a012y7u6l2mb.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%2Fi%2F3dmcq5d3a012y7u6l2mb.png" alt="Alt Text" width="800" height="481"&gt;&lt;/a&gt;&lt;/p&gt;
Sublime Text recién abierto.



&lt;p&gt;Algunos de sus puntos fuertes son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ligereza.&lt;/li&gt;
&lt;li&gt;Capacidad de personalización.&lt;/li&gt;
&lt;li&gt;Selecciones y cursores múltiples.&lt;/li&gt;
&lt;li&gt;Paleta de comandos.&lt;/li&gt;
&lt;li&gt;Movernos entre ficheros, buscar en los mismos, ir a una función o linea determinada…&lt;/li&gt;
&lt;li&gt;Cambiar de proyecto instantáneamente, recordando el estado del área de trabajo.&lt;/li&gt;
&lt;li&gt;Acceso a una infinidad de paquetes creados por la comunidad.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ¡A las armas!
&lt;/h2&gt;

&lt;p&gt;A continuación os voy a mostrar algunas de mis preferencias.&lt;br&gt;
Una de las primeras cosas que debemos hacer después de instalar Sublime es instalar &lt;a href="https://packagecontrol.io/" rel="noopener noreferrer"&gt;Package Control&lt;/a&gt; siguiendo los &lt;a href="https://packagecontrol.io/installation" rel="noopener noreferrer"&gt;pasos&lt;/a&gt; que indican en su web.&lt;br&gt;
Para instalar un paquete tenemos que abrir la paleta de comandos &lt;code&gt;(⌘+⇧+P)&lt;/code&gt; o &lt;code&gt;(⌃+⇧+P)&lt;/code&gt;, escribir &lt;em&gt;install package&lt;/em&gt; y buscar por el nombre del paquete que deseamos.&lt;br&gt;
En la web de Package Control podemos ver los paquetes de moda, nuevos y populares, además de mucha información extra.&lt;/p&gt;
&lt;h2&gt;
  
  
  Packages
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://packagecontrol.io/packages/Emmet" rel="noopener noreferrer"&gt;Emmet&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Para mejorar el workflow cuando trabajamos con HTML y CSS.&lt;/p&gt;

&lt;p&gt;Echad un vistazo al ejemplo de su &lt;a href="https://emmet.io/" rel="noopener noreferrer"&gt;web&lt;/a&gt; y dedicadle un rato a ver su &lt;a href="https://docs.emmet.io/cheat-sheet/" rel="noopener noreferrer"&gt;cheat sheet&lt;/a&gt;, no tiene desperdicio.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://packagecontrol.io/packages/SublimeLinter" rel="noopener noreferrer"&gt;Sublime Linter&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;El uso de un linter se hace esencial para escribir código mejor, más limpio y con menos bugs, empleando buenas prácticas de programación.&lt;/p&gt;

&lt;p&gt;Los linters no están incluidos en el paquete así que además tendremos que instalar los que deseemos. En concreto los que más suelo usar son &lt;a href="https://packagecontrol.io/packages/SublimeLinter-jshint" rel="noopener noreferrer"&gt;JSHint&lt;/a&gt;, &lt;a href="https://packagecontrol.io/packages/SublimeLinter-csslint" rel="noopener noreferrer"&gt;CSSLint&lt;/a&gt; y &lt;a href="https://packagecontrol.io/packages/SublimeLinter-contrib-scss-lint" rel="noopener noreferrer"&gt;SCSSLint&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para obtener información acerca de un error en concreto tan solo hemos de situar el cursor en la linea del error y podremos ver una ver una breve descripción en la barra de estado &lt;em&gt;(situada en la parte inferior de la ventana)&lt;/em&gt;, zona donde también podemos ver el número total de errores en cualquier momento.&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%2Fi%2Fdgz3sylxs81jn4m3ich7.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%2Fi%2Fdgz3sylxs81jn4m3ich7.png" alt="Alt Text" width="536" height="338"&gt;&lt;/a&gt;&lt;/p&gt;
Sublime​Linter-csslint


&lt;h3&gt;
  
  
  &lt;a href="https://packagecontrol.io/packages/SideBarEnhancements" rel="noopener noreferrer"&gt;Side​Bar​Enhancements&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Ofrece una mejora a las operaciones que tiene por defecto el sidebar de Sublime. Por ejemplo: abrir con, copiar, cortar, mover, copiar rutas…&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://packagecontrol.io/packages/DocBlockr" rel="noopener noreferrer"&gt;DocBlockr&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Ayuda a comentar bien nuestro código completando todo lo posible a partir del elemento que comentemos. Soporta lenguajes como JavaScript, TypeScript y Objective C entre otros.&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%2Fi%2Fqfog2r1kahsk4hj3gaqz.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%2Fi%2Fqfog2r1kahsk4hj3gaqz.png" alt="Alt Text" width="664" height="282"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://packagecontrol.io/packages/GitGutter" rel="noopener noreferrer"&gt;GitGutter&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Como su nombre indica nos muestra en el gutter el estado de cada linea, ya sea insertada, modificada o eliminada, comparando las diferencias con un commit/rama/tag específico.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://packagecontrol.io/packages/BracketHighlighter" rel="noopener noreferrer"&gt;BracketHighlighter&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Resalta la apertura y cierre de etiquetas, comillas, paréntesis, llaves, corchetes… Muy útil sobre todo cuando tenemos que tocar algo de &lt;em&gt;spaguetti code&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Podemos mostrar los indicadores en el gutter, en el código, o en ambos a la vez, así como aplicarles distintos estilos.&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%2Fi%2F4lcadvycthlswnqhd7zq.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%2Fi%2F4lcadvycthlswnqhd7zq.png" alt="Alt Text" width="800" height="137"&gt;&lt;/a&gt;&lt;/p&gt;
BracketHighlighter con la configuración por defecto.


&lt;h3&gt;
  
  
  &lt;a href="https://packagecontrol.io/packages/ProjectManager" rel="noopener noreferrer"&gt;Project Manager&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Muy cómodo para ordenar y manejar proyectos olvidándonos de donde están los ficheros. Es una mejora a la funcionalidad que trae Sublime por defecto.&lt;/p&gt;
&lt;h3&gt;
  
  
  Otros paquetes que uso:
&lt;/h3&gt;

&lt;p&gt;jQuery, Underscorejs snippets, Handlebars, SCSS, Meteor Snippets, Color Highlighter, ColorPicker, EditorConfig...&lt;/p&gt;

&lt;p&gt;¿Cuáles son vuestros preferidos?&lt;/p&gt;
&lt;h2&gt;
  
  
  Configuración
&lt;/h2&gt;

&lt;p&gt;La configuración de Sublime Text se basa en ficheros &lt;strong&gt;JSON&lt;/strong&gt;, podéis verla en &lt;em&gt;Preferences → Settings — Default&lt;/em&gt; y los atajos de teclado en &lt;em&gt;Preferences → Keybindings — Default&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Para añadir o sobrescribir los valores hemos de editar los ficheros que terminan por * &lt;em&gt;— User&lt;/em&gt;, veamos algunos ejemplos:&lt;/p&gt;

&lt;p&gt;Settings — User:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="c1"&gt;// Resalta la linea actual&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"highlight_line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="c1"&gt;// Añade una linea en blanco al final del documento&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ensure_newline_at_eof_on_save"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="c1"&gt;// Elimina los espacios al final de las lineas al guardar&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"trim_trailing_white_space_on_save"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="c1"&gt;// Modifica los separadores de palabras eliminando '-' para CSS&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"word_separators"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;()&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;':,.;&amp;lt;&amp;gt;~!@#$%^&amp;amp;*|+=[]{}`~?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="c1"&gt;// Permite hacer scroll aunque se haya terminado el documento&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scroll_past_end"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;Keybindings — User:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="c1"&gt;// Indenta todo el documento&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;"keys"&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;"super+shift+r"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reindent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"single_line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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;span class="c1"&gt;// Intercambia los keybindings de "pegar" y "pegar e indentar"&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;"keys"&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;"super+v"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"paste_and_indent"&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;span class="nl"&gt;"keys"&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;"super+shift+v"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"paste"&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="c1"&gt;// Resalta el fichero actual en el sidebar&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;"keys"&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;"alt+shift+r"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reveal_in_side_bar"&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;h2&gt;
  
  
  Sincronización
&lt;/h2&gt;

&lt;p&gt;Si sois usuarios de Dropbox u otro servicio similar podéis sincronizar todas vuestras preferencias y ahorraros mucho trabajo para estar cómodos cada vez que cambiéis de equipo o sistema operativo.&lt;/p&gt;

&lt;p&gt;Si vuestro Dropbox no está en la ubicación por defecto, debéis sustituir &lt;em&gt;~/Dropbox&lt;/em&gt; por vuestra ubicación.&lt;/p&gt;

&lt;p&gt;Las siguientes instrucciones son para &lt;em&gt;OS X&lt;/em&gt;, para otro sistema operativo las tenéis &lt;a href="https://packagecontrol.io/docs/syncing#dropbox" rel="noopener noreferrer"&gt;aquí&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;En vuestro primer equipo:&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="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/Library/Application&lt;span class="se"&gt;\ &lt;/span&gt;Support/Sublime&lt;span class="se"&gt;\ &lt;/span&gt;Text&lt;span class="se"&gt;\ &lt;/span&gt;3/Packages/
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; ~/Dropbox/Sublime
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mv &lt;/span&gt;User ~/Dropbox/Sublime/
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; ~/Dropbox/Sublime/User
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En vuestros otros equipos:&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="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/Library/Application&lt;span class="se"&gt;\ &lt;/span&gt;Support/Sublime&lt;span class="se"&gt;\ &lt;/span&gt;Text&lt;span class="se"&gt;\ &lt;/span&gt;3/Packages/
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; User
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; ~/Dropbox/Sublime/User
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>tooling</category>
      <category>editor</category>
    </item>
  </channel>
</rss>
