<?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: Genilson fernandes</title>
    <description>The latest articles on Forem by Genilson fernandes (@geniilsonfernandes).</description>
    <link>https://forem.com/geniilsonfernandes</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%2F970202%2Fceb3e992-4ba0-4c24-8832-96ddf13115fe.png</url>
      <title>Forem: Genilson fernandes</title>
      <link>https://forem.com/geniilsonfernandes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/geniilsonfernandes"/>
    <language>en</language>
    <item>
      <title>Trabalhando e otimizando testes com mocks de componentes</title>
      <dc:creator>Genilson fernandes</dc:creator>
      <pubDate>Fri, 22 Mar 2024 03:59:53 +0000</pubDate>
      <link>https://forem.com/geniilsonfernandes/trabalhando-e-otimizando-t-testes-com-mocks-de-componentes-1ckm</link>
      <guid>https://forem.com/geniilsonfernandes/trabalhando-e-otimizando-t-testes-com-mocks-de-componentes-1ckm</guid>
      <description>&lt;p&gt;Usar mock nos testes unitários é uma mão na roda quando se trata de otimizar os testes e até mesmo o desenvolvimento deles.&lt;/p&gt;

&lt;p&gt;Como dito, quando falamos em mock, nada mais é do que criar uma implementação simbólica de uma função, hook, componente, seja como for. Esse será o ponto de partida. Claro que vale a pena verificar o que vale ou não a pena criar um mock, correto?&lt;/p&gt;

&lt;p&gt;Primeiramente, vou ta explicando como funciona um mock de um componente, isso já vai valer para muita coisa, trago no próximo exemplo alguns métodos mais avançados, como &lt;code&gt;mockImplementation&lt;/code&gt;, &lt;code&gt;mockImplementationOnce&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Vamos lá, no react as vezes trabalhamos com muito componentes e às vezes eles já foram testado. Então, fica redundante durante um teste a gente tá chamando ele novamente, isso vai acontece muito se você usa composition pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import MenuButton from '../ui/MenuButton';

// ... Componente que usa o MenuButton
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui estamos importando esse &lt;code&gt;MenuButton&lt;/code&gt; no menu, e sem seguida iremos testar no caso atual. Esse meu menu tem sua implantação interna e como agora iremos testar somente a ação de está sendo renderizado com as props recebidas, vamos mocar a importação do componente &lt;code&gt;MenuButton&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;vi.mock('MenuButton', () =&amp;gt; ({
  MenuButton: () =&amp;gt; &amp;lt;div data-testid="menuButton"&amp;gt;menuButton&amp;lt;/div&amp;gt;
}));

describe('Menu render', () =&amp;gt; {
// ... teste
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim fica o mock desse componente, veja que no primeiro argumento passamos o path e o segundo o que iria retornar, no caso, uma função que retorna um jsx. Então, agora na hora que o teste estiver sendo executado na DOM o que vai aparecer sera no Mock.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
// SEM MOCK
 ✓ src/components/Menu/Menu.test.tsx (1)
   ✓ Menu render (1)
     ✓ should render correctly

 Test Files  1 passed (1)
      Tests  1 passed (1
   Duration  725ms

// COM MOCK

 ✓ src/components/Menu/Menu.test.tsx (1)
   ✓ Menu render (1)
     ✓ should render correctly

 Test Files  1 passed (1)
      Tests  1 passed (1)
    Duration  523ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como pode ver, um componente relativamente simples mas com um mock tivemos um ganho de tempo e performance &lt;/p&gt;

&lt;p&gt;e isso, por hoje.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>vitest</category>
      <category>e2e</category>
      <category>programming</category>
    </item>
    <item>
      <title>Como testar hooks com vitest</title>
      <dc:creator>Genilson fernandes</dc:creator>
      <pubDate>Fri, 15 Mar 2024 17:47:41 +0000</pubDate>
      <link>https://forem.com/geniilsonfernandes/como-testar-hooks-com-vitest-3149</link>
      <guid>https://forem.com/geniilsonfernandes/como-testar-hooks-com-vitest-3149</guid>
      <description>&lt;p&gt;O uso de hooks no React é uma prática valiosa para abstrair partes do nosso código, seja para realizar chamadas a APIs, lidar com cálculos complexos ou outras tarefas. entre tanto os hooks sejam extremamente úteis, é importante garantir que funcionem corretamente, especialmente em um ambiente controlado onde podemos definir a entrada e controlar a saída.&lt;/p&gt;

&lt;p&gt;Abaixo criei um hook super simples que gerencia um estado de uma lista, algo comum no dia a dia como deve, nesse exemplo, vou mostrar a implementação e como testar, e as partes que estão sendo testadas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uselist.netlify.app/"&gt;aqui o exemplo de uso &lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Esse aqui é o hook
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useState } from 'react';

const useList = &amp;lt;T&amp;gt;(initialList: T[]) =&amp;gt; {
  const [list, setList] = useState&amp;lt;T[]&amp;gt;(initialList);

  const onToggle = (id: T) =&amp;gt; {
    if (list.includes(id)) {
      setList(list.filter((item) =&amp;gt; item !== id));
    } else {
      setList([...list, id]);
    }
  };

  const onSelectAll = (ids: T[]) =&amp;gt; {
    setList(ids);
  };

  const isSelected = (id: T) =&amp;gt; {
    return list.includes(id);
  };

  const onClear = () =&amp;gt; {
    setList([]);
  };

  return { list, onToggle, onSelectAll, onClear, isSelected };
};

export default useList;

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

&lt;/div&gt;



&lt;p&gt;Como pode ver, ele retorna uma lista de ids em um array, e tem os métodos para controlar a lista: onSelectAll, isSelected, onClear e list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Assim fica a chamada do hook
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const { 
list,
onSelectAll,
onClear,
onToggle } = useList&amp;lt;number&amp;gt;([1, 2]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Mas vamos os testes….
&lt;/h2&gt;

&lt;p&gt;Primeiro de tudo, não vou ensinar como configura o ambiente de teste, não é difícil de fazer, com o vitest é quase automático.&lt;/p&gt;

&lt;p&gt;Detalhes, antes de começar, o testing-library oferece dois métodos para gente testar hooks: &lt;strong&gt;act&lt;/strong&gt;, &lt;strong&gt;renderHook&lt;/strong&gt;, sendo o &lt;strong&gt;ACT,&lt;/strong&gt; para lidar com atualizações de estado que causa efeito colaterais e o &lt;strong&gt;renderHook&lt;/strong&gt;, como nome já diz, ele renderizar nosso hook em diferentes situações&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;it('should initialize with provided initial list', () =&amp;gt; {
    const initialList = [1, 2, 3];
    const { result } = renderHook(() =&amp;gt; useList&amp;lt;number&amp;gt;(initialList));
    expect(result.current.list).toEqual(initialList);
  });

  it('should toggle items in the list', () =&amp;gt; {
    const { result } = renderHook(() =&amp;gt; useList&amp;lt;number&amp;gt;([1, 2, 3]));
    act(() =&amp;gt; {
      result.current.onToggle(2);
    });
    expect(result.current.list).toEqual([1, 3]);
    act(() =&amp;gt; {
      result.current.onToggle(4);
    });
    expect(result.current.list).toEqual([1, 3, 4]);
  });

  it('should toggle all items in the list', () =&amp;gt; {
    const { result } = renderHook(() =&amp;gt; useList&amp;lt;number&amp;gt;([1, 2, 3]));
    act(() =&amp;gt; {
      result.current.onSelectAll([1, 2, 3, 4]);
    });
    expect(result.current.list).toEqual([1, 2, 3, 4]);
    act(() =&amp;gt; {
      result.current.onClear();
    });
    expect(result.current.list).toEqual([]);
  });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como gosto de fazer, é que o teste seja autoexplicativo, trazendo consistência, seja para mim ou para quem vai ver o código e fazer modificações.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No primeiro caso, estamos testando se o hook foi iniciado corretamente, sem novidades até aqui.&lt;/li&gt;
&lt;li&gt;No segundo caso, vamos iniciar o hook com uma lista de 3 itens e, em seguida, desmarcar o item 2. Como pode ser visto, essas ações que vão afetar o estado estão envoltas em um &lt;strong&gt;&lt;code&gt;act&lt;/code&gt;&lt;/strong&gt;, e em seguida o &lt;strong&gt;&lt;code&gt;expect&lt;/code&gt;&lt;/strong&gt;, que nesse caso, esperamos uma lista sem o id 2.&lt;/li&gt;
&lt;li&gt;No terceiro caso, vamos marcar todos os itens e em seguida testar o terceiro método junto, que é o &lt;strong&gt;&lt;code&gt;onClear&lt;/code&gt;&lt;/strong&gt;. Como pode ser visto, esperamos um array vazio.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; it('should check if an item is selected', () =&amp;gt; {
    const { result } = renderHook(() =&amp;gt; useList&amp;lt;number&amp;gt;([1, 2, 3]));
    expect(result.current.isSelected(2)).toBe(true);
    expect(result.current.isSelected(4)).toBe(false);
  });

  it('should clear the list', () =&amp;gt; {
    const { result } = renderHook(() =&amp;gt; useList([1, 2, 3]));
    act(() =&amp;gt; {
      result.current.onClear();
    });
    expect(result.current.list).toEqual([]);
  });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É comum acabarmos testando algo duas vezes, e neste caso, o &lt;strong&gt;&lt;code&gt;onClear&lt;/code&gt;&lt;/strong&gt; já tinha sido testado no caso 3. No entanto, para manter uma consistência e garantir que cada caso tenha seu próprio teste, vamos repeti-lo no caso 5.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caso 4: Este caso testa a função que verifica se um item existe na lista. Veja que estamos fazendo algo novo aqui, que é primeiro testar o valor esperado e, em seguida, testar também um valor que não estará na lista. Isso garante a cobertura de ambos os casos, sendo importante nesta função.&lt;/li&gt;
&lt;li&gt;Caso 5: Como mencionado, este caso já foi testado acima, então vou economizar palavras.&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%2Fyk5oflhrh53g7d3h48bx.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%2Fyk5oflhrh53g7d3h48bx.png" alt="coverage" width="671" height="165"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Assim ficou a coverage desse hook, apesar de simples, é importante testar essas pequenas abstrações do código, é isso hoje.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>testing</category>
      <category>vitest</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Use hook pagination</title>
      <dc:creator>Genilson fernandes</dc:creator>
      <pubDate>Tue, 27 Feb 2024 20:41:00 +0000</pubDate>
      <link>https://forem.com/geniilsonfernandes/use-hook-pagination-n5g</link>
      <guid>https://forem.com/geniilsonfernandes/use-hook-pagination-n5g</guid>
      <description>&lt;p&gt;Olá! Desenvolvi este hook para resolver um problema pessoal, mas quem sabe também possa ser útil para você.&lt;/p&gt;

&lt;p&gt;Este hook gera uma sequência de páginas para renderizar na tela e permite controlar a ação do usuário ao navegar entre elas. É um código simples, mas que sempre me ajuda quando preciso criar esse tipo de interface de usuário.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const { currentPage, handlePageChange, nextPage, prevPage, range } =
  usePagination({
    initialPage: 1,
    totalPages: 20,
  });

// output;
// range =&amp;gt; [1, '...', 3, 4, 5, '...', 20]

 handlePageChange(3)

// currentPage =&amp;gt; 3
// range =&amp;gt; [1, '...', 2, 3, 4, '...', 20]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dito isso, eu desenvolvi o hook novamente e publiquei no npm. Investi tempo na documentação, seguindo uma abordagem orientada a testes para garantir consistência e segurança para o uso.&lt;/p&gt;

&lt;p&gt;A documentação está disponível no Storybook e também no README, com um guia de como utilizar o hook. Você pode conferir a documentação aqui: [&lt;a href="https://65de0e043d606805aeba4797--glowing-alfajores-c9ed2e.netlify.app/?path=/docs/hooks-usepagination--docs"&gt;https://65de0e043d606805aeba4797--glowing-alfajores-c9ed2e.netlify.app/?path=/docs/hooks-usepagination--docs&lt;/a&gt;].&lt;/p&gt;

&lt;p&gt;Qualquer sugestão, pode deixar abaixo ou pode voce mesmo aprimorar o hook!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/use-pagination-pull?activeTab=readme"&gt;npm: use-pagination-pull&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para hoje era isso , tchau!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Criando um componente para validar o status da senha do usuário</title>
      <dc:creator>Genilson fernandes</dc:creator>
      <pubDate>Tue, 12 Dec 2023 15:19:08 +0000</pubDate>
      <link>https://forem.com/geniilsonfernandes/criando-um-componente-para-validar-o-status-da-senha-do-usuario-48l3</link>
      <guid>https://forem.com/geniilsonfernandes/criando-um-componente-para-validar-o-status-da-senha-do-usuario-48l3</guid>
      <description>&lt;p&gt;Existem várias maneiras de validar se a senha do usuário está seguindo boas práticas. Uma delas é simplesmente pintar o input de vermelho e assustar o usuário, enquanto outra é mostrar o que ele precisa fazer e deixar claro o caminho para resolver o problema.&lt;/p&gt;

&lt;p&gt;Com esse pensamento, criei um componente separado que pode ser acoplado a qualquer outro input, desde que ele tenha as mesmas validações do input original.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const PasswordCheckStatus = ({ password }: { password: string }) =&amp;gt; {
  const hasUpper = /[A-Z]/.test(password);
  const hasSpecial = /[\W_]/.test(password);
  const hasNumber = /[0-9]/.test(password);

  const percentage = (hasUpper ? 33.3 : 0) + (hasSpecial ? 33.3 : 0) + (hasNumber ? 33.3 : 0);

  if (!password) {
    return null;
  }

  return (
    &amp;lt;div className="w-full bg-slate-200 h-[2px]"&amp;gt;
      &amp;lt;div
        className={cn('h-full bg-slate-500 transition-all', {
          'bg-red-500': percentage &amp;lt; 60,
          'bg-yellow-500': percentage &amp;gt;= 60 &amp;amp;&amp;amp; percentage &amp;lt; 80,
          'bg-green-500': percentage &amp;gt;= 80
        })}
        style={{ width: `${percentage}%` }}&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E assim ficou o código. A validação é a mesma que será utilizada no input. Usei regex e Tailwind para o estilo.&lt;/p&gt;

&lt;p&gt;E como mencionei, utilizei-o como uma dependência do input.&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%2Fjg6wugw5oy3l1mdj85bu.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%2Fjg6wugw5oy3l1mdj85bu.png" alt="Image description" width="800" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Crei um ultils para simular um back end usando o local storage</title>
      <dc:creator>Genilson fernandes</dc:creator>
      <pubDate>Tue, 05 Dec 2023 15:17:13 +0000</pubDate>
      <link>https://forem.com/geniilsonfernandes/crei-um-ultils-para-simular-um-back-end-usando-o-local-storage-3cdb</link>
      <guid>https://forem.com/geniilsonfernandes/crei-um-ultils-para-simular-um-back-end-usando-o-local-storage-3cdb</guid>
      <description>&lt;p&gt;Absurdo, não é? Eu preciso simular um back-end porque, sendo um desenvolvedor full stack, ainda não criei meu próprio back-end para a minha aplicação. Problemas, não é mesmo?&lt;/p&gt;

&lt;p&gt;Devido a essa pequena complicação, eu comecei a adiantar os métodos que, no futuro, seriam responsáveis por fazer as requisições para o back-end. Assim, mesmo sem esses endpoints, eu poderia avançar no desenvolvimento do front-end para depois conectar aos endpoints.&lt;/p&gt;

&lt;p&gt;Não é a primeira vez que faço isso, então eu já sabia o que estava fazendo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Primeiro, aqui está o utilitário que criei:&lt;/strong&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 generateHashId from './generateHashId';

type localStorageBaseType = {
  id: string;
  created_at: Date;
};

export class NotFoundError extends Error {
  constructor(message: string) {
    super(message);
    this.message = message;
  }
}

export class StorageError extends Error {
  constructor(message: string) {
    super(message);
    this.message = message;
  }
}

class LocalStorageUtil&amp;lt;T extends localStorageBaseType&amp;gt; {
  private key: string;

  constructor(key: string) {
    this.key = key;
  }

  // Obtém os dados do Local Storage para a chave especificada
  getData(): T[] {
    const data = localStorage.getItem(this.key);
    return data ? JSON.parse(data) : [];
  }

  getById(id: string): T | undefined {
    const data = this.getData();
    return data.find((item) =&amp;gt; item.id === id);
  }
  // Salva os dados no Local Storage para a chave especificada
  saveData(data: T[]): void {
    localStorage.setItem(this.key, JSON.stringify(data));
  }

  updateItem(item: T): void {
    const data = this.getData();
    const findIndex = data.findIndex((i) =&amp;gt; i.id === item.id);

    if (findIndex === -1) {
      throw new NotFoundError('Item not found');
    }

    if (findIndex !== -1) {
      data[findIndex] = item;
      this.saveData(data);
    }
  }

  // Adiciona um novo item aos dados existentes
  addItem(item: Omit&amp;lt;T, 'id' | 'created_at'&amp;gt;): void {
    if (!item) {
      throw new StorageError('data is required');
    }

    const data = this.getData();
    const newItem: T = {
      id: generateHashId(16),
      created_at: new Date(),
      ...item
    } as T;
    data.push(newItem);
    this.saveData(data);
  }

  // Remove um item específico dos dados
  removeItem(id: string): void {
    const data = this.getData();
    const filteredData = data.filter((item) =&amp;gt; item.id !== id);
    this.saveData(filteredData);
  }

  // Remove todos os dados relacionados à chave especificada
  deleteData(): void {
    localStorage.removeItem(this.key);
  }
}

export default LocalStorageUtil;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como pode ver, é uma classe que de dar alguns métodos, os principais de um &lt;strong&gt;CRUD&lt;/strong&gt;. E o uso dela é bem simples, como pode ver, esta usando typescript o que já ajuda bastante.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Primeiro passo: instanciando a casse&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Como ela é uma classe, precisamos instanciar ela em algum lugar, ai ficar sua vontade&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
const keys = {
  budgets: '@budgets'
};

export type Budgets = {
  name: string;
  value: number;
} &amp;amp; localStorageBaseType;


const budgetStorage = new LocalStorageUtil&amp;lt;Budgets&amp;gt;(keys.budgets);

export { budgetStorage };
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O que é esse localStorageBaseType?  é somente um tipo base para você da merge com o tipo que vc quer passar para a classe, ela vai usar para ajudar na tipagem dos metodos.&lt;/p&gt;

&lt;p&gt;ela por baixo dos planos tem &lt;strong&gt;id&lt;/strong&gt; e um &lt;strong&gt;created_at&lt;/strong&gt; para ajudar nos métodos da classe de buscar e update. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Segundo passo: finalmente usando&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O uso ficar bem fácil, é so pegar &lt;strong&gt;budgetStorage&lt;/strong&gt; e começar usar os métodos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
budgetStorage.addItem({
  name: 'Salário',
  value: 1000
});

const budgets = budgetStorage.getData() 
// spec: {
// name: 'Salário', 
// value: 1000
// id: 'x1y2z3',
// created_at: '17/12/2023'
// }

budgetStorage.updateItem({
  name: 'Salário',
  id: 'x1y2z3',
  value: 2000,
  created_at: new Date()
});

// Para atualizar é so passar o item com o update que o
// metodo vai buscar pelo id para atualizar o item
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os outros métodos são bem fáceis de usar e com a ajuda o typescript, temos o removeItem, deleteData, getById. &lt;/p&gt;

&lt;p&gt;lembrando que foi uma solução bem simples para ajudar a completar um etapa do projeto e claro que da pra melhorar. é isso.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
