Exercício – Gerenciar atualizações de dependência no projeto do Node.js

Concluído

A Tailwind Traders solicitou que você trabalhe em um aplicativo que tem algumas dependências desatualizadas. O aplicativo é pequeno e tem somente algumas dependências. A atualização do código deve ser simples. Veja se você pode atualizar o aplicativo para tirar proveito dos recursos mais recentes. Enquanto estiver fazendo isso, se encontrar alguma vulnerabilidade, aproveite para corrigi-la.

Introdução

  1. Em uma nova janela do terminal (Ctrl + Shift + `), alterne para a pasta que tem os arquivos deste exercício:

    cd ../7-exercise-dependency-management
    
  2. Instale as dependências executando este comando:

    npm install
    

    Você deve ver a saída sobre os pacotes instalados e quaisquer vulnerabilidades.

  3. Abra o arquivo package.json e veja a seção dependencies:

    "lodash": "^1.1.0",
    "node-fetch": "^1.0.2"
    

    Observe que os padrões especificam o caractere insert (^), que indica atualizações para a versão secundária para dar suporte a dependências: 1.x.

  4. Abra o arquivo index.js para entender como as dependências do pacote são usadas no aplicativo:

    const fetch = require('node-fetch')
    const _ = require('lodash');
    const path = require('path');
    const fs = require('fs');
    
    async function run() {
      const response = await fetch("https://dev.to/api/articles?state=rising");
      const json = await response.json();
      const sorted = _.sortBy(json, ["public_reactions_count"], ['desc']);
      const top3 = _.take(sorted, 3);
    
      const filePrefix = new Date().toISOString().split('T')[0];
      fs.writeFileSync(path.join(__dirname, `${filePrefix}-feed.json`), JSON.stringify(top3, null, 2));
    }
    
    run();
    

    Esse código extrai dados de uma API REST usando o pacote node-fetch. Ele processa a resposta classificando-a e obtém os três principais resultados usando o pacote lodash. O resultado é armazenado em um arquivo.

Auditoria do npm

Para entender se há vulnerabilidades, execute este comando:

npm audit

Você deverá ver uma saída semelhante a este exemplo:

# npm audit report

lodash  <=4.17.20
Severity: critical
Regular Expression Denial of Service (ReDoS) in lodash - https://github.com/advisories/GHSA-x5rq-j2xg-h7qm
Prototype Pollution in lodash - https://github.com/advisories/GHSA-fvqr-27wr-82fm
Prototype Pollution in lodash - https://github.com/advisories/GHSA-jf85-cpcp-j695
Command Injection in lodash - https://github.com/advisories/GHSA-35jh-r3h4-6jhm
Prototype Pollution in lodash - https://github.com/advisories/GHSA-4xc9-xhrj-v574
Regular Expression Denial of Service (ReDoS) in lodash - https://github.com/advisories/GHSA-29mw-wpgm-hmr9
fix available via `npm audit fix --force`
Will install lodash@4.17.21, which is a breaking change
node_modules/lodash

node-fetch  <=2.6.6
Severity: high
The `size` option isn't honored after following a redirect in node-fetch - https://github.com/advisories/GHSA-w7rc-rwvf-8q5r
node-fetch forwards secure headers to untrusted sites - https://github.com/advisories/GHSA-r683-j2x4-v87g
fix available via `npm audit fix --force`
Will install node-fetch@3.3.2, which is a breaking change
node_modules/node-fetch

2 vulnerabilities (1 high, 1 critical)

To address all issues (including breaking changes), run:
npm audit fix --force

A saída indica as vulnerabilidades e a versão do pacote que corrige o problema.

Will install lodash@4.17.21, which is a breaking change
Will install node-fetch@3.3.2, which is a breaking change

npm desatualizado

No terminal, execute este comando para verificar se há dependências desatualizadas:

npm outdated

Você deverá ver uma saída semelhante a este exemplo:

Package     Current  Wanted   Latest  Location                 Depended by
lodash        1.3.1   1.3.1  4.17.21  node_modules/lodash      7-exercise-dependency-management
node-fetch    1.7.3   1.7.3    3.3.2  node_modules/node-fetch  7-exercise-dependency-management

As versões atuais e desejada são as mesmas, mas a versão mais recente é diferente. A estratégia de atualização semântica especificada no package.json foi atendida, mas as vulnerabilidades ainda existem.

Atualização do npm

  1. Edite o arquivo package.json para permitir explicitamente que as principais alterações corrijam as vulnerabilidades começando com o pacote mais significativo:

    "node-fetch": "^2.6.6"
    
  2. Execute este comando para ver o que a atualização faria:

    npm update --dry-run
    
    added 3 packages, removed 4 packages, and changed 1 package in 508ms
    
  3. Execute este comando para atualizar o projeto com base no package.json:

    npm update
    
  4. Execute este comando para ver se a vulnerabilidade de node-fetch foi corrigida:

    npm audit
    
    # npm audit report
    
    lodash  <=4.17.20
    Severity: critical
    Regular Expression Denial of Service (ReDoS) in lodash - https://github.com/advisories/GHSA-x5rq-j2xg-h7qm
    Prototype Pollution in lodash - https://github.com/advisories/GHSA-fvqr-27wr-82fm
    Prototype Pollution in lodash - https://github.com/advisories/GHSA-jf85-cpcp-j695
    Command Injection in lodash - https://github.com/advisories/GHSA-35jh-r3h4-6jhm
    Prototype Pollution in lodash - https://github.com/advisories/GHSA-4xc9-xhrj-v574
    Regular Expression Denial of Service (ReDoS) in lodash - https://github.com/advisories/GHSA-29mw-wpgm-hmr9
    fix available via `npm audit fix --force`
    Will install lodash@4.17.21, which is a breaking change
    node_modules/lodash
    
    1 critical severity vulnerability
    
    To address all issues (including breaking changes), run:
      npm audit fix --force
    
  5. Se o projeto tiver testes, execute-os para verificar se a atualização não interrompeu nada.

  6. Use essas mesmas etapas para atualizar lo-dash para a versão 4.17.20 sem vulnerabilidades.

    As vulnerabilidades são corrigidas, mas a versão node-fetch ainda é uma versão principal por trás. Se todos os testes forem aprovados, corrija a versão especificada no arquivo package.json para a versão mais recente:

    "node-fetch": "^3.3.2"
    
  7. Em seguida, execute o seguinte comando para atualizar o projeto:

    npm update
    

    Seu projeto agora não deve ter nenhuma vulnerabilidade do npm e estar na versão principal atual.

  8. Faça check-in de seus arquivos package.json e package-lock.json.

    Parabéns! Você atualizou as dependências e corrigiu as vulnerabilidades no projeto.

Limpar o contêiner de desenvolvimento

Depois de concluir o projeto, limpe o ambiente de desenvolvimento ou devolva-o ao estado padrão.

A exclusão do ambiente GitHub Codespaces garante que você possa maximizar a quantidade de horas gratuitas por núcleo que você tem direito na sua conta.

Importante

Para saber mais sobre os direitos da sua conta do GitHub, confira O GitHub Codespaces inclui mensalmente armazenamento e horas de núcleo.

  1. Entre no painel do GitHub Codespaces (https://github.com/codespaces).

    Screenshot of all the running codespaces including their status and templates.

  2. Abra o menu de contexto do codespace e selecione Excluir.

    Screenshot of the context menu for a single codespace with the delete option highlighted.