<?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: Joshua Navarro</title>
    <description>The latest articles on Forem by Joshua Navarro (@joshuanr5).</description>
    <link>https://forem.com/joshuanr5</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%2F629893%2Fbc3f02ca-d10c-491e-8d52-40b60e442576.jpeg</url>
      <title>Forem: Joshua Navarro</title>
      <link>https://forem.com/joshuanr5</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/joshuanr5"/>
    <language>en</language>
    <item>
      <title>EsLint + TypeScript + Prettier (Flat Config)</title>
      <dc:creator>Joshua Navarro</dc:creator>
      <pubDate>Sat, 08 Jun 2024 00:45:57 +0000</pubDate>
      <link>https://forem.com/joshuanr5/eslint-typescript-prettier-flat-config-1bmb</link>
      <guid>https://forem.com/joshuanr5/eslint-typescript-prettier-flat-config-1bmb</guid>
      <description>&lt;p&gt;Today I woke up with the need to create an email scheduled notification for my personal project using AWS and I noticed that these last few months I have abandoned NodeJS ... y cuando comenzé a configurar una función lambda usando SAM (Serverless Application Model) me di cuenta que por lo menos necesitaria una configuración de EsLint con Typescript minima para poder sentirme comodo codificando.&lt;/p&gt;

&lt;p&gt;Para mi sorpresa me di cuenta que EsLint ha cambiado completamente su sistema de configuración haciendo uso de lo que ellos llaman &lt;a href="https://eslint.org/blog/2022/08/new-config-system-part-2/"&gt;Flat Config&lt;/a&gt; por ello decidi hacer este pequeño blog para poder configurar EsLint, TypeScript y Prettier desde cero.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nota: Vamos a utilizar &lt;code&gt;npm&lt;/code&gt; como gestor de paquetes para node pero puedes usar el de tu elección.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pre-requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tener NodeJS version &amp;gt;=20.14.0&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Creación del projecto
&lt;/h2&gt;

&lt;p&gt;Vamos a crear una carpeta vacia e inicializar &lt;code&gt;npm&lt;/code&gt;.&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="nb"&gt;mkdir &lt;/span&gt;my-project
&lt;span class="nb"&gt;cd &lt;/span&gt;my-project
npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Instalando dependencias
&lt;/h2&gt;

&lt;p&gt;Vamos a instalar las siguientes dependencias con sus repestivas dependencias @Types, las cuales son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;eslint&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@eslint/js&lt;/code&gt; con &lt;code&gt;@types/eslint__js&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;&lt;code&gt;typescript&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;typescript-eslint&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prettier&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eslint-plugin-prettier&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;eslint-config-prettier&lt;/code&gt; con &lt;code&gt;@types/eslint-config-prettier&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&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 @eslint/js @types/eslint__js typescript typescript-eslint prettier eslint-plugin-prettier eslint-config-prettier @types/eslint-config-prettier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Configurar EsLint y Prettier
&lt;/h2&gt;

&lt;p&gt;Una vez instalado vamos a comenzar con la configuración de EsLint y Prettier. Vamos a crear el archivo &lt;code&gt;eslint.config.msj&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano eslint.config.msj
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;una vez creada vamos a poner toda la configuración del archivo.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Voy a explicar a gran escala en que consiste el codigo previo, aunque igual recomiendo que lean la &lt;a href="https://eslint.org/docs/latest/use/configure/"&gt;documentación oficial del Eslint&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Como podemos ver al inicio estan los imports el cual importamos las librerias &lt;code&gt;@eslint/js&lt;/code&gt; que cuenta con la configuración para JavaScript, &lt;code&gt;typescript-eslint&lt;/code&gt; que como pueden adiviar cuenta con la configuración de TypeScript, &lt;code&gt;eslint-plugin-prettier&lt;/code&gt; que es un plugin de eslint para mostrar errores de Prettier y &lt;code&gt;eslint-config-prettier&lt;/code&gt; debido a que prettier y eslint pueden tener reglas similares esta libreria nos ayuda a evitar problemas con estas librerias y que todo funcione de manera esperada.&lt;/p&gt;

