<?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: Vinicius Jimenez</title>
    <description>The latest articles on DEV Community by Vinicius Jimenez (@vinniciusj).</description>
    <link>https://dev.to/vinniciusj</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%2F950142%2F7a0bab7b-b996-46ed-9047-3bd888a97192.jpeg</url>
      <title>DEV Community: Vinicius Jimenez</title>
      <link>https://dev.to/vinniciusj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vinniciusj"/>
    <language>en</language>
    <item>
      <title>Utilizando GitLab snippets para automação de criação de projetos React</title>
      <dc:creator>Vinicius Jimenez</dc:creator>
      <pubDate>Mon, 19 Aug 2024 11:03:38 +0000</pubDate>
      <link>https://dev.to/vinniciusj/utilizando-gitlab-snippets-para-automacao-de-criacao-de-projetos-react-262g</link>
      <guid>https://dev.to/vinniciusj/utilizando-gitlab-snippets-para-automacao-de-criacao-de-projetos-react-262g</guid>
      <description>&lt;p&gt;Durante o processo de desenvolvimento de aplicações web com React, é gasto um bom tempo configurando ESLint, Prettier, lint-staged e husky, o que acaba sendo muito custoso e repetitivo. De forma a agilizar isso, nesse artigo busco apresentar como utilizando os snippeets do GitLab é possível automatizar isso.&lt;/p&gt;

&lt;p&gt;De acordo com a documentação do GitLab:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Com os snippets do GitLab, você pode armazenar e compartilhar trechos de código e texto com outros usuários. É possível comentar, clonar e utilizar controle de versão em snippets. Eles podem conter vários arquivos. Além disso, suportam realce de sintaxe, incorporação, download, e você pode gerenciar seus snippets com a API de snippets&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Como o snippets podem ser clonados, é possível clonar trechos de códigos e arquivos para dentro de seu projeto. Utilizando essa funcionalidade, podemos dividir partes das configurações iniciais do projeto em alguns snippets e depois clonar por partes dentro do nosso projeto. Além disso, vamos criar um script em bash para criar o projeto React com vite e clonar os snippets dentro do nosso projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando os snippets
&lt;/h2&gt;

&lt;p&gt;Neste artigo, abordaremos os seguintes snippets: &lt;strong&gt;start react project&lt;/strong&gt;, &lt;strong&gt;react project configs&lt;/strong&gt;, &lt;strong&gt;language config&lt;/strong&gt; e &lt;strong&gt;react resets config&lt;/strong&gt;. Cada snippet possui uma função específica, o que é necessário devido à limitação de 10 arquivos por snippet. Essa separação também facilitará a criação do script &lt;code&gt;bash&lt;/code&gt;. A seguir, explico a função de cada um: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;start react project&lt;/strong&gt;: esse é o snippet principal, a ideia dele é que o usuário possa fazer clone nele e executar o script bash;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;react project configs&lt;/strong&gt;: esse arquivos contém os arquivos de configuração geral da aplicação React.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;language config&lt;/strong&gt;: esse snippet contém os arquivos de configuração de internacionalização utilizando a biblioteca react-intl;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;react reset config&lt;/strong&gt;: ao iniciar um projeto React, o vite gera alguns arquivos de exemplo que geralmente acabamos deletando. O objetivo deste snippet é fornecer um projeto “limpo” para evitar esse retrabalho.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h2&gt;
  
  
  React project configs
&lt;/h2&gt;

