<?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: Gustavo Caetano</title>
    <description>The latest articles on DEV Community by Gustavo Caetano (@gustavoacaetano).</description>
    <link>https://dev.to/gustavoacaetano</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%2F1581138%2Feec480e4-9280-40bf-80e7-26d2f8dd610f.jpg</url>
      <title>DEV Community: Gustavo Caetano</title>
      <link>https://dev.to/gustavoacaetano</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gustavoacaetano"/>
    <language>en</language>
    <item>
      <title>Publish Vue components library/npm</title>
      <dc:creator>Gustavo Caetano</dc:creator>
      <pubDate>Thu, 22 Aug 2024 19:42:45 +0000</pubDate>
      <link>https://dev.to/gustavoacaetano/publish-vue-components-librarynpm-3pml</link>
      <guid>https://dev.to/gustavoacaetano/publish-vue-components-librarynpm-3pml</guid>
      <description>&lt;p&gt;This tutorial contains knowledge from: &lt;a href="https://blog.egmond.dev/vue-component-to-npm-package" rel="noopener noreferrer"&gt;Link to the blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The differences between these are corrections of possible errors and more informations about customization of the lib package.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start Vue+Vite Template
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;npm create vite@latest&lt;/code&gt; on the terminal, the following message will be displayed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Need to install the following packages:
create-vite@5.5.2
Ok to proceed? (y) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Answer with &lt;code&gt;y&lt;/code&gt;, the configuration of your project will start:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; npx
&amp;gt; create-vite

? Project name: 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Write your &lt;code&gt;Project Name&lt;/code&gt;, then select Vue and Typescript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Select a framework: Vue
Select a variant: TypeScript
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If using Typescript, use the following command &lt;code&gt;npm i --save-dev @types/node&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Library mode
&lt;/h2&gt;

&lt;p&gt;To publish your library, let's use the library mode.&lt;br&gt;
Change your &lt;code&gt;vite.config.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { resolve } from 'path'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  build: {
    lib: {
      entry: resolve(__dirname, 'lib/main.ts'),
      name: 'InsertYourLibName', // Change this lib name, ex: 'MyLib'
      // the proper extensions will be added
      fileName: 'InsertFileName' // Change your file name, ex: 'my-lib'
    },
    rollupOptions: {
      // make sure to externalize deps that shouldn't be bundled
      // into your library
      external: ['vue'],
      output: {
        // Provide global variables to use in the UMD build
        // for externalized deps
        globals: {
          vue: 'Vue'
        }
      }
    }
  }
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create your components
&lt;/h2&gt;

&lt;p&gt;First, create a &lt;code&gt;lib&lt;/code&gt; folder.&lt;br&gt;
This folder will contain all of your components and a file &lt;code&gt;main.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Component1 from './Component1.vue'
import Component2 from './Component2.vue'
...

export { Component1, Component2, ... }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Import and export all the desired components.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build component
&lt;/h2&gt;

&lt;p&gt;Change the file &lt;code&gt;package.json&lt;/code&gt; to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "name": "insert-the-lib-name", // Insert the lib name here
  "version": "1.0.0", // Remember to use the version to control
  "type": "module",
  "files": ["dist"],
  "main": "./dist/insert-the-lib-name.umd.cjs", // Insert the lib name here
  "module": "./dist/insert-the-lib-name.js", // lib name here
  "types": "./dist/main.d.ts", 
  "exports": {
    ".": {
      "import": "./dist/insert-the-lib-name.js", // lib name here
      "require": "./dist/insert-the-lib-name.umd.cjs", // lib name here
      "types": "./dist/main.d.ts"
    },
    "./style.css": "./dist/style.css" 
  },
  "scripts": {
    "dev": "vite",
    "build": "vite build &amp;amp;&amp;amp; vue-tsc --emitDeclarationOnly", 
    "preview": "vite preview"
  },
  "dependencies": {
    "vue": "^3.2.37"
  },
  "devDependencies": {
    "@types/node": "^18.7.18",
    "@vitejs/plugin-vue": "^3.1.0",
    "typescript": "^4.6.4",
    "vite": "^3.1.0",
    "vue-tsc": "^0.40.4"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After, change the &lt;code&gt;tsconfig.json&lt;/code&gt; (if the file doens't exist, create it):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "compilerOptions": {
    "target": "ESNext",
    "useDefineForClassFields": true,
    "module": "ESNext",
    "moduleResolution": "Node",
    "strict": true,
    "jsx": "preserve",
    "sourceMap": true,
    "allowSyntheticDefaultImports": true,
    "resolveJsonModule": true,
    "isolatedModules": true,
    "esModuleInterop": true,
    "lib": ["ESNext", "DOM"],
    "skipLibCheck": true,
    "outDir": "dist",
    "declaration": true
  },
  "include": ["lib/**/*.ts", "lib/**/*.d.ts", "lib/**/*.tsx", "lib/**/*.vue"],
  "references": [{ "path": "./tsconfig.node.json" }],
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, update the &lt;code&gt;tsconfig.node.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "compilerOptions": {
    "target": "ES2022",
    "lib": ["ES2023"],
    "module": "ESNext",
    "skipLibCheck": true,
    "composite": true,

    /* Bundler mode */
    "moduleResolution": "bundler",
    "isolatedModules": true,
    "moduleDetection": "force",

    /* Linting */
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noFallthroughCasesInSwitch": true
  },
  "include": ["vite.config.ts"]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To customize your npm Readme, change your &lt;code&gt;README.md&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;npm install&lt;/code&gt; again and to build the component run &lt;code&gt;npm run build&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Publish
&lt;/h2&gt;

&lt;p&gt;Remember to always update the version on &lt;code&gt;package.json&lt;/code&gt;.&lt;br&gt;
Check about semantic versioning here: &lt;a href="https://docs.npmjs.com/about-semantic-versioning" rel="noopener noreferrer"&gt;Link to docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Remember to always run &lt;code&gt;npm run build&lt;/code&gt; before publishing.&lt;/p&gt;

&lt;p&gt;To publish, enter your npm account. If you don't have one, create it.&lt;br&gt;
Run &lt;code&gt;npm adduser&lt;/code&gt; and follow the instructions to login.&lt;/p&gt;

&lt;p&gt;Finally, to publish your lib, run &lt;code&gt;npm publish&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Go to your account on npm and check on &lt;code&gt;Packages&lt;/code&gt; if you have successfully published your package.&lt;/p&gt;

</description>
      <category>ledscommunity</category>
      <category>npm</category>
      <category>vue</category>
      <category>webcomponents</category>
    </item>
    <item>
      <title>Tutorial de utilização Storybook</title>
      <dc:creator>Gustavo Caetano</dc:creator>
      <pubDate>Fri, 16 Aug 2024 18:17:17 +0000</pubDate>
      <link>https://dev.to/gustavoacaetano/tutorial-de-utilizacao-storybook-3odb</link>
      <guid>https://dev.to/gustavoacaetano/tutorial-de-utilizacao-storybook-3odb</guid>
      <description>&lt;p&gt;Este é um tutorial de utilização. Para o tutorial de instalação, veja: &lt;a href="https://dev.to/gustavoacaetano/tutorial-de-instalacao-do-storybook-com-tailwind-324l"&gt;https://dev.to/gustavoacaetano/tutorial-de-instalacao-do-storybook-com-tailwind-324l&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Iniciar Storybook
&lt;/h2&gt;

&lt;p&gt;Para iniciar o Storybook, execute o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run storybook
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Estrutura de arquivos
&lt;/h2&gt;

&lt;p&gt;Após a instalação, os arquivos ficarão dentro da pasta &lt;code&gt;src/stories&lt;/code&gt;:&lt;/p&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%2F632b3564om4psvn0mj90.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%2F632b3564om4psvn0mj90.png" alt="Imagem de exemplo da estrutura de arquivos inicial" width="225" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Junto com os arquivos, terá uma pasta &lt;code&gt;assets&lt;/code&gt; com todas as imagens utilizadas no arquivo &lt;code&gt;Configure.mdx&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para melhor organização, recomendo uma estrutura de:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stories/
├─ Bases/
|  ├─ ComponenteBase/
│  |  ├─ ComponenteBase.vue
│  |  ├─ ComponenteBase.stories.ts
│  |  ├─ ComponenteBase.css
├─ Complexos/
|  ├─ ComponenteComplexo/
│  |  ├─ ComponenteComplexo.vue
│  |  ├─ ComponenteComplexo.stories.ts
│  |  ├─ ComponenteComplexo.css
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fskvd9uj1quy24gd699oe.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%2Fskvd9uj1quy24gd699oe.png" alt="Imagem de exemplo da estrutura de arquivos recomendada por Gustavo Caetano" width="215" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Porém, sinta-se livre para utilizar da forma que melhor se encaixa no seu projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Arquivo de documentação (.mdx)
&lt;/h2&gt;

&lt;p&gt;O arquivo &lt;code&gt;Configure.mdx&lt;/code&gt; contém informações sobre o Storybook. Se deseja criar um arquivo semelhante para documentação, substitua o arquivo &lt;code&gt;Configure.mdx&lt;/code&gt; por um arquivo &lt;code&gt;NomeDoArquivo.mdx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Meta } from "@storybook/blocks";

&amp;lt;Meta title="Título na sidebar" /&amp;gt;

&amp;lt;div className="sb-container"&amp;gt;
  &amp;lt;div className='sb-section-title'&amp;gt;
    # Titulo da página

    Esse Storybook contém os componentes utilizados no projeto NomeDoProjeto.
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;style&amp;gt;
  {`
  .sb-container {
    margin-bottom: 48px;
  }

  .sb-section-title {
    margin-bottom: 32px;
  }
  `}
&amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após, personalize o arquivo da forma que preferir.&lt;/p&gt;

&lt;p&gt;Se estiver vendo este erro:&lt;/p&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%2Fuxxnzflyfon7nhag024q.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%2Fuxxnzflyfon7nhag024q.png" alt="Imagem de erro quando a página não existe" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clique na opção com o novo título na sidebar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sidebar do Storybook
&lt;/h2&gt;

&lt;p&gt;A estrutura dos arquivos, por enquanto, impactará somente na forma de trabalhar na IDE. Para modificar a sidebar do Storybook existem diferentes formas.&lt;/p&gt;

&lt;p&gt;Inicialmente, sua sidebar estará parecida com esta imagem:&lt;/p&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%2Fhzcky64f12gbv41h1og8.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%2Fhzcky64f12gbv41h1og8.png" alt="Imagem da sidebar" width="285" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dentro do arquivo &lt;code&gt;Componente.storie.ts&lt;/code&gt;, pode-se alterar a estrutura da sidebar através do &lt;code&gt;title&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
const meta = {
  title: 'Pasta1/Pasta2/Componente',
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const meta = {
  title: 'Componentes/Complexos/Header',
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Forfe6s1lcvwe3sj440c8.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%2Forfe6s1lcvwe3sj440c8.png" alt="Imagem exemplo de sidebar" width="287" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para diferentes formas de alteração, veja o vídeo do canal da Chromatic:&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=zrdcCSTGo4A" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=zrdcCSTGo4A&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Desenvolvimento com Storybook
&lt;/h2&gt;

&lt;p&gt;O objetivo do desenvolvimento com o Storybook é isolar componentes e trabalhar de forma individualizada para reuso.&lt;/p&gt;

&lt;p&gt;Quando estiver desenvolvendo, o arquivo &lt;code&gt;Componente.vue&lt;/code&gt; deve ser o componente do seu trabalho. O Storybook servirá para testar seu componente através do &lt;code&gt;Componente.stories.ts&lt;/code&gt;.&lt;/p&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%2Fech16aya389sz78emjos.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%2Fech16aya389sz78emjos.png" alt="Imagem de exemplo dos arquivos na pasta" width="208" height="66"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse arquivo será composto da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// IMPORTACOES
import type { Meta, StoryObj } from '@storybook/vue3';
import { fn } from '@storybook/test';
import Componente from './Componente.vue';

// METADATA PARA CONSTRUCAO DO COMPONENTE
const meta = {
  title: 'Componentes/Bases/Componente',
  component: Componente,
  tags: ['autodocs'],
  argTypes: {
    argumento: tipo,
    ...
  },
  args: {
    argumento: valor,
    ...
    // Para os eventos, adicione o fn() para monitorar
    // e apresentar o evento na aba 'Actions'
    onEventoComponente: fn()
  },
} satisfies Meta&amp;lt;typeof Componente&amp;gt;;
export default meta;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E no final do arquivo, ficarão os Stories, que são casos de uso do componente.&lt;br&gt;
Utilize os argumentos do componente para criar os diferentes casos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// CASOS DE USO
type Story = StoryObj&amp;lt;typeof meta&amp;gt;;
export const FirstStory: Story = {
  args: {
    argumento: valor,
    ...
  },
};

export const SecondStory: Story = {
  args: {
    argumento: valor,
    ...
  },
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para cada Story, pode-se acompanhar no Storybook o visual e relacionados de cada componente.&lt;/p&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%2Fuxg8c6drn6bmprvuvapn.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%2Fuxg8c6drn6bmprvuvapn.png" alt="Imagem da Sidebar do Storybook" width="290" height="172"&gt;&lt;/a&gt;&lt;/p&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%2F1okoyta674t33tpfq0nk.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%2F1okoyta674t33tpfq0nk.png" alt="Imagem de um Story" width="641" height="388"&gt;&lt;/a&gt;&lt;/p&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%2Fnlgml0dp8z0r8o1cjkr2.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%2Fnlgml0dp8z0r8o1cjkr2.png" alt="Imagem de outro Story" width="653" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Os controles ajudam a realizar ajustes nos casos de uso por meio da interface. Essas mudanças podem ser salvas no código posteriormente:&lt;/p&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%2F89i14im5yj5yjkmukdtq.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%2F89i14im5yj5yjkmukdtq.png" alt="Imagem dos controles" width="800" height="242"&gt;&lt;/a&gt;&lt;/p&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%2F79f0sui53kt4kptxdory.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%2F79f0sui53kt4kptxdory.png" alt="Imagem de exemplo de salvar por meio da interface" width="800" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Utilize o &lt;code&gt;fn()&lt;/code&gt; no código dos eventos do componente para acompanhar se os eventos estão sendo disparados na aba &lt;code&gt;Actions&lt;/code&gt;:&lt;/p&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%2F8fvd6m3w6k8902nxro36.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%2F8fvd6m3w6k8902nxro36.png" alt="Imagem das actions" width="446" height="92"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Expanda a &lt;code&gt;Action&lt;/code&gt; para visualizar os parâmetros, isso será útil para ações específicas que podem aparecer em certos componentes:&lt;/p&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%2Fbwpfzczik2e4hk24cntw.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%2Fbwpfzczik2e4hk24cntw.png" alt="Imagem da action expandida" width="438" height="90"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentação de componentes
&lt;/h2&gt;

&lt;p&gt;A documentação dos componentes também é feita por arquivos &lt;code&gt;.mdx&lt;/code&gt;.&lt;/p&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%2Fjk0r8i26kr5ef6ecd4it.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%2Fjk0r8i26kr5ef6ecd4it.png" alt="Imagem da estrutura de arquivos com mdx" width="230" height="83"&gt;&lt;/a&gt;&lt;/p&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%2Fezewhi7s2f6b1aawl6wu.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%2Fezewhi7s2f6b1aawl6wu.png" alt="Imagem do Storybook com a doc de componente" width="289" height="143"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Arquivo &lt;code&gt;Componente.mdx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Meta, Story, Canvas } from '@storybook/blocks';
import * as ComponenteStories from './Componente.stories';

&amp;lt;Meta title="Componente" of={ComponenteStories} /&amp;gt;

# Componente
Teste `MDX` para documentar o componente `Componente`. Para mais sobre a documentação de componentes: &amp;lt;br/&amp;gt;
https://storybook.js.org/addons/@storybook/addon-docs

&amp;lt;Canvas&amp;gt;
  &amp;lt;Story of={ComponenteStories} /&amp;gt;
&amp;lt;/Canvas&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Mais informações
&lt;/h2&gt;

&lt;p&gt;Para mais informações e detalhes gerais, consulte a documentação oficial do Storybook:&lt;br&gt;
&lt;a href="https://storybook.js.org/docs" rel="noopener noreferrer"&gt;https://storybook.js.org/docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Veja também o canal da Chromatic no YouTube:&lt;br&gt;
&lt;a href="https://www.youtube.com/@chromaticui" rel="noopener noreferrer"&gt;https://www.youtube.com/@chromaticui&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ledscommunity</category>
      <category>storybook</category>
    </item>
    <item>
      <title>Tutorial de instalação do Storybook com Tailwind</title>
      <dc:creator>Gustavo Caetano</dc:creator>
      <pubDate>Wed, 19 Jun 2024 00:10:31 +0000</pubDate>
      <link>https://dev.to/gustavoacaetano/tutorial-de-instalacao-do-storybook-com-tailwind-324l</link>
      <guid>https://dev.to/gustavoacaetano/tutorial-de-instalacao-do-storybook-com-tailwind-324l</guid>
      <description>&lt;h2&gt;
  
  
  Instalação Storybook
&lt;/h2&gt;

&lt;p&gt;Na pasta do seu projeto, execute o comando no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx storybook@latest init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você deverá ver o seguinte texto no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Need to install the following packages:
storybook@8.1.10
Ok to proceed? (y)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Responda com &lt;code&gt;y&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O Storybook deve detectar se o seu projeto utiliza &lt;code&gt;Vite&lt;/code&gt; ou &lt;code&gt;Webpack&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Adding Storybook support to your "Vue 3" app 
• Detected Vite project. 
Setting builder to Vite.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se isso não acontecer, selecione a ferramenta utilizada no seu projeto nas opções que aparecerão no terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalação Tailwind
&lt;/h2&gt;

&lt;p&gt;Na pasta do projeto, instale o tailwind e outras dependências:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -D tailwindcss@latest postcss@latest autoprefixer@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Utilize o seguinte comando para gerar os arquivos &lt;code&gt;tailwind.config.js&lt;/code&gt; e &lt;code&gt;postcss.config.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx tailwindcss init -p
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Arquivo &lt;code&gt;tailwind.config.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default {
  content: [],
  theme: {
    extend: {},
  },
  plugins: [],
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Altere o arquivo na segunda linha para:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OBS: Certifique-se de que o caminho &lt;code&gt;'./src/**/*.{vue,js,ts,jsx,tsx}'&lt;/code&gt; esteja de acordo com a sua estrutura de arquivos!&lt;/p&gt;

&lt;p&gt;Arquivo &lt;code&gt;postcss.config.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default {
  plugins: {
    tailwindcss: {},
    autoprefixer: {},
  },
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crie o arquivo &lt;code&gt;./src/index.css&lt;/code&gt; e inclua o Tailwind &lt;code&gt;base&lt;/code&gt;, &lt;code&gt;components&lt;/code&gt; e &lt;code&gt;utilities&lt;/code&gt; styles&lt;br&gt;
Arquivo &lt;code&gt;./src/index.css&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@tailwind base;
@tailwind components;
@tailwind utilities;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, importe o &lt;code&gt;./src/index.css&lt;/code&gt; no &lt;code&gt;./src/main.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import './index.css'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integrando Tailwind e Storybook
&lt;/h2&gt;

&lt;p&gt;Se estiver usando Webpack, execute o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx storybook@latest add @storybook/addon-styling-webpack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para todos os casos (Vite ou Webpack), vá ao arquivo &lt;code&gt;./storybook/preview.js&lt;/code&gt; e adicione:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import '../src/index.css';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E, assim, seus stories estarão integrados com o Tailwind!&lt;/p&gt;

</description>
      <category>storybook</category>
      <category>ledscommunity</category>
      <category>tailwindcss</category>
    </item>
    <item>
      <title>Fixtures do Cypress para testes</title>
      <dc:creator>Gustavo Caetano</dc:creator>
      <pubDate>Fri, 07 Jun 2024 16:58:53 +0000</pubDate>
      <link>https://dev.to/gustavoacaetano/fixtures-do-cypress-para-testes-1748</link>
      <guid>https://dev.to/gustavoacaetano/fixtures-do-cypress-para-testes-1748</guid>
      <description>&lt;h2&gt;
  
  
  Conhecimentos prévios
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cypress, Cucumber, BDD
&lt;/h3&gt;

&lt;p&gt;Veja a aplicação no Slave One: &lt;br&gt;
&lt;a href="https://dev.to/marcela_lage_094e814c6a4e/documentacao-dos-testes-do-sistema-slave-one-2kmb"&gt;https://dev.to/marcela_lage_094e814c6a4e/documentacao-dos-testes-do-sistema-slave-one-2kmb&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Fixtures
&lt;/h3&gt;

&lt;p&gt;As fixtures do Cypress são dados estáticos que podem ser utilizados pelos testes. O arquivo é em formato JSON.&lt;/p&gt;

&lt;h3&gt;
  
  
  Intercept
&lt;/h3&gt;

&lt;p&gt;O intercept é um comando do Cypress que pode ser usado para capturar, vigiar ou modificar uma requisição.&lt;br&gt;
&lt;a href="https://docs.cypress.io/api/commands/intercept"&gt;Link da documentação&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Testes com os dados da fixture
&lt;/h2&gt;

&lt;p&gt;Inicialmente, deve-se criar os arquivos de fixture que terão os dados utilizados na página. &lt;/p&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%2F58pu9377p1jyepu1w3aa.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%2F58pu9377p1jyepu1w3aa.png" alt="Estrutura das pastas" width="216" height="85"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A estrutura do JSON deve ser a mesma da resposta da requisição.&lt;/p&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%2Fc9zv99vx5b0xi8cdcime.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%2Fc9zv99vx5b0xi8cdcime.png" alt="Exemplo arquivo JSON da fixture com os valores de name e id de cada objeto que aparecerá na aplicação" width="436" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para encontrar qual requisição interceptar, execute seu teste Cypress e observe-se no passo a passo qual requisição retorna os dados que pretende substituir. &lt;/p&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%2Fa4pxfm2l17ze8spwpzgp.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%2Fa4pxfm2l17ze8spwpzgp.png" alt="Exemplo de requisição no Cypress" width="332" height="169"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após, deve-se capturar e alterar a resposta usando o intercept:&lt;/p&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%2Fx3lyt8kgykbdowy6r9mt.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%2Fx3lyt8kgykbdowy6r9mt.png" alt="Código de intercept passando primeiro o parâmetro da requisição e depois a fixture que será usada" width="603" height="91"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;intercept&lt;/code&gt; trocará a resposta da requisição &lt;code&gt;https://localhost:3000/api/Function&lt;/code&gt; pela fixture do arquivo &lt;code&gt;Function&lt;/code&gt; e o comando &lt;code&gt;as&lt;/code&gt; permitirá que o Cypress acesse essa ação pelo &lt;code&gt;wait&lt;/code&gt; para esperar que a mudança aconteça. &lt;/p&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%2Fmj8rr0ak67agvq4z3a0k.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%2Fmj8rr0ak67agvq4z3a0k.png" alt="Resultado da mudança" width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OBS: o intercept deve ser usado antes da requisição acontecer e o wait deve ser utilizado após. No exemplo, o clique de &lt;code&gt;elements.functionPageBtn().click()&lt;/code&gt; precede a requisição.&lt;/p&gt;

&lt;p&gt;Dessa forma, os dados das fixtures estarão sendo utilizados para aplicação. Para que funcione sem nenhum dado, utilize o intercept em todas as requisições, mesmo aquelas que não retornam dados para apresentar na tela.&lt;/p&gt;

&lt;p&gt;Exemplos:&lt;/p&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%2F6hj1q3wzlzohulf4jmzm.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%2F6hj1q3wzlzohulf4jmzm.png" alt="Código após fazer um delete" width="663" height="138"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nessa função, são feitas duas interceptações. A primeira, retorna um JSON vazio para que a página entenda que a ação de deletar foi concluída com sucesso.&lt;br&gt;
FunctionDeleteComplete.json&lt;/p&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%2F2al461tzw44xhqaa6bmx.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%2F2al461tzw44xhqaa6bmx.png" alt="Arquivo json vazio" width="85" height="57"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FunctionAfterDelete.json&lt;/p&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%2F1kghe3cqyrapkyuzip6v.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%2F1kghe3cqyrapkyuzip6v.png" alt="Arquivo com as informações, sem o cadastro que supostamente foi deletado" width="339" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Resultado final:&lt;/p&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%2Fotdy8841xb6xeondk1s1.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%2Fotdy8841xb6xeondk1s1.png" alt="Resultado final das ações" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ledscommunity</category>
      <category>cypress</category>
      <category>fixtures</category>
    </item>
  </channel>
</rss>