&lt;p&gt;Para la configuración del eslint usamos la librerias &lt;code&gt;typescript-eslint&lt;/code&gt; con su metodo config que es un helper opcional el cual permite ingresar distintas configuraciones de eslint y que internamente retorne todo lo que se eslint requiere.&lt;/p&gt;

&lt;p&gt;En el primer argumento del metodo &lt;code&gt;config&lt;/code&gt; agregamos toda la configuración para TypeScript extendiendo las configuraciones recomendadas tanto para JavaScript y Typescript.&lt;/p&gt;

&lt;p&gt;Como ahora el Flat Config de EsLint permite tener una configuración en cascada, decidí que toda la configuración es Prettier estaria en el siguiente argumento de configuración extendiendo su configuración recomendada.&lt;/p&gt;

&lt;p&gt;Ya que tenemos configurado EsLint vamos a configurarlo creando el archivo &lt;code&gt;.prettierrc.yaml&lt;/code&gt;.&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="nb"&gt;touch&lt;/span&gt; .prettierrc.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Y agregarmos la configuración de su preferencia, este es un ejemplo de mi configuración minima.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Bueno por ahora esto es lo mas básico que en lo personal necesito para poder desarrollar en TypeScript, igual pueden ir agregando mas plugins como para React, AirBnb, etc.&lt;/p&gt;

&lt;p&gt;Saludos!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Vite + ReactTS + ESLint Airbnb + Prettier</title>
      <dc:creator>Joshua Navarro</dc:creator>
      <pubDate>Tue, 25 Jul 2023 01:52:58 +0000</pubDate>
      <link>https://forem.com/joshuanr5/vite-reactts-eslint-airbnb-prettier-5hmp</link>
      <guid>https://forem.com/joshuanr5/vite-reactts-eslint-airbnb-prettier-5hmp</guid>
      <description>&lt;p&gt;El presente blog vamos a configurar una aplicación en React con la ayuda de Vite. Configuraremos TypeScript, ESLint Airbnb, Prettier y entre otros mas que iré añadiendo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lineamientos a seguir
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Se usará &lt;code&gt;yarn&lt;/code&gt; como gestor de paquetes de NodeJS.&lt;/li&gt;
&lt;li&gt;Los archivos de configuración serán en &lt;code&gt;YAML&lt;/code&gt;, pero pueden optar por otras extensiones.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Creación de Proyecto en Vite + TypeScript
&lt;/h2&gt;

&lt;p&gt;Vamos a empezar creando un proyecto desde cero con Vite utilizando TypeScript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn create vite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este comando nos permite crear un proyecto desde cero, para ello solo debemos responder las preguntas que nos saldrá en la consola.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;✔ Project name: › vrtsept-template
✔ Select a framework: › React
✔ Select a variant: › TypeScript + SWC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora instalamos las dependencias con el comando &lt;code&gt;yarn install&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando ESLint
&lt;/h2&gt;

&lt;p&gt;Por default Vite nos crea un archivo &lt;code&gt;.eslintrc.cjs&lt;/code&gt; la cual configura los siguientes plugins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;eslint&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@typescript-eslint/eslint-plugin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@typescript-eslint/parser&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eslint-plugin-react-hooks&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eslint-plugin-react-refresh&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por el momento vamos a eliminar el archivo &lt;code&gt;.eslintrc.cjs&lt;/code&gt; (corriendo el comando &lt;code&gt;$ rm .eslintrc.cjs&lt;/code&gt;) y vamos a configurar ESLint desde cero para no estar acomplados a las futuras actualizaciones que pueda tener el template de Vite.&lt;/p&gt;

&lt;p&gt;Ahora vamos a instalar la configuración de ESLint de Airbnb, la cual es una conocida y aceptada en el mundo de React (mayor informacion &lt;a href="https://www.npmjs.com/package/eslint-config-airbnb"&gt;https://www.npmjs.com/package/eslint-config-airbnb&lt;/a&gt;), vamos a instalar el plugin llamado &lt;code&gt;eslint-config-airbnb&lt;/code&gt; con sus depenncias.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx install-peerdeps &lt;span class="nt"&gt;--dev&lt;/span&gt; eslint-config-airbnb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este comando instalara los siguientes plugins por default, los cuales son configurado por el plugin de airbnb:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;eslint-config-airbnb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eslint&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eslint-plugin-import&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eslint-plugin-jsx-a11y&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eslint-plugin-react&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eslint-plugin-react-hooks&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como nosotros estamos utilizando TypeScript entonces debemos extender esta configuración para que funcione con TS sin problemas, para ello ya se cuenta con un plugin llamdo &lt;code&gt;eslint-config-airbnb-typescript&lt;/code&gt; el cual vamos a instalar de la misma manera que el anterior.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx install-peerdeps &lt;span class="nt"&gt;--dev&lt;/span&gt; eslint-config-airbnb-typescript
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este compando instalará lo siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;eslint-config-airbnb-typescript&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@typescript-eslint/eslint-plugin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@typescript-eslint/parser&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eslint&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eslint-plugin-import&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Nota: Algunas dependencias fueron instalaras dos veces, no hay problema con esto ya que ambas mantienen la misma version.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Con esto ya podriamos crear nuestro archivo &lt;code&gt;.eslintrc.yaml&lt;/code&gt; con la siguiente configuración.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;browser&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;es2020&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;extends&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;airbnb&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;airbnb-typescript&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;airbnb/hooks&lt;/span&gt;
&lt;span class="na"&gt;ignorePatterns&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;dist&lt;/span&gt;
&lt;span class="na"&gt;parser&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;@typescript-eslint/parser'&lt;/span&gt;
&lt;span class="na"&gt;parserOptions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ecmaVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;latest&lt;/span&gt;
  &lt;span class="na"&gt;sourceType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;module&lt;/span&gt;
  &lt;span class="na"&gt;project&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./tsconfig.json&lt;/span&gt;
&lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;react&lt;/span&gt;
&lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;no-console&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;warn&lt;/span&gt;
  &lt;span class="na"&gt;react/react-in-jsx-scope&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;off&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;@typescript-eslint/no-unused-vars'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;warn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta sería la configuración inicial necesaria para poder trabajar con ESLint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando Prettier
&lt;/h2&gt;

&lt;p&gt;Vamos a configurar Prettier para que nos ayude a automaticamente remover varios errores de ESLint que pueden aparecer por temas de formatos, a su vez vamos a configurar eslint para que muestre errores de prettier y no haya alguna inconsitencias entre las reglas de ESLint y el auto-formato de Prettier.&lt;/p&gt;

&lt;p&gt;Vamos a instalar Prettier&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;-D&lt;/span&gt; prettier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora vamos a crear un archivo &lt;code&gt;.prettierrc.yaml&lt;/code&gt; donde vamos a configurar nuestras reglas de formato.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;semi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;tabWidth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="na"&gt;printWidth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;120&lt;/span&gt;
&lt;span class="na"&gt;singleQuote&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;trailingComma&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;es5&lt;/span&gt;
&lt;span class="na"&gt;endOfLine&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;auto&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora vamos a configurar ESLint para que las reglas de formato de Prettier esten alineados con las reglas de ESLint. Primero, instalamos dos dependecias.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add -D eslint-plugin-prettier eslint-config-prettier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una vez instalado simplemente debemos extender nuestra configuración con &lt;code&gt;plugin:prettier/recommended&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;...&lt;/span&gt; &lt;span class="s"&gt;eslint configuration&lt;/span&gt;

&lt;span class="na"&gt;extends&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;... other plugins&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;plugin:prettier/recommended&lt;/span&gt;

&lt;span class="nn"&gt;...&lt;/span&gt; &lt;span class="s"&gt;eslint configuration&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora cuando tengamos un error de prettier este sera mostrando en el linter y algunos errores de formato que mostraba ESLint por default han sido desabilitados.&lt;/p&gt;

</description>
      <category>react</category>
      <category>typescript</category>
      <category>vite</category>
      <category>eslint</category>
    </item>
    <item>
      <title>Configurando tu flujo de trabajo con Git</title>
      <dc:creator>Joshua Navarro</dc:creator>
      <pubDate>Sun, 06 Jun 2021 23:14:43 +0000</pubDate>
      <link>https://forem.com/joshuanr5/configurando-tu-flujo-de-trabajo-con-git-21ne</link>
      <guid>https://forem.com/joshuanr5/configurando-tu-flujo-de-trabajo-con-git-21ne</guid>
      <description>&lt;h2&gt;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;Hoy en día Git se ha vuelto una herramienta básica para trabajar cuando estas desarrollando un proyecto, sea de manera individual o con un equipo.&lt;/p&gt;

&lt;p&gt;Esto se debe porque brinda una serie de herramientas que hacen la vida mas facil a los programadores, permite la colaboración en equipo, detecta conflictos y mantiene un historial de todos los cambios que se realicen en el proyecto, a todo esto se le llama &lt;strong&gt;control de versiones&lt;/strong&gt; siendo Git la mas popular hoy en dia (si quieres saber mas sobre el control de versiones puedes visitar este &lt;a href="https://www.atlassian.com/es/git/tutorials/what-is-version-control" rel="noopener noreferrer"&gt;enlace&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Git ofrece gran flexibilidad a la hora de trabajar, esto es positivo ya que te permite adaptar su funcionamiento a tu flujo de trabajo y no te impone uno. Aunque por este mismo motivo, cuando uno inicia un proyecto y no tiene experiencia puede llegar a ser un poco confuso saber cual es la mejor forma de trabajar. Es por eso que decidí hacer este blog, en la cual comentaré una de las distintas soluciones que puedes encontrar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features Branches Workflow (FBW)
&lt;/h2&gt;

&lt;p&gt;El &lt;em&gt;flujo de trabajo de ramas de funcionalidades&lt;/em&gt; nos brinda el concepto de ramas de funcionalides (&lt;em&gt;feature branch&lt;/em&gt; en ingles), la cual consiste en no trabajar directamente en la rama principal, sino crear una rama la cual este dedicada a una funcionalidad en especifico, de ahi su nombre. Esto nos brinda un espacio de trabajo por funcionalidades en las  cuales uno o mas personas puedan estar trabajando en un mismo funcionamiento sin alterar la rama principal o el trabajo de otras funcionalidades ajenas.&lt;/p&gt;

&lt;p&gt;Una vez que se tenga la funcionalidad lista, esta se podria integrar con la rama principal por medio de un &lt;strong&gt;pull request&lt;/strong&gt; brindando una capa de seguridad extra a la rama principal ya que con este método se puede tener control de los cambios que se estan insertando.&lt;/p&gt;

&lt;h2&gt;
  
  
  Uso de la rama de desarrollo (development)
&lt;/h2&gt;

&lt;p&gt;Aunque bien en el flujo de trabajo de ramas de funcionalidades se hace uso de la rama &lt;code&gt;master&lt;/code&gt; por defecto, muchos equipos ven necesario tener una rama secundaria la cual es conocida como la rama &lt;code&gt;developmente&lt;/code&gt; o &lt;code&gt;dev&lt;/code&gt;, esta rama seria una copia de la rama &lt;code&gt;master&lt;/code&gt; y tendria las funcionalidades que aun no han sido desplegadaz a producción. Esto da a enteder que todo commit hecho en la rama &lt;code&gt;master&lt;/code&gt; seria reflejado en el usuario final (producción), mientras que los cambios hechos en la rama &lt;code&gt;development&lt;/code&gt; no necesariamente tendrían impacto con el usuario final.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F3yiwd8lgsr421e6zqdm6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F3yiwd8lgsr421e6zqdm6.png" alt="feature branch workflow with development branch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ejemplos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Inicialización del proyecto
&lt;/h3&gt;




&lt;p&gt;&lt;em&gt;Nota: En este ejemplo se usará como servicio de alojamiento de repositorio GitHub y el ejemplo sera para crear un boilerplate para ExpressJS.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Lo primero que se debería hacer es crear la carpeta del proyecto con su estructura inicial (mejor conocido como &lt;em&gt;boilerplate&lt;/em&gt;). Tambien iniciaremos Git para el proyecto creado (no se olviden  de tener un .gitignore en la estructura de su proyecto).&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;# Creamos el proyecto con su estrctura inicial&lt;/span&gt;
❯ npx create-nodejs-express-app feature-branch-workflow
❯ &lt;span class="nb"&gt;cd &lt;/span&gt;feature-branch-workflow

&lt;span class="c"&gt;# Inicializamos Git&lt;/span&gt;
❯ git init &lt;span class="nt"&gt;-b&lt;/span&gt; development
Initialized empty Git repository &lt;span class="k"&gt;in&lt;/span&gt; &amp;lt;your-path-folder&amp;gt;/.git/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el ultimo comando usamos la opción de &lt;code&gt;-b &amp;lt;branch-name&amp;gt;&lt;/code&gt; para indicar cual sera la rama principal, en una inicio de proyecto es natural iniciar con la rama &lt;code&gt;development&lt;/code&gt; ya que en producción aun no se ha desarrollado nada, ya cuando se realice el primer despliegue, se creara la rama master.&lt;/p&gt;

&lt;p&gt;Lo siguiente es crear un repositorio remoto donde se almacenaran nuestro proyecto, una vez creado llego el momento de realizar el primer commit y push.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ git add &lt;span class="nb"&gt;.&lt;/span&gt;
❯ git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"initial commit"&lt;/span&gt;
&lt;span class="c"&gt;# Agregamos nuestro repositorio remoto&lt;/span&gt;
❯ git remote add origin &amp;lt;your-repository-uri&amp;gt;
❯ git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin development
Branch &lt;span class="s1"&gt;'development'&lt;/span&gt; &lt;span class="nb"&gt;set &lt;/span&gt;up to track remote branch &lt;span class="s1"&gt;'development'&lt;/span&gt; from &lt;span class="s1"&gt;'origin'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una vez llegado a este punto, nuestro proyecto ya esta listo poder crecer en funcionalidades, esto se haria creando una rama &lt;code&gt;feature&lt;/code&gt; teniendo como base  la rama &lt;code&gt;development&lt;/code&gt;. Esto lo veremos en el siguiente ejemplo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agregando funcionalidades al proyecto
&lt;/h3&gt;

&lt;p&gt;Para agregar una funcionalidad se crearía una rama nueva, la cual tenga el nombre de la funcionalidad que se quiera trabajar, en lo personal me gusta llamarlo de la siguiente forma &lt;code&gt;feat-&amp;lt;feature-name&amp;gt;&lt;/code&gt; esto puede variar segun el gusto, el objetivo es que se entienda la funcionalidad que se va a realizar en esa nueva rama. Tener en cuenta que esta rama siempre debe crearse a partir de la rama &lt;code&gt;development&lt;/code&gt; y no de la rama &lt;code&gt;master&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feat-auth-services development
Switched to a new branch &lt;span class="s1"&gt;'feat-auth-services'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Noten que el utimo parametro del comando siempre debería ser &lt;code&gt;development&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;En caso que estes trabajando solo o en equipo el desarrollo de la funcionalidad, es recomandable enlazar tu nueva rama con tu repositorio remoto, esto se hace haciendo un push al repositorio usando la opción de &lt;code&gt;--set-upstream&lt;/code&gt; que también se conoce como &lt;code&gt;-u&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin feat-auth-services
Branch &lt;span class="s1"&gt;'feat-auth-services'&lt;/span&gt; &lt;span class="nb"&gt;set &lt;/span&gt;up to track remote branch &lt;span class="s1"&gt;'feat-auth-services'&lt;/span&gt; from &lt;span class="s1"&gt;'origin'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto creara tu rama en el repositorio remoto y a la vez permitira rastrear los cambios que se hagan en esta rama (para mayor información pueder leer en siguiente &lt;a href="https://devconnected.com/how-to-set-upstream-branch-on-git/" rel="noopener noreferrer"&gt;blog&lt;/a&gt;). Gracias a esto cuando quieras publicar nuevos cambios a tu rama &lt;code&gt;feature&lt;/code&gt; lo podras hacer simplemente con el comando &lt;code&gt;git push&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Una vez realizado todos los commits necesarios y la funcionalidad ya este probada, se daria inicio al &lt;strong&gt;pull request&lt;/strong&gt;. Esto depende mucho de la plataforma que esten usando para almacenar su proyecto, en mi caso he usado &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, pero la experiencia es la misma en otras plataformas.&lt;/p&gt;

&lt;p&gt;Lo primero sera ir a la opcion de Pull Request de tu repositorio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fzas6qyxvzt0clk2nvll7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fzas6qyxvzt0clk2nvll7.png" alt="github pull request option"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez ahi, le dan en &lt;code&gt;New pull request&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fuuzn5pumz72wtr2ximnh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fuuzn5pumz72wtr2ximnh.png" alt="github new pull request"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esto les mostrara una pantalla donde les permitira elegir la &lt;code&gt;base&lt;/code&gt; la cual es la fuente donde se insertara la nuava funcionalidad (elegir &lt;code&gt;development&lt;/code&gt;), y el &lt;code&gt;compare&lt;/code&gt; que seria la rama &lt;code&gt;feature&lt;/code&gt; donde se hicieron y probaron los cambios.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fw731j6mhl6cykggh3f9e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fw731j6mhl6cykggh3f9e.png" alt="github base compare"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lo siguiente es darle en &lt;code&gt;Create pull request&lt;/code&gt;, agregar una descrición y listo. Ahora el código nuevo que has escrito podra ser revisado y aprobado.&lt;/p&gt;

&lt;p&gt;Como dije anteriormente, esto brinda una capa de seguridad extra al momento de realizar una integración.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Existen muchos flujos de trabajo para Git como &lt;a href="https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow" rel="noopener noreferrer"&gt;Gitflow Workflow&lt;/a&gt;, &lt;a href="https://www.atlassian.com/git/tutorials/comparing-workflows/forking-workflow" rel="noopener noreferrer"&gt;Forking Workflow&lt;/a&gt;, etc. El objetivo de este blog es brindar una guía inicial de como desarrollar un flujo de trabajo en base al Feature Branch Workflow, por medio de ejemplos; ya que me vi con la necesidad de cuando quize enfrentar nuevos proyectos desde cero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.atlassian.com/git/tutorials/what-is-version-control" rel="noopener noreferrer"&gt;What is version control?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.atlassian.com//git/tutorials/comparing-workflows" rel="noopener noreferrer"&gt;Comparing Workflows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.atlassian.com/git/tutorials/comparing-workflows/feature-branch-workflow" rel="noopener noreferrer"&gt;Git Feature Branch Workflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devconnected.com/how-to-set-upstream-branch-on-git/" rel="noopener noreferrer"&gt;How To Set Upstream Branch on Git&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>beginners</category>
      <category>gitflow</category>
    </item>
  </channel>
</rss>