&lt;p&gt;Os arquivos que estão presentes nesse snippet são os arquivos de configurações do projeto que ficam normalmente na raiz do projeto. São eles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.env.development&lt;/code&gt;: arquivo de variáveis de ambiente para o modo de desenvolvimento;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.env.production&lt;/code&gt;: arquivo de variáveis de ambiente para o modo de produção;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.eslintrc.yml&lt;/code&gt;: arquivo de configuração do ESLint. A nova versão 9 do ESLint tem usado um arquivo &lt;code&gt;.js&lt;/code&gt; para essas configurações, no entanto, nem todas as bibliotecas de linting que nós utilizamos tinha suporte a versão 9, portanto, estamos utilizando a versão 8 que permite usar YAML;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.prettierrc.yml&lt;/code&gt;: arquivo de configuração de formatação do Prettier;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gitlab-ci.yml&lt;/code&gt;: arquivo de configuração de CI/CD do GitLab;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Dockerfile&lt;/code&gt;: arquivo de instruções para gerar uma imagem Docker do projeto React;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nginx/default.conf.template&lt;/code&gt;: arquivo de configuração default para iniciar um servidor NGINX. Estamos utilizando a extensão .template, pois, com ela é possível utilizar variáveis de ambiente. Essa feature foi introduzida na versão 25 do NGINX;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nginx/nginx.conf&lt;/code&gt;: arquivo de configuração do NGINX que inclui as configurações default do &lt;code&gt;nginx/default.conf.template&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tsconfig.app.json&lt;/code&gt;: arquivo de configuração do TypeScript, configurado para habilitar o uso de &lt;em&gt;aliases&lt;/em&gt; dentro da aplicação. O alias que utilizamos é o &lt;code&gt;@&lt;/code&gt; que faz referência ao diretório &lt;code&gt;src&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vite.config.ts&lt;/code&gt;: e por fim, o arquivo de configuração do vite, que além de habilitar e resolver os &lt;em&gt;aliases&lt;/em&gt; na hora de empacotar, ele está configurado para utilizar o import de SVG como componentes utilizando o plugin &lt;code&gt;vite-plugin-svgr&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É importante notar que os arquivos que iniciam com &lt;code&gt;nginx/&lt;/code&gt;quando forem clonados via Git serão adicionados a mesma pasta &lt;code&gt;nginx/&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  React reset config
&lt;/h2&gt;

&lt;p&gt;Como dito anteriormente, quando um projeto React é criado, por padrão, vem bastante código “poluído” de template. Normalmente, umas das primeiras fases do desenvolvimento do projeto é remover esse código template e organizar os arquivos &lt;code&gt;App.tsx&lt;/code&gt; e o &lt;code&gt;main.tsx&lt;/code&gt;. Para isso, utilizamos os seguintes arquivos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;app.tsx&lt;/code&gt;: componente principal da aplicação React;
&lt;/li&gt;
&lt;/ul&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&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="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;main.tsx&lt;/code&gt;: componente que renderiza todo o projeto;
&lt;/li&gt;
&lt;/ul&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;StrictMode&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;react&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;createRoot&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;react-dom/client&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;App&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;./app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createRoot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;StrictMode&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
 &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/StrictMode&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;env.d.ts&lt;/code&gt;: arquivo de configuração de definição das variáveis de ambiente para serem expostas ao &lt;code&gt;import.meta&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;/// &amp;lt;reference types="vite/client" /&amp;gt;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ImportMetaEnv&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;VITE_API_URL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
 &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;VITE_APP_VERSION&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ImportMeta&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ImportMetaEnv&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Language config
&lt;/h2&gt;

&lt;p&gt;Alguns projetos que desenvolvemos possuem como requisito ter dois idiomas: espanhol e português. Dessa forma, para manter um padrão, foi criado um &lt;em&gt;snippet&lt;/em&gt; só com os arquivos necessário para agregar esse requisito nas nossas aplicações. Os arquivos desse &lt;em&gt;snippet&lt;/em&gt; são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;translations/es-PY.json&lt;/code&gt;: arquivo JSON com todas as labels em espanhol;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;translations/pt-BR.json&lt;/code&gt;: arquivo JSON com todas as labels em português;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;utils/lang.ts&lt;/code&gt;: arquivo com a função para pegar o idioma preferido do usuário;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;types/lang.ts&lt;/code&gt;: arquivo contendo os tipos e interfaces necessárias para a aplicação;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;translations/index.tsx&lt;/code&gt;: arquivo que exporta o objeto de messages utilizados pelo provider do &lt;code&gt;react-intl&lt;/code&gt;, contendo as labels em português e espanhol.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hooks/lang.ts&lt;/code&gt;: arquivo que exporta o &lt;em&gt;hook&lt;/em&gt; &lt;code&gt;userUserLanguage&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;app.tsx&lt;/code&gt;: neste caso, o arquivo &lt;code&gt;app.tsx&lt;/code&gt; contém o provider do &lt;code&gt;react-intl&lt;/code&gt; utilizando as messages do arquivo &lt;code&gt;translations/index.tsx&lt;/code&gt;;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No futuro, pretendo criar uma artigo explicando desde o começo como &lt;br&gt;
aplicamos internacionalização nas aplicações React que desenvolvemos.&lt;/p&gt;
&lt;h2&gt;
  
  
  Start react project
&lt;/h2&gt;

&lt;p&gt;E por fim, esse é o principal &lt;em&gt;snippet&lt;/em&gt; desse artigo. Ele contém somente dois arquivos, um &lt;code&gt;README.md&lt;/code&gt;, explicando como utiliza-lo, e o arquivo &lt;code&gt;bash&lt;/code&gt; para criar o projeto React. O script é divido em várias funções, irie apresentar uma por vez neste artigo.&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;#!/bin/bash&lt;/span&gt;
&lt;span class="nv"&gt;initial_branch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;
&lt;span class="nv"&gt;remote_address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nv"&gt;project_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nv"&gt;template&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;

parse_params&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;getopts&lt;/span&gt; &lt;span class="s2"&gt;":b:r:n:t:"&lt;/span&gt; opt&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
        case&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opt&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="k"&gt;in
            &lt;/span&gt;b &lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="nv"&gt;initial_branch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$OPTARG&lt;/span&gt;
                &lt;span class="p"&gt;;;&lt;/span&gt;
            r &lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="nv"&gt;remote_address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$OPTARG&lt;/span&gt;
                &lt;span class="p"&gt;;;&lt;/span&gt;
            n &lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="nv"&gt;project_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$OPTARG&lt;/span&gt;
                &lt;span class="p"&gt;;;&lt;/span&gt;
            t &lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="nv"&gt;template&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$OPTARG&lt;/span&gt;
                &lt;span class="p"&gt;;;&lt;/span&gt;
            &lt;span class="se"&gt;\?&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Invalid option: -&lt;/span&gt;&lt;span class="nv"&gt;$OPTARG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
                &lt;span class="nb"&gt;exit &lt;/span&gt;1
                &lt;span class="p"&gt;;;&lt;/span&gt;
            : &lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Invalid option: -&lt;/span&gt;&lt;span class="nv"&gt;$OPTARG&lt;/span&gt;&lt;span class="s2"&gt; requires an argument."&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
                &lt;span class="nb"&gt;exit &lt;/span&gt;1
                &lt;span class="p"&gt;;;&lt;/span&gt;
        &lt;span class="k"&gt;esac&lt;/span&gt;
    &lt;span class="k"&gt;done
    &lt;/span&gt;&lt;span class="nb"&gt;shift&lt;/span&gt; &lt;span class="k"&gt;$((&lt;/span&gt;OPTIND &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$project_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Error: Project name is required."&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
        &lt;span class="nb"&gt;exit &lt;/span&gt;1
    &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O script aceita 4 parâmetros para ser executado:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;n&lt;/code&gt;: nome do projeto React a ser criado (Obrigatório);&lt;br&gt;
&lt;code&gt;b&lt;/code&gt;: nome da branch inicial (Opcional);&lt;br&gt;
&lt;code&gt;r&lt;/code&gt;: endereço do repositório remoto (Opcional);&lt;br&gt;
&lt;code&gt;t&lt;/code&gt;: template que utilizamos, neste caso, um deles é o &lt;code&gt;i18n&lt;/code&gt;, para sistemas internacionalizados (Opcional);&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;start_vite_project&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Starting Vite project with React TS template..."&lt;/span&gt;

    npm create vite@latest &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$project_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--template&lt;/span&gt; react-ts &lt;span class="nt"&gt;--silent&lt;/span&gt;

    &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$project_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Failed to change directory to &lt;/span&gt;&lt;span class="nv"&gt;$project_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função acima é responsável por inicializar um projeto utilizando a ferramenta vite, passando como nome do projeto, o nome informado como parâmetro. Após isso, é realizado um comando &lt;code&gt;cd&lt;/code&gt; para entrar dentro do diretório do projeto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;install_dependencies&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing dependencies..."&lt;/span&gt;

    npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--silent&lt;/span&gt;
    npm i &lt;span class="nt"&gt;-D&lt;/span&gt; eslint@8.53.0 &lt;span class="nt"&gt;--silent&lt;/span&gt;
    npm i &lt;span class="nt"&gt;-D&lt;/span&gt; prettier &lt;span class="nt"&gt;--silent&lt;/span&gt;
    npm i &lt;span class="nt"&gt;-D&lt;/span&gt; husky &lt;span class="nt"&gt;--silent&lt;/span&gt;
    npm i &lt;span class="nt"&gt;-D&lt;/span&gt; lint-staged &lt;span class="nt"&gt;--silent&lt;/span&gt;
    npm i &lt;span class="nt"&gt;-D&lt;/span&gt; vite-plugin-svgr
    npm i &lt;span class="nt"&gt;-D&lt;/span&gt; @types/node

    npx husky init &lt;span class="nt"&gt;--silent&lt;/span&gt;

    npm i &lt;span class="nt"&gt;-D&lt;/span&gt; @typescript-eslint/eslint-plugin &lt;span class="nt"&gt;--silent&lt;/span&gt;
    npm i &lt;span class="nt"&gt;-D&lt;/span&gt; @typescript-eslint/parser &lt;span class="nt"&gt;--silent&lt;/span&gt;
    npm i &lt;span class="nt"&gt;-D&lt;/span&gt; eslint-config-prettier &lt;span class="nt"&gt;--silent&lt;/span&gt;
    npm i &lt;span class="nt"&gt;-D&lt;/span&gt; eslint-import-resolver-typescript &lt;span class="nt"&gt;--silent&lt;/span&gt;
    npm i &lt;span class="nt"&gt;-D&lt;/span&gt; eslint-plugin-import &lt;span class="nt"&gt;--silent&lt;/span&gt;
    npm i &lt;span class="nt"&gt;-D&lt;/span&gt; eslint-plugin-react &lt;span class="nt"&gt;--silent&lt;/span&gt;
    npm i &lt;span class="nt"&gt;-D&lt;/span&gt; eslint-plugin-react-hooks &lt;span class="nt"&gt;--silent&lt;/span&gt;
    npm i &lt;span class="nt"&gt;-D&lt;/span&gt; eslint-plugin-react-refresh &lt;span class="nt"&gt;--silent&lt;/span&gt;
    npm i &lt;span class="nt"&gt;-D&lt;/span&gt; eslint-plugin-sonarjs &lt;span class="nt"&gt;--silent&lt;/span&gt;
    npm i &lt;span class="nt"&gt;-D&lt;/span&gt; eslint-plugin-unicorn &lt;span class="nt"&gt;--silent&lt;/span&gt;
    npm i &lt;span class="nt"&gt;-D&lt;/span&gt; eslint-plugin-unused-imports &lt;span class="nt"&gt;--silent&lt;/span&gt;
    npm i &lt;span class="nt"&gt;-D&lt;/span&gt; eslint-plugin-prettier@latest &lt;span class="nt"&gt;--silent&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função &lt;code&gt;install_dependencies&lt;/code&gt; instala todas as dependências adicionadas pelo vite as dependências esperadas pelo arquivo de configuração do ESLint e Prettier. Além disso, também é instalado e iniciado o Husky para adicionar rotinas de pré &lt;em&gt;commit&lt;/em&gt; para o projeto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;set_scripts&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Configuring formatting, type checking, and linting scripts..."&lt;/span&gt;

    npm pkg &lt;span class="nb"&gt;set &lt;/span&gt;scripts.lint&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"eslint &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;src/**/*.{ts,tsx}&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; --quiet"&lt;/span&gt;
    npm pkg &lt;span class="nb"&gt;set &lt;/span&gt;scripts.lint:fix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"eslint &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;src/**/*.{ts,tsx}&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; --quiet --fix"&lt;/span&gt;
    npm pkg &lt;span class="nb"&gt;set &lt;/span&gt;scripts.type:check&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"tsc --noEmit"&lt;/span&gt;
    npm pkg &lt;span class="nb"&gt;set &lt;/span&gt;scripts.format&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"prettier --write &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;src/**/*.{ts,tsx}&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    npm pkg &lt;span class="nb"&gt;set &lt;/span&gt;scripts.prepare&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"husky install"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De modo a facilitar o uso do ESLint e do Prettier, criamos alguns scripts para realizar &lt;em&gt;linting&lt;/em&gt; e formatação do código. Além disso, ao refatorar código, nem sempre a IDE mostra todo os erros de tipo no código, portanto, criamos um script para verificar os tipos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;lint&lt;/code&gt;: realiza as verificações de linting baseado na configuração do &lt;code&gt;.eslintrc.yml&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lint:fix&lt;/code&gt;: realiza as verificações e corrige os erros de &lt;em&gt;linting&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;type:check&lt;/code&gt;: executa a verificação de tipos sem gerar o código compilado;
&lt;code&gt;format&lt;/code&gt;: formata todo o código baseado nas configurações definidas em &lt;code&gt;.prettierrc.yml&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;set_lint_stage&lt;span class="o"&gt;(){&lt;/span&gt;
    npm pkg &lt;span class="nb"&gt;set &lt;/span&gt;lint-staged&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{"./src/**/*.{ts,tsx}": ["npm run format", "npm run lint:fix"]}'&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;
    npm pkg &lt;span class="nb"&gt;set &lt;/span&gt;&lt;span class="nv"&gt;husky&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{"hooks": {"pre-commit": "lint-staged"}}'&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;

    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ./.husky/pre-commit
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"npx lint-staged &amp;amp;&amp;amp; npm run type:check"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ./.husky/pre-commit
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa função configura os Git &lt;em&gt;hooks&lt;/em&gt; criados pelo Husky e utilizando o &lt;code&gt;lint-staged&lt;/code&gt;. Neste caso, estamos utilizando somente um &lt;em&gt;hook&lt;/em&gt; que é para ser executado antes de realizar o &lt;em&gt;commit&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;import_default_templates&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Importing default templates..."&lt;/span&gt;  

    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; src/&lt;span class="k"&gt;*&lt;/span&gt;
    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; vite.config.ts
    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; tsconfig.app.json

    git clone https://gitlab.com/snippets/156.git ./src/ &lt;span class="nt"&gt;--quiet&lt;/span&gt;
    git clone https://gitlab.com/snippets/154.git ./temp &lt;span class="nt"&gt;--quiet&lt;/span&gt;

    &lt;span class="nb"&gt;mv&lt;/span&gt; ./temp/nginx &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit
    mv&lt;/span&gt; ./temp/.eslintrc.yml &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit
    mv&lt;/span&gt; ./temp/.prettierrc.yml &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit
    mv&lt;/span&gt; ./temp/.gitlab-ci.yml &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit
    mv&lt;/span&gt; ./temp/.env.development &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit
    mv&lt;/span&gt; ./temp/.env.production &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit
    mv&lt;/span&gt; ./temp/Dockerfile &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit
    mv&lt;/span&gt; ./temp/tsconfig.app.json &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit
    mv&lt;/span&gt; ./temp/vite.config.ts &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit

    rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; eslint.config.js
    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; temp
    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; src/.git
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesta função são importados os templates padrão das aplicações React. Após criar um &lt;em&gt;snippet&lt;/em&gt;, no lado superior direito, há um botão clone que mostra a URL para fazer o &lt;em&gt;clone&lt;/em&gt; do &lt;em&gt;snippet&lt;/em&gt;. Cada &lt;em&gt;snippet&lt;/em&gt; possui um ID sequência e é clonado com base nisso. Os &lt;em&gt;snippets&lt;/em&gt; &lt;strong&gt;react reset config&lt;/strong&gt; e react project config representam os IDs 154 e 156, respectivamente.&lt;/p&gt;

&lt;p&gt;O primeiro passo é remover todo o contéudo do diretório &lt;code&gt;src&lt;/code&gt;, o arquivo de configuração do vite e o do TypeScript. Após isso, são clonados os snippets, um deles dentro do &lt;code&gt;src&lt;/code&gt;(&lt;strong&gt;react reset config&lt;/strong&gt;) e outro dentro de uma pasta temporária &lt;code&gt;temp&lt;/code&gt;. Como não é possível fazer &lt;em&gt;clone&lt;/em&gt; em um diretório com conteúdo, fazemos o &lt;em&gt;clone&lt;/em&gt; em um pasta vazia e depois movemos para seus respectivos lugares. Todos os arquivos do diretório &lt;code&gt;temp&lt;/code&gt; são movidos para a raiz do projeto. Por fim, é excluído a pasta &lt;code&gt;temp&lt;/code&gt; e a pasta &lt;code&gt;.git&lt;/code&gt; criado dentro de &lt;code&gt;src&lt;/code&gt;, criada ao executar o &lt;em&gt;clone&lt;/em&gt; do &lt;em&gt;snippet&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;import_i18n_template&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Importing i18n template..."&lt;/span&gt;

    npm i react-intl &lt;span class="nt"&gt;--quiet&lt;/span&gt;
    npm i react-hook-form &lt;span class="nt"&gt;--quiet&lt;/span&gt;
    npm i jotai &lt;span class="nt"&gt;--quiet&lt;/span&gt;
    npm i flat &lt;span class="nt"&gt;--quiet&lt;/span&gt;

    git clone https://gitlab.com/snippets/155.git ./temp &lt;span class="nt"&gt;--quiet&lt;/span&gt;

    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ./src/app.tsx
    &lt;span class="nb"&gt;mv&lt;/span&gt; ./temp/&lt;span class="k"&gt;*&lt;/span&gt; ./src/ &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit
    rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ./temp
&lt;span class="o"&gt;}&lt;/span&gt;

import_templates&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$template&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"i18n"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;import_i18n_template
    &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso o usuário tenha informado o parâmetro de template, esta função é responsável por importar os templates dentro do projeto. Neste caso, existe somente um template &lt;code&gt;i18n&lt;/code&gt;. Novamente, como não podemos fazer o &lt;em&gt;clone&lt;/em&gt; em um repositório não vazio, é necessário utilizar uma pasta &lt;code&gt;temp&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;start_git_repository&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Initializing Git repository..."&lt;/span&gt;
    git init &lt;span class="nt"&gt;--initial-branch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$initial_branch&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    npm run prepare &lt;span class="nt"&gt;--silent&lt;/span&gt;
    git add &lt;span class="nb"&gt;.&lt;/span&gt;

    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Making initial commit..."&lt;/span&gt;
    git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: initial commit"&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$remote_address&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Adding remote repository..."&lt;/span&gt;
        git remote add origin &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$remote_address&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Pushing initial commit..."&lt;/span&gt;
        git push origin &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$initial_branch&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt; 
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O script &lt;code&gt;bash&lt;/code&gt; também inicializa um repositório Git e inicializando as rotinas de pré-&lt;em&gt;commit&lt;/em&gt; definidas pelo Husky. Além disso, o script também realiza o &lt;em&gt;commit&lt;/em&gt; inicial e, se for informado um repositório remoto, a função irá adiciona-lo como &lt;em&gt;origin&lt;/em&gt; na lista de repositórios remotos e realizar &lt;em&gt;push&lt;/em&gt; para aquele repositório remoto na &lt;em&gt;branch&lt;/em&gt; inicial.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;run&lt;span class="o"&gt;(){&lt;/span&gt;
    parse_params &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    start_vite_project
    install_dependencies
    set_scripts
    set_lint_stage
    import_default_templates

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$template&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;import_templates
    &lt;span class="k"&gt;fi

    &lt;/span&gt;start_git_repository
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Project setup completed successfully!"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

run &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por último, mas não menos importante, a função &lt;code&gt;run&lt;/code&gt; é responsável por chamar todas as funções apresentadas acima na ordem correta. Caso tenha sido informado um template, ela irá importá-lo também. Em Bash, &lt;code&gt;$@&lt;/code&gt; é uma variável especial que representa todos os argumentos passados para um &lt;em&gt;script&lt;/em&gt; ou função, como uma lista separada por espaços. Cada argumento é tratado como uma &lt;code&gt;string&lt;/code&gt; individual.&lt;/p&gt;

&lt;h2&gt;
  
  
  Executando o &lt;em&gt;script&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Antes de executar o &lt;em&gt;script&lt;/em&gt;, é necessário dar permissão para executa-lo. Para usuários de Linux, basta executar o seguinte 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;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x start-react-project.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após torna-lo executável, rode o seguinte 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;./start-react-project.sh &lt;span class="nt"&gt;-n&lt;/span&gt; &amp;lt;NOME_DO_PROJETO&amp;gt; &lt;span class="nt"&gt;-b&lt;/span&gt; &amp;lt;BRANCH_INICIAL&amp;gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &amp;lt;REPO_REMOTO&amp;gt; &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;TEMPLATE&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A execução do &lt;em&gt;script&lt;/em&gt; pode demorar alguns segundos até instalar todas as bibliotecas e fazer &lt;em&gt;clones&lt;/em&gt; de todos os &lt;em&gt;snippets&lt;/em&gt;. Neste artigo, irie considerar o template &lt;code&gt;i18n&lt;/code&gt;. A estrutura do projeto será a seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./
├── nginx/
│   ├── default.conf.template
│   └── nginx.conf
├── node_modules/  
├── public/
│   └── vite.svg
├── src/
│   ├── hooks/
│   │   └── lang.ts
│   ├── translations/
│   │   ├── es-PY.json
│   │   ├── index.ts
│   │   └── pt-BR.json
│   ├── types/
│   │   └── lang.ts
│   ├── utils/
│   │   └── lang.ts
│   ├── app.tsx
│   ├── env.d.ts
│   ├── main.tsx
│   └── vite-env.d.ts
├── Dockerfile
├── README.md
├── index.html
├── package-lock.json
├── package.json
├── tsconfig.app.json
├── tsconfig.json
├── tsconfig.node.json
└── vite.config.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Neste artigo busquei mostrar um pouco de como, utilizando uma ferramenta simples, é possível criar automações para facilitar no desenvolvimento de aplicações. Espero que tenham gostado desse artigo, este é o meu primeiro artigo aqui no &lt;strong&gt;dev.to&lt;/strong&gt;, espero que seja o primeiro de muitos. Muito obrigado pela atenção!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>gitlab</category>
      <category>cicd</category>
      <category>react</category>
    </item>
  </channel>
</rss>
