<?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: Ryan Yost</title>
    <description>The latest articles on DEV Community by Ryan Yost (@ryanjyost).</description>
    <link>https://dev.to/ryanjyost</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%2F324117%2F6edd0e27-55e5-4391-ad95-a9d669bae38d.png</url>
      <title>DEV Community: Ryan Yost</title>
      <link>https://dev.to/ryanjyost</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ryanjyost"/>
    <language>en</language>
    <item>
      <title>How to level-up your Cypress testing</title>
      <dc:creator>Ryan Yost</dc:creator>
      <pubDate>Thu, 19 Mar 2020 00:52:20 +0000</pubDate>
      <link>https://dev.to/ryanjyost/how-to-level-up-your-cypress-testing-nh4</link>
      <guid>https://dev.to/ryanjyost/how-to-level-up-your-cypress-testing-nh4</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a tutorial about cypress-testing-library, waiting for network requests, custom commands, piping console logs to the test/terminal output and failing tests when there's a console error.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Cypress for end-to-end testing is awesome and easy to get started with. But once you've written more than a few tests, you'll start to realize ways to improve your test infrastructure and implementations. Here are 5 techniques I've picked up that made huge improvements to my Cypress testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  We'll walk through 5 techniques
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Use cypress-testing-library&lt;/li&gt;
&lt;li&gt;Wait explicitly for network requests&lt;/li&gt;
&lt;li&gt;Turn common actions into commands&lt;/li&gt;
&lt;li&gt;Log browser warnings and errors in the terminal output&lt;/li&gt;
&lt;li&gt;Fail tests when there's an unknown console error&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Set up the test project
&lt;/h2&gt;

&lt;p&gt;Create a new React project with create-react-app and &lt;code&gt;cd&lt;/code&gt; into it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-react-app cypress-tutorial
cd cypress-tutorial
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Install cypress.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i -D cypress
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Initialize cypress in your project by opening the development GUI for the first time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx cypress open
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Delete the example test directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rm -R ./cypress/integration/examples
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Run the app in a terminal window and keep it running at &lt;code&gt;http://localhost:3000&lt;/code&gt; throughout the tutorial.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Add ESLint and the Cypress linting rules
&lt;/h3&gt;

&lt;p&gt;To avoid annoying linting issues with Cypress in your IDE, let's setup linting such that it understands Cypress's global &lt;code&gt;cy&lt;/code&gt; object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i -D eslint eslint-plugin-cypress
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Create an &lt;code&gt;.eslintrc.json&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;touch .eslintrc.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Paste this code into your &lt;code&gt;.eslintrc.json&lt;/code&gt; so that your IDE can understand the Cypress code and modern JavaScript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"plugins"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"cypress"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"es6"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Write a basic test
&lt;/h2&gt;

&lt;p&gt;To have a starting point for implementing more advanced techniques, let's write a super basic test.&lt;/p&gt;

&lt;p&gt;Create a new test file called &lt;code&gt;tutorial.spec.js&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;touch ./cypress/integration/tutorial.spec.js
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Paste the following Cypress test code into the &lt;code&gt;tutorial.spec.js&lt;/code&gt; file. All this test does is make sure the app works by looking for the CRA boilerplate "Learn React" link.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE: Normally, you'd set the &lt;code&gt;baseUrl&lt;/code&gt; in &lt;code&gt;cypress.json&lt;/code&gt;!&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cypress Tutorial&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;works&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Learn React&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Run the test by opening the GUI with &lt;code&gt;npx cypress open&lt;/code&gt; and see that the test passes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technique 1: Use cypress-testing-library
&lt;/h2&gt;

&lt;p&gt;You may have heard of Kent C. Dodds and his testing libraries like dom-testing-library and react-testing-library. Well there's one for cypress, too, called &lt;a href="https://testing-library.com/docs/cypress-testing-library/intro"&gt;cypress-testing-library&lt;/a&gt; and it's pretty sweet for easily writing tests in a way that more closely mimics how a user will actually interact with your app, which means your&lt;br&gt;
tests are better.&lt;/p&gt;

&lt;p&gt;Install the library.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -D @testing-library/cypress
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Per the docs, we need to import the library into &lt;code&gt;cypress/support/commands.js&lt;/code&gt; for it to work. So update that file with the following...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@testing-library/cypress/add-commands&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now we have access to the awesome commands from cypress-testing-library right from the &lt;code&gt;cy&lt;/code&gt; object just like normal commands. Let's use one in our existing &lt;code&gt;tutorial.spec.js&lt;/code&gt; test.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cypress Tutorial&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Makes sure the app is working&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Learn React&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// formerly cy.get("a").contains("Learn React");&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Not much changed, but now we aren't looking for an &lt;code&gt;a&lt;/code&gt; tag anymore, merely anything on the page that has &lt;code&gt;Learn React&lt;/code&gt;. This way of looking for it is closer to how a user will read and interact with the screen. You can&lt;br&gt;
read more about that concept &lt;a href="https://testing-library.com/docs/guide-which-query"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And to make sure our test actually works and breaks when it's supposed to, change the text to search for &lt;code&gt;Learn Vue&lt;/code&gt; and see the test break in the GUI.&lt;/p&gt;
&lt;h2&gt;
  
  
  Technique 2: Wait explicitly for network requests
&lt;/h2&gt;

&lt;p&gt;I've found that network requests are the biggest cause of flakiness in tests. Sometime they're quick, other times they exceed your default timeout and cause your test to fail. While you could just increase the timeout, that makes your tests longer than they need to be. There's a better way.&lt;/p&gt;
&lt;h3&gt;
  
  
  Add a network request to the React app
&lt;/h3&gt;

&lt;p&gt;We need a network request to test, so let's add a dummy one to the &lt;code&gt;App.js&lt;/code&gt; file. Also, for some reason the native &lt;code&gt;fetch&lt;/code&gt; api doesn't work with cypress route stuff, so let's install and use axios.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i axios
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now paste this in &lt;code&gt;App.js&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&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="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;logo&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./logo.svg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./App.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;loaded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setLoaded&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;useEffect&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;secondsToWait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://httpstat.us/200?sleep=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;secondsToWait&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;setLoaded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

  &lt;span class="k"&gt;return&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;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;App&lt;/span&gt;&lt;span class="dl"&gt;"&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;header&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;App-header&lt;/span&gt;&lt;span class="dl"&gt;"&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;img&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;logo&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;App-logo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;logo&lt;/span&gt;&lt;span class="dl"&gt;"&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;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nx"&gt;Edit&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/code&amp;gt; and save to reload&lt;/span&gt;&lt;span class="err"&gt;.
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;loaded&lt;/span&gt; &lt;span class="p"&gt;?&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;a&lt;/span&gt;
            &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;App-link&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
            &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://reactjs.org&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
            &lt;span class="nx"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;noopener noreferrer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
          &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nx"&gt;Learn&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/a&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/header&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&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;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;With the updates above, the app now doesn't show the "Learn React" link until the network request finishes after 5 seconds. Check it out for yourself by reloading your app at &lt;code&gt;http://localhost:3000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Because the "Learn React" link doesn't show up for 5 seconds, which is longer than Cypress' default timeout, the test now fails.&lt;/p&gt;

&lt;h3&gt;
  
  
  The bad fix: increasing the timeout
&lt;/h3&gt;

&lt;p&gt;One suboptimal way to "fix" your test would be to increase the default timeout of the &lt;code&gt;findByText&lt;/code&gt; command, like below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cypress Tutorial&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Makes sure the app is working&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Learn React&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now your test passes, but it waits for the network request for 10 seconds every time you run the test - even if the network only needs 2 seconds. That's a lot of time to add to your test suite - multiplied by however many times you use this strategy!&lt;/p&gt;

&lt;h3&gt;
  
  
  The better fix: alias and wait
&lt;/h3&gt;

&lt;p&gt;Cypress has a thing called &lt;a href="https://docs.cypress.io/guides/core-concepts/variables-and-aliases.html#Aliases"&gt;aliases&lt;/a&gt; that let you explicitly reference various things in your tests like elements, fixtures&lt;br&gt;
and, in our case, &lt;a href="https://docs.cypress.io/guides/core-concepts/variables-and-aliases.html#Requests"&gt;network requests&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Let's improve our test by aliasing the network request and waiting for it before looking for the "Learn Text" link.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cypress Tutorial&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;works&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// alias the network request&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/200?**&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fakeNetworkRequest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// wait for the network request to complete&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@fakeNetworkRequest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// now look for the link&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Learn React&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Some explanations/things to note about the above...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.cypress.io/api/commands/server.html#Syntax"&gt;&lt;code&gt;cy.server()&lt;/code&gt;&lt;/a&gt; lets you "start a server to begin routing
responses to cy.route() and to change the behavior of network requests."&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.cypress.io/api/commands/route.html#Syntax"&gt;&lt;code&gt;cy.route()&lt;/code&gt;&lt;/a&gt; lets you manage network behavior and
takes an explicit url or a glob to match certain request patterns. You can also get more specific with a config object, which is what I chose to do above.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now our test passes and waits only as long as it needs to, even if you increase the &lt;code&gt;secondsToWait&lt;/code&gt; in &lt;code&gt;App.js&lt;/code&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  Technique 3: Turn common actions into commands
&lt;/h2&gt;

&lt;p&gt;As you write more and more tests, you'll find that you're reusing a lot of the same logic for doing common interactions like...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;logging into your app&lt;/li&gt;
&lt;li&gt;selecting weird elements&lt;/li&gt;
&lt;li&gt;navigating to a page&lt;/li&gt;
&lt;li&gt;prepping some data/state on the page&lt;/li&gt;
&lt;li&gt;much more...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our tutorial app and test are really simple - but this wouldn't be a tutorial without a convoluted example to show off some technology!&lt;/p&gt;

&lt;p&gt;So let's write a new test that checks that the "Learn React" href is "&lt;a href="https://reactjs.org"&gt;https://reactjs.org&lt;/a&gt;". In that test, we'll use some reusable commands that we create.&lt;/p&gt;

&lt;h3&gt;
  
  
  Write the new tests, without any commands
&lt;/h3&gt;

&lt;p&gt;In the same &lt;code&gt;describe&lt;/code&gt; block as the first test, add this one. Obviously very similar to the first, so we'll extract out the common bits shortly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;has a link pointing to the react website&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/200?**&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fakeNetworkRequest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@fakeNetworkRequest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Learn React&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;have.attr&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;href&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://reactjs.org&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Run that test in the GUI to make sure it passes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Our first command
&lt;/h3&gt;

&lt;p&gt;We may have a reason to verify the &lt;code&gt;href&lt;/code&gt; of links in other tests, which we could extract out into a nice, custom Cypress command.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Obviously your real world app and tests will provide more legit reasons to write reusable commands.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Open up &lt;code&gt;cypress/support/commands.js&lt;/code&gt; and add the below code, a.k.a. our custom command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@testing-library/cypress/add-commands&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//same as before for cypress-testing-library&lt;/span&gt;

&lt;span class="nx"&gt;Cypress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Commands&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;verifyLink&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;linkText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;href&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="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;linkText&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;have.attr&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;href&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;So we just added a command &lt;code&gt;verifyLink&lt;/code&gt; that takes two args - the &lt;code&gt;linkText&lt;/code&gt; to look for and the &lt;code&gt;href&lt;/code&gt; the link should have.&lt;/p&gt;

&lt;p&gt;Go back to &lt;code&gt;tutorial.spec.js&lt;/code&gt; and use the command!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;has a link pointing to the react website&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/200?**&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fakeNetworkRequest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@fakeNetworkRequest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;verifyLink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Learn React&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://reactjs.org&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Bonus: Use beforeEach to reuse test code within the same test suite.
&lt;/h3&gt;

&lt;p&gt;Sometimes test code is repeated just within a spec file/suite, which we can extract out with options like &lt;code&gt;beforeEach&lt;/code&gt;, &lt;code&gt;afterEach&lt;/code&gt;, and sometimes just good ole fashioned JavaScript functions.&lt;/p&gt;

&lt;p&gt;Here in &lt;code&gt;tutorial.spec.js&lt;/code&gt;, we'll leverage &lt;code&gt;beforeEach&lt;/code&gt;. Below is the latest version of our test suite.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cypress Tutorial&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;beforeEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/200?**&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fakeNetworkRequest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@fakeNetworkRequest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;works&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Learn React&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;has a link pointing to the react website&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;verifyLink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Learn React&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://reactjs.org&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Technique 4: Log browser warnings and errors in the headless/terminal output
&lt;/h2&gt;

&lt;p&gt;When you run the Cypress test suite in headless mode, it's nice to be able to see console warnings and errors that may help you debug why your tests failed. This doesn't happen by default in the terminal output, so let's make it happen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add a console warning and error to the app
&lt;/h3&gt;

&lt;p&gt;First, we'll need errors and warnings to pass through to the terminal. So update &lt;code&gt;App.js&lt;/code&gt; with the following code...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//... same above&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;loaded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setLoaded&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;useEffect&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This is a log&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This is a warning&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This is an error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;secondsToWait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://httpstat.us/200?sleep=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;secondsToWait&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;setLoaded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

&lt;span class="c1"&gt;//... same below&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Check in your browser console for those three messages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run the tests in headless mode
&lt;/h3&gt;

&lt;p&gt;To see the terminal test output before it shows console warnings and errors, run the following.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx cypress run
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Logging console output
&lt;/h3&gt;

&lt;p&gt;This is going to seem kinda elaborate for something so simple, but it's worth it and exposes some possibilities in Cypress generally.&lt;/p&gt;

&lt;p&gt;Open up &lt;code&gt;cypress/commands/index.js&lt;/code&gt; and add the following code to the bottom of the file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Cypress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;window:before:load&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;win&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;win&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;task&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;win&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;task&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;There's a decent bit going on here - let's break it down.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Cypress.on&lt;/code&gt; is a way to listen for
&lt;a href="https://docs.cypress.io/api/events/catalog-of-events.html#Event-Types"&gt;Cypress events&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;we run a function on the &lt;code&gt;window:before:load&lt;/code&gt; event (basically before the tests run)&lt;/li&gt;
&lt;li&gt;To intercept the console methods we &lt;a href="https://docs.cypress.io/api/commands/stub.html#Syntax"&gt;stub&lt;/a&gt; them.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cy.now&lt;/code&gt; is something I learned about &lt;a href="https://github.com/cypress-io/cypress/issues/300"&gt;here&lt;/a&gt; and &lt;a href="https://stackoverflow.com/questions/53898085/check-if-an-error-has-been-written-to-the-console"&gt;here&lt;/a&gt;
and seems to avoid an issue with &lt;code&gt;cy.task&lt;/code&gt; and promises that Cypress doesn't like. &lt;strong&gt;I wish there was a better way
, so if you know of any let me know!&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We need to update one more file, &lt;code&gt;cypress/plugins/index.js&lt;/code&gt;, to get things to work. Here's the code you'll need in that file, which listens for the &lt;code&gt;tasks&lt;/code&gt; we just set up in &lt;code&gt;cypress/commands/index.js&lt;/code&gt; and logs to the &lt;a href="https://docs.cypress.io/guides/tooling/plugins-guide.html#Using-a-plugin"&gt;internal Cypress process&lt;/a&gt; (including the terminal output with nice colors).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;on&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`task`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;x1b[31m&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ERROR:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;x1b[0m&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nx"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;x1b[33m&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;WARNING:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;x1b[0m&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now run the tests in headless mode with &lt;code&gt;npx cypress run&lt;/code&gt; and you should see the logs in your terminal output!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qcrGNHZU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/tests-with-logging.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qcrGNHZU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/tests-with-logging.png" alt="tests-with-logging"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Technique 5: Fail tests when there's an unknown console error
&lt;/h2&gt;

&lt;p&gt;Cypress tests fail on uncaught exceptions already, which is basically your app crashing. But sometimes we might want to fail the test when there's a &lt;code&gt;console.error&lt;/code&gt; in the browser during the test.&lt;/p&gt;

&lt;p&gt;Fortunately, we can easily add this behavior to our Cypress tests with a small addition to the code from the preview section. Open &lt;code&gt;cypress/support/index&lt;/code&gt; and update the &lt;code&gt;Cypress.on&lt;/code&gt; listener block to match below, which just has one extra line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Cypress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;window:before:load&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;win&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;win&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;task&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// all we needed to add!&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;win&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;task&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;No rerun the test suite and see that it fails!&lt;/p&gt;

&lt;h3&gt;
  
  
  Bonus - ignore known errors
&lt;/h3&gt;

&lt;p&gt;Sometimes we know of console errors that we just can't get rid of, but we want to still fail tests for &lt;em&gt;unknown&lt;/em&gt; errors. That's a simple fix by only throwing the &lt;code&gt;Error&lt;/code&gt; when we don't recognize the error message. See below for how we can ignore our current app's console error.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Cypress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;window:before:load&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;win&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;win&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This is an error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;task&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;win&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;task&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Rerun the test suite and the console error will no longer fail your tests!&lt;/p&gt;

&lt;h2&gt;
  
  
  And that's it!
&lt;/h2&gt;

&lt;p&gt;I have more Cypress techniques (like making it work with modern SPA apps/tools like react-router and adding to a CI/CD pipeline) I didn't have space for in this tutorial, so those will be &lt;a href="https://www.ryanjyost.com/subscribe"&gt;coming soon&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>testing</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>react</category>
    </item>
    <item>
      <title>Projects starred by Dan Abramov in the past year</title>
      <dc:creator>Ryan Yost</dc:creator>
      <pubDate>Tue, 17 Mar 2020 02:23:46 +0000</pubDate>
      <link>https://dev.to/ryanjyost/projects-starred-by-dan-abramov-in-the-past-year-5c79</link>
      <guid>https://dev.to/ryanjyost/projects-starred-by-dan-abramov-in-the-past-year-5c79</guid>
      <description>&lt;p&gt;Keeping up with all of the cool projects out there is impossible - but seeing what other developers are starring on&lt;br&gt;
GitHub is an easy way to get a feel for what's out there and what's worth checking out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Want a personalized version of these lists in your inbox every week?
&lt;/h3&gt;

&lt;p&gt;Then sign up for &lt;a href="https://www.ryanjyost.com/follow-the-stars"&gt;Follow the Stars - a weekly email with the projects that the folks you follow on GitHub have starred&lt;br&gt;
.&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  list&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; List of Homeferences &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/homeferences/list"&gt;https://github.com/homeferences/list&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/homeferences"&gt;homeferences&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 331&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  overnight&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; A soft vibrant VSCode theme - Based on Sarah Drasner's Night Owl and Dan Abramov's Overreacted blog &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/cevr/overnight"&gt;https://github.com/cevr/overnight&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/cevr"&gt;cevr&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 252&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  react-native-website&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The site and docs for React Native &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/facebook/react-native-website"&gt;https://github.com/facebook/react-native-website&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/facebook"&gt;facebook&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 1,038&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  excalidraw&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Excalidraw is a whiteboard tool that lets you easily sketch diagrams that have a hand-drawn feel to them. &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/excalidraw/excalidraw"&gt;https://github.com/excalidraw/excalidraw&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/excalidraw"&gt;excalidraw&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 3,412&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  one-click.js&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; One Click, Offline, CommonJS Modules in the browser &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/jordwalke/one-click.js"&gt;https://github.com/jordwalke/one-click.js&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/jordwalke"&gt;jordwalke&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 312&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  super-rentals-tutorial&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; null &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/ember-learn/super-rentals-tutorial"&gt;https://github.com/ember-learn/super-rentals-tutorial&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/ember-learn"&gt;ember-learn&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 63&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  react-dom-mini&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Toy React renderer from my React Conf 2019 talk, "Building a Custom React Renderer" &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/sophiebits/react-dom-mini"&gt;https://github.com/sophiebits/react-dom-mini&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/sophiebits"&gt;sophiebits&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 532&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  react-adaptive-hooks&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Deliver experiences best suited to a user's device and network constraints &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/GoogleChromeLabs/react-adaptive-hooks"&gt;https://github.com/GoogleChromeLabs/react-adaptive-hooks&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/GoogleChromeLabs"&gt;GoogleChromeLabs&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 4,046&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  tailwindcss&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; A utility-first CSS framework for rapid UI development. &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/tailwindcss/tailwindcss"&gt;https://github.com/tailwindcss/tailwindcss&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/tailwindcss"&gt;tailwindcss&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 20,701&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  velcro&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; A set of tools and libraries for stitching together modules and code in highly dynamic browser environments &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/ggoodman/velcro"&gt;https://github.com/ggoodman/velcro&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/ggoodman"&gt;ggoodman&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 81&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  chakra-ui&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; ⚡️Simple, Modular &amp;amp; Accessible UI Components for your React Applications &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/chakra-ui/chakra-ui"&gt;https://github.com/chakra-ui/chakra-ui&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/chakra-ui"&gt;chakra-ui&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 5,425&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  mobile-first-animation&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Gesture-driven animation on the mobile web (React Conf 2019) &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/aholachek/mobile-first-animation"&gt;https://github.com/aholachek/mobile-first-animation&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/aholachek"&gt;aholachek&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 1,889&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  react-nodegui&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Build performant, native and cross-platform desktop applications with native React + powerful CSS like styling.🚀 &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/nodegui/react-nodegui"&gt;https://github.com/nodegui/react-nodegui&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/nodegui"&gt;nodegui&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 4,390&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  github-do-not-ban-us&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; GitHub do not ban us from open source world 🇮🇷 &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/1995parham/github-do-not-ban-us"&gt;https://github.com/1995parham/github-do-not-ban-us&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/1995parham"&gt;1995parham&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 12,121&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  talon_configs&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Modules to be used with Talon for hands-free input &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/2shea/talon_configs"&gt;https://github.com/2shea/talon_configs&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/2shea"&gt;2shea&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 69&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  hermes&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Hermes is a small and lightweight JavaScript engine optimized for running React Native on Android. &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/facebook/hermes"&gt;https://github.com/facebook/hermes&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/facebook"&gt;facebook&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 5,127&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  react-firebase-hooks&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; React Hooks for Firebase. &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/CSFrequency/react-firebase-hooks"&gt;https://github.com/CSFrequency/react-firebase-hooks&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/CSFrequency"&gt;CSFrequency&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 953&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  libra&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Libra’s mission is to enable a simple global currency and financial infrastructure that empowers billions of people. &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/libra/libra"&gt;https://github.com/libra/libra&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/libra"&gt;libra&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 14,025&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  rehp&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; ReHp &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/jordwalke/rehp"&gt;https://github.com/jordwalke/rehp&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/jordwalke"&gt;jordwalke&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 165&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  react-teleporter&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Teleport React components in the same React tree 📡 &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/gregberge/react-teleporter"&gt;https://github.com/gregberge/react-teleporter&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/gregberge"&gt;gregberge&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 881&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  devhub&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; TweetDeck for GitHub - Filter Issues, Activities &amp;amp; Notifications - Web, Mobile &amp;amp; Desktop &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/devhubapp/devhub"&gt;https://github.com/devhubapp/devhub&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/devhubapp"&gt;devhubapp&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 6,588&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  react-vertex&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; ◾ React Vertex | Hooks-based WebGL library for React &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/sghall/react-vertex"&gt;https://github.com/sghall/react-vertex&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/sghall"&gt;sghall&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 1,216&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  build-tracker&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; A set of tools to track the size of your build artifacts over time. &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/paularmstrong/build-tracker"&gt;https://github.com/paularmstrong/build-tracker&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/paularmstrong"&gt;paularmstrong&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 367&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  empathy-driven-development&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Demo Gatsby app for a #noSlides talk on debugging and building accessible React apps &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/marcysutton/empathy-driven-development"&gt;https://github.com/marcysutton/empathy-driven-development&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/marcysutton"&gt;marcysutton&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 319&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  pastel&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; 🎨 Framework for effortlessly building Ink apps &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/vadimdemedes/pastel"&gt;https://github.com/vadimdemedes/pastel&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/vadimdemedes"&gt;vadimdemedes&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 1,173&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  glicky&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; 🐭 An In-browser User Interface For JavaScript Development Workflows &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/alex-saunders/glicky"&gt;https://github.com/alex-saunders/glicky&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/alex-saunders"&gt;alex-saunders&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 840&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  React95&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; 🌈🕹 Refreshed Windows 95 style UI components for your React app &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/arturbien/React95"&gt;https://github.com/arturbien/React95&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/arturbien"&gt;arturbien&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 3,602&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  playroom&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Design with JSX, powered by your own component library. &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/seek-oss/playroom"&gt;https://github.com/seek-oss/playroom&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/seek-oss"&gt;seek-oss&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 3,200&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  react-loops&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; React Loops works with React Hooks as part of the React Velcro Architecture &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/leebyron/react-loops"&gt;https://github.com/leebyron/react-loops&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/leebyron"&gt;leebyron&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 1,106&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  is-thirteen&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Check if a number is equal to 13. &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/jezen/is-thirteen"&gt;https://github.com/jezen/is-thirteen&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/jezen"&gt;jezen&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 5,002&lt;br&gt;&lt;/p&gt;




</description>
      <category>opensource</category>
      <category>github</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>36 projects starred by top JavaScript developers this week</title>
      <dc:creator>Ryan Yost</dc:creator>
      <pubDate>Sun, 08 Mar 2020 18:24:18 +0000</pubDate>
      <link>https://dev.to/ryanjyost/36-projects-starred-by-top-javascript-developers-this-week-2e1b</link>
      <guid>https://dev.to/ryanjyost/36-projects-starred-by-top-javascript-developers-this-week-2e1b</guid>
      <description>&lt;p&gt;Every week I loop through a list of influential/active/known JavaScript developers and see what they've starred on GitHub in the past week. The JS ecosystem is so quick to evolve and tough to keep up with, so hopefully this makes discovering new tools and resources a little easier.&lt;/p&gt;

&lt;h3&gt;
  
  
  Want a personalized version of these lists in your inbox every week?
&lt;/h3&gt;

&lt;p&gt;Then sign up for &lt;a href="https://www.ryanjyost.com/follow-the-stars"&gt;Follow the Stars - a weekly email with the projects that the folks you follow on GitHub have starred&lt;br&gt;
.&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  bundle-buddy&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; A tool to identify bundle duplication across splits. &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/samccone/bundle-buddy"&gt;https://github.com/samccone/bundle-buddy&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/samccone"&gt;samccone&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 2,729&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  inspectpack&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; An inspection tool for Webpack frontend JavaScript bundles. &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/FormidableLabs/inspectpack"&gt;https://github.com/FormidableLabs/inspectpack&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/FormidableLabs"&gt;FormidableLabs&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 406&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  vscode-jumpy&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Jumpy Extension for Visual Studio Code &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/wmaurer/vscode-jumpy"&gt;https://github.com/wmaurer/vscode-jumpy&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/wmaurer"&gt;wmaurer&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 75&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  vscode-quick-select&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Quick and Simple Jumping Text Selection &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/dbankier/vscode-quick-select"&gt;https://github.com/dbankier/vscode-quick-select&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/dbankier"&gt;dbankier&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 76&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  vscode-expand-region&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; porting sublime-expand-region to visual code &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/windwp/vscode-expand-region"&gt;https://github.com/windwp/vscode-expand-region&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/windwp"&gt;windwp&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 43&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  prettier-setup&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Basic configuration for Prettier, ESLint and Husky. &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/lipis/prettier-setup"&gt;https://github.com/lipis/prettier-setup&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/lipis"&gt;lipis&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 144&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  prettier-eslint&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Code ➡️ prettier ➡️ eslint --fix ➡️ Formatted Code ✨ &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/prettier/prettier-eslint"&gt;https://github.com/prettier/prettier-eslint&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/prettier"&gt;prettier&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 2,776&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  SublimeLinter&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The code linting framework for Sublime Text 3 &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/SublimeLinter/SublimeLinter"&gt;https://github.com/SublimeLinter/SublimeLinter&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/SublimeLinter"&gt;SublimeLinter&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 1,846&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  vscode-linter-xo&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Linter for XO &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/SamVerschueren/vscode-linter-xo"&gt;https://github.com/SamVerschueren/vscode-linter-xo&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/SamVerschueren"&gt;SamVerschueren&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 94&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  TypeScript-Sublime-Plugin&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; IO wrapper around TypeScript language services, allowing for easy consumption by editor plugins &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/microsoft/TypeScript-Sublime-Plugin"&gt;https://github.com/microsoft/TypeScript-Sublime-Plugin&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/microsoft"&gt;microsoft&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 1,604&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  iTerm2-Color-Schemes&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Over 200 terminal color schemes/themes for iTerm/iTerm2. Includes ports to Terminal, Konsole, PuTTY, Xresources, XRDB, Remmina, Termite, XFCE, Tilda, FreeBSD VT, Terminator, Kitty, MobaXterm, LXTerminal, Microsoft's Windows Terminal, Visual Studio &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/mbadolato/iTerm2-Color-Schemes"&gt;https://github.com/mbadolato/iTerm2-Color-Schemes&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/mbadolato"&gt;mbadolato&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 15,212&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  zsh-history-enquirer&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; plugin for zsh history search, enhance interaction &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/zthxxx/zsh-history-enquirer"&gt;https://github.com/zthxxx/zsh-history-enquirer&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/zthxxx"&gt;zthxxx&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 14&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  colorls&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; A Ruby gem that beautifies the terminal's ls command, with color and font-awesome icons. 🎉 &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/athityakumar/colorls"&gt;https://github.com/athityakumar/colorls&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/athityakumar"&gt;athityakumar&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 2,896&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  fonts&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Patched fonts for Powerline users. &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/powerline/fonts"&gt;https://github.com/powerline/fonts&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/powerline"&gt;powerline&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 18,578&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  agnoster-zsh-theme&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; A ZSH theme designed to disclose information contextually, with a powerline aesthetic &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/agnoster/agnoster-zsh-theme"&gt;https://github.com/agnoster/agnoster-zsh-theme&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/agnoster"&gt;agnoster&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 2,491&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  nerd-fonts&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Iconic font aggregator, collection, &amp;amp; patcher. 3,600+ icons, 50+ patched fonts: Hack, Source Code Pro, more. Glyph collections: Font Awesome, Material Design Icons, Octicons, &amp;amp; more &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/ryanoasis/nerd-fonts"&gt;https://github.com/ryanoasis/nerd-fonts&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/ryanoasis"&gt;ryanoasis&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 19,922&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  fzf&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; 🌸 A command-line fuzzy finder &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/junegunn/fzf"&gt;https://github.com/junegunn/fzf&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/junegunn"&gt;junegunn&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 27,489&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  mac-setup-script&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; script to setup my mac &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/pathikrit/mac-setup-script"&gt;https://github.com/pathikrit/mac-setup-script&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/pathikrit"&gt;pathikrit&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 111&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  awk-anti-textbook&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; learn awk by example &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/thewhitetulip/awk-anti-textbook"&gt;https://github.com/thewhitetulip/awk-anti-textbook&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/thewhitetulip"&gt;thewhitetulip&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 524&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  brunsli&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Practical JPEG Repacker &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/google/brunsli"&gt;https://github.com/google/brunsli&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/google"&gt;google&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 503&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  handoff-visualizer&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; 📶📱🚗 Wireless Network Handoff Visualizer built with React! &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/chonyy/handoff-visualizer"&gt;https://github.com/chonyy/handoff-visualizer&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/chonyy"&gt;chonyy&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 113&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  webpack-reporter-plugin&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; A plugin to customize webpack's output &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/misterdev/webpack-reporter-plugin"&gt;https://github.com/misterdev/webpack-reporter-plugin&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/misterdev"&gt;misterdev&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 10&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  graphql-schema-linter&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Validate GraphQL schema definitions against a set of rules &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/cjoudrey/graphql-schema-linter"&gt;https://github.com/cjoudrey/graphql-schema-linter&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/cjoudrey"&gt;cjoudrey&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 332&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  isolated-vm&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Secure &amp;amp; isolated JS environments for nodejs &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/laverdet/isolated-vm"&gt;https://github.com/laverdet/isolated-vm&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/laverdet"&gt;laverdet&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 555&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  posthog&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; 🦔 PostHog is developer-friendly, open-source product analytics. &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/PostHog/posthog"&gt;https://github.com/PostHog/posthog&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/PostHog"&gt;PostHog&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 1,427&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  react-hook-form&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; 📋 React hooks for forms validation without the hassle. &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/react-hook-form/react-hook-form"&gt;https://github.com/react-hook-form/react-hook-form&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/react-hook-form"&gt;react-hook-form&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 7,861&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  react-query-devtools&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; ⚛️ Devtools for React Query &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/tannerlinsley/react-query-devtools"&gt;https://github.com/tannerlinsley/react-query-devtools&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/tannerlinsley"&gt;tannerlinsley&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 298&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  react-workshop-app&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; An abstraction for all my React workshops &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/kentcdodds/react-workshop-app"&gt;https://github.com/kentcdodds/react-workshop-app&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/kentcdodds"&gt;kentcdodds&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 22&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  bad-asn-list&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; List of bad Autonomous System Numbers (ASN) to block possible automated botnets &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/LorenzoSapora/bad-asn-list"&gt;https://github.com/LorenzoSapora/bad-asn-list&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/LorenzoSapora"&gt;LorenzoSapora&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 15&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  storybook-addon-playroom&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Design with Playroom inside Storybook, using each story source as a starting point &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/rbardini/storybook-addon-playroom"&gt;https://github.com/rbardini/storybook-addon-playroom&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/rbardini"&gt;rbardini&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 29&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  gosparkpost&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; SparkPost client library for the Go Programming Language &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/SparkPost/gosparkpost"&gt;https://github.com/SparkPost/gosparkpost&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/SparkPost"&gt;SparkPost&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 57&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  csswg-drafts&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; CSS Working Group Editor Drafts &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/w3c/csswg-drafts"&gt;https://github.com/w3c/csswg-drafts&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/w3c"&gt;w3c&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 2,146&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  universal-tilt.js&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; 🎆 Parallax tilt effect library &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/JB1905/universal-tilt.js"&gt;https://github.com/JB1905/universal-tilt.js&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/JB1905"&gt;JB1905&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 97&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  flutter&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Flutter makes it easy and fast to build beautiful mobile apps. &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/flutter/flutter"&gt;https://github.com/flutter/flutter&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/flutter"&gt;flutter&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 87,948&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  js-beautify&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Beautifier for javascript &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/beautify-web/js-beautify"&gt;https://github.com/beautify-web/js-beautify&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/beautify-web"&gt;beautify-web&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 6,669&lt;br&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  formik&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Build forms in React, without the tears 😭 &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/jaredpalmer/formik"&gt;https://github.com/jaredpalmer/formik&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/jaredpalmer"&gt;jaredpalmer&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 20,967&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Want a personalized version of these lists in your inbox every week?
&lt;/h3&gt;

&lt;p&gt;Then sign up for &lt;a href="https://www.ryanjyost.com/follow-the-stars"&gt;Follow the Stars - a weekly email with the projects that the folks you follow on GitHub have starred&lt;br&gt;
.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>npm</category>
    </item>
    <item>
      <title>7 projects starred by top JavaScript developers that you should check out</title>
      <dc:creator>Ryan Yost</dc:creator>
      <pubDate>Sun, 01 Mar 2020 21:15:50 +0000</pubDate>
      <link>https://dev.to/ryanjyost/7-projects-starred-by-top-javascript-developers-that-you-should-check-out-1k14</link>
      <guid>https://dev.to/ryanjyost/7-projects-starred-by-top-javascript-developers-that-you-should-check-out-1k14</guid>
      <description>&lt;p&gt;A list of GitHub projects that were starred by multiple top JavaScript developers in the past 6 months. Read more about&lt;br&gt;
 the methodolgy at the end of the post.&lt;/p&gt;

&lt;h3&gt;
  
  
  Want a personalized version of these lists in your inbox every week?
&lt;/h3&gt;

&lt;p&gt;Then sign up for &lt;a href="https://www.ryanjyost.com/follow-the-stars"&gt;Follow the Stars - a weekly email with the projects that the folks you follow on GitHub have starred&lt;br&gt;
.&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  react-adaptive-hooks&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Deliver experiences best suited to a user's device and network constraints &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/GoogleChromeLabs/react-adaptive-hooks"&gt;https://github.com/GoogleChromeLabs/react-adaptive-hooks&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/GoogleChromeLabs"&gt;GoogleChromeLabs&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 3,920&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  rome&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; An experimental JavaScript toolchain &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/facebookexperimental/rome"&gt;https://github.com/facebookexperimental/rome&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/facebookexperimental"&gt;facebookexperimental&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 3,246&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  1on1-questions&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Mega list of 1 on 1 meeting questions compiled from a variety to sources &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/VGraupera/1on1-questions"&gt;https://github.com/VGraupera/1on1-questions&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/VGraupera"&gt;VGraupera&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 6,518&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  vanillawebprojects&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Mini projects built with HTML5, CSS &amp;amp; JavaScript. No frameworks or libraries &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/bradtraversy/vanillawebprojects"&gt;https://github.com/bradtraversy/vanillawebprojects&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/bradtraversy"&gt;bradtraversy&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 3,820&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  playwright&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Node library to automate Chromium, Firefox and WebKit with a single API &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/microsoft/playwright"&gt;https://github.com/microsoft/playwright&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/microsoft"&gt;microsoft&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 9,935&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  react-helmet&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; A document head manager for React &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/nfl/react-helmet"&gt;https://github.com/nfl/react-helmet&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/nfl"&gt;nfl&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 12,604&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  linaria&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Zero-runtime CSS in JS library &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo URL:&lt;/strong&gt; &lt;a href="https://github.com/callstack/linaria"&gt;https://github.com/callstack/linaria&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repo Owner:&lt;/strong&gt; &lt;a href="https://github.com/callstack"&gt;callstack&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Stars:&lt;/strong&gt; 4,940&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Want more project recs?
&lt;/h3&gt;

&lt;p&gt;I'm always late to find out about cool/amazing/game-changing/time-saving JavaScript-related projects,&lt;br&gt;
so I'm experimenting with ways to uncover potentially helpful tools and resources every week.&lt;/p&gt;

&lt;p&gt;So to get more of these project recommendation lists, &lt;a href="https://www.ryanjyost.com/subscribe"&gt;join my mailing list&lt;/a&gt; or &lt;a href="https://twitter.com/ryanjyost"&gt;follow me on Twitter @ryanjyost&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How the list was built
&lt;/h3&gt;

&lt;p&gt;The projects below were starred by multiple experienced, influential developers, which I compiled from Googling&lt;br&gt;
 "JavaScript developers to follow" and looking at who I currently follow on Twitter. Their GitHub usernames are &lt;em&gt;addyosmani, paulirish, thefoxis, umaar, elijahmanor, jeresig, dshaw, kentcdodds, johnpapa, darkwing, sachag, wesbos, getify, markdalgleish, chriscoyier, mdo, ry, yyx990803, Rich-Harris, sdras, emmabostian, markerikson, btholt, benlesh&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;For each developer, I used GitHub's starring api to fetch their recently starred repos, limited the scope to the past 6 months, filtered out non JavaScript/TypeScript repos, then counted total stars form the user list for each repo and found the projects with multiple stars.&lt;/p&gt;

&lt;p&gt;Here's a gist with some messy code that does it.&lt;br&gt;
&lt;a href="https://gist.github.com/ryanjyost/3e04237e11156c0784a7f101b4efc144#file-getstars-js"&gt;https://gist.github.com/ryanjyost/3e04237e11156c0784a7f101b4efc144#file-getstars-js&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>npm</category>
    </item>
    <item>
      <title>How to analyze your npm dependencies for better, more maintainable code</title>
      <dc:creator>Ryan Yost</dc:creator>
      <pubDate>Fri, 28 Feb 2020 03:35:49 +0000</pubDate>
      <link>https://dev.to/ryanjyost/how-to-analyze-your-npm-dependencies-for-better-more-maintainable-code-1kpm</link>
      <guid>https://dev.to/ryanjyost/how-to-analyze-your-npm-dependencies-for-better-more-maintainable-code-1kpm</guid>
      <description>&lt;p&gt;In this guide, I’m going to walk you through the things I consider when assessing the state of my npm dependencies, with&lt;br&gt;
the goal of improving my software and making it more maintainable.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why read this?
&lt;/h2&gt;

&lt;p&gt;With the growing sophistication and complexity of the JavaScript ecosystem comes an increased reliance on third party&lt;br&gt;
&lt;a href="https://npmjs.org"&gt;npm&lt;/a&gt; dependencies.&lt;/p&gt;

&lt;p&gt;Back in the day, you used to be able to rely on vanilla JS or jQuery to handle the interactivity of your applications. But now, powerful frameworks like React, Vue, etc. and the myriad amazing libraries that work with them make it super beneficial to leverage open source solutions to our technical problems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://npmjs.org"&gt;npm&lt;/a&gt; makes it easy to incorporate these third party solutions into our code - &lt;strong&gt;&lt;em&gt;so&lt;/em&gt;&lt;/strong&gt; easy, that we can take our&lt;br&gt;
deps for granted and forget that they aren’t just magical black-boxes that we can stop worrying about once&lt;br&gt;
implemented.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lots can evolve - and devolve - about your dependencies that can bite your code in the ass if you aren’t paying&lt;br&gt;
attention.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Why I wrote this
&lt;/h2&gt;

&lt;p&gt;On multiple occasions, I’ve inherited a legacy codebase and/or been tasked with updating a codebase's dependencies.&lt;br&gt;
Besides just checking how many versions behind the deps are, I do a deep dive to uncover changes or potential issues, which takes a lot of manual internet research.&lt;/p&gt;

&lt;p&gt;To scratch my own itch and save time when assessing the current health of my dependencies, I built a simple tool that automatically gathers info about, and analyzes, the&lt;br&gt;
dependencies in a &lt;code&gt;package.json&lt;/code&gt; file. It basically does what this article walks through.&lt;/p&gt;

&lt;p&gt;The tool is called &lt;a href="https://depchecker.com"&gt;DepChecker&lt;/a&gt; and I put it up at &lt;a href="https://depchecker.com"&gt;DepChecker.com&lt;/a&gt;.&lt;br&gt;
Hope it helps folks!&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m7imILM5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/depchecker/depchecker_results_1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m7imILM5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/depchecker/depchecker_results_1.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Ok, let's analyze some dependencies
&lt;/h2&gt;

&lt;p&gt;The process for auditing your dependencies is basically like a nested &lt;code&gt;for&lt;/code&gt; loop...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;dependency&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;infoAboutDependency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;factor&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;factors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;gatherInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dependency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;factor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;infoAboutDependency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;makeAssessment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;infoAboutDependency&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;There are a variety of useful factors that shed light on the state of your dependencies. The list we'll walk through&lt;br&gt;
isn't exhaustive, but it's the one I use and is pretty thorough.&lt;/p&gt;

&lt;h4&gt;
  
  
  The factors to consider are...
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;What does the dependency do?&lt;/li&gt;
&lt;li&gt;Is the dependency still being used in your project?&lt;/li&gt;
&lt;li&gt;Versions behind the latest release&lt;/li&gt;
&lt;li&gt;When was the dependency last updated?&lt;/li&gt;
&lt;li&gt;How many weekly downloads?&lt;/li&gt;
&lt;li&gt;How many GitHub stars?&lt;/li&gt;
&lt;li&gt;How many open issues and pull requests?&lt;/li&gt;
&lt;li&gt;What’s the project's license?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;For each factor, I'll break down the following things...&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exactly &lt;strong&gt;what&lt;/strong&gt; it is&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where&lt;/strong&gt; to find info about it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How&lt;/strong&gt; to assess and make sense of the info you find&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why&lt;/strong&gt; you should care&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Factor 1: What does the dependency do?
&lt;/h3&gt;

&lt;p&gt;Before anything, you need to understand what your dependencies do and their role in your project. I've definitely been&lt;br&gt;
guilty of seeing a dependency name I don't recognize in my &lt;code&gt;package.json&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Where to find info about it
&lt;/h4&gt;

&lt;p&gt;A combination of...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the package's page on npmjs.org (e.g. &lt;a href="https://www.npmjs.com/package/react"&gt;React&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;the GitHub repository (e.g. &lt;a href="https://github.com/expressjs/express"&gt;Express&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;and, if available, the project's site/documentation (e.g. &lt;a href="https://vuejs.org/"&gt;Vue.js&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...should be plenty to understand its purpose.&lt;/p&gt;

&lt;p&gt;Manually searching for each dependency can be annoying, so you can use a tool like&lt;br&gt;
&lt;a href="https://www.depchecker.com"&gt;DepChecker&lt;/a&gt;, which quickly gathers the description and all of the important links for you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4287rarl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/depchecker/depchecker_links.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4287rarl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/depchecker/depchecker_links.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  How to assess the info
&lt;/h4&gt;

&lt;p&gt;When starting your dependency audit, it's probably sufficient to just read the description and main points.&lt;br&gt;
Later on, if other factors warrant, you can dive deeper into the documentation to better understand it and help&lt;br&gt;
determine to what extent it belongs in your project.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why you should care
&lt;/h4&gt;

&lt;p&gt;Even if not for dependency management/analysis purposes, it's always best to understand what dependencies are in your&lt;br&gt;
project, what they do and why your project uses them. Otherwise, you can be ignoring old, unused or potentially&lt;br&gt;
dangerous dependencies that'll bring nothing but confusion and headaches to your team down the road.&lt;/p&gt;

&lt;h3&gt;
  
  
  Factor 2: Is the dependency still being used in your project?
&lt;/h3&gt;

&lt;p&gt;It's quite common for a dependency to be installed and used in a project, then to have all uses of it&lt;br&gt;
removed for various reasons but still leave the dependency in there. This is the low hanging fruit of dependency&lt;br&gt;
management.&lt;/p&gt;

&lt;h4&gt;
  
  
  Where to find info about it
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;The easiest way to uncover &lt;em&gt;potentially&lt;/em&gt; unused dependencies, ironically, is another open source npm tool called
&lt;a href="https://www.npmjs.com/package/depcheck"&gt;depcheck&lt;/a&gt;. Once installed, you can run a simple command to get a list of dependencies
that it can't find references to in your project.&lt;/li&gt;
&lt;li&gt;Perform a global text search for the dependency name and see if it's being used anywhere.&lt;/li&gt;
&lt;li&gt;Sometimes, weird dependencies like babel plugins won't show up exactly in your project, but they are still being
used. So one way to check whether it's needed is to remove it and run your app along with any tests.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  How to assess the info
&lt;/h4&gt;

&lt;p&gt;Corresponding to the numbered points above...&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Be careful!&lt;/strong&gt; depcheck is awesome, but it's not 100% accurate, so you should verify some other things before
deleting it from your &lt;code&gt;package.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If it's imported, is the module actually used in the code? If not, then maybe it's no longer needed.&lt;/li&gt;
&lt;li&gt;If the tests pass and all looks good, it can be reasonably assumed that the dependency isn't needed anymore.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Why you should care
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Unused dependencies just add dead kilobytes to your bundles and bloat to your project, increasing load times.&lt;/li&gt;
&lt;li&gt;Future contributors to your codebase might think it's OK or even encouraged to use the dependency if it's already
installed, which might not be ideal for your team and the code practices you try to implement.&lt;/li&gt;
&lt;li&gt;An unused dependency just sitting in your project can introduce a compiling/transpiling bug or security vulnerability down the road.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Factor 3: Versions behind the latest release
&lt;/h3&gt;

&lt;p&gt;All npm packages have a latest stable release version, whereas your &lt;code&gt;package.json&lt;/code&gt; specifies a version of the package that it currently uses.&lt;br&gt;
So your project's version can match the latest release, or be some version before it.&lt;/p&gt;

&lt;p&gt;Here are some links for more background info...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.npmjs.com/files/package.json#dependencies"&gt;npm project dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.npmjs.com/files/package.json#version"&gt;npm package version&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://semver.org/"&gt;official semver versioning docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.npmjs.com/about-semantic-versioning"&gt;npm's take on semver&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Where to find info about it
&lt;/h4&gt;

&lt;p&gt;To find the &lt;strong&gt;npm package's latest release version&lt;/strong&gt;, you can go to it's offical &lt;a href="//npmjs.org"&gt;npmjs.org&lt;/a&gt; page and find it in the details on the right side.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XNS_2sxt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/depchecker/depchecker_npm_version.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XNS_2sxt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/depchecker/depchecker_npm_version.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To find &lt;strong&gt;your project's version&lt;/strong&gt;, go to your &lt;code&gt;package.json&lt;/code&gt; and find the package name key in the object of &lt;code&gt;dependencies&lt;/code&gt; or &lt;code&gt;devDependencies&lt;/code&gt;, and the project version will be the value for that key.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xMwt03_2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/depchecker/depchecker_package_version.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xMwt03_2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/depchecker/depchecker_package_version.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With tools like &lt;a href="https://www.npmjs.com/package/npm-check"&gt;npm-check&lt;/a&gt; and &lt;a href="https://www.depchecker.com"&gt;DepChecker&lt;/a&gt;, you can get a nice, color-coded printout of the latest version, your version AND how far behind your version is.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aSXSvmPW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/depchecker/depchecker_versionsBehind.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aSXSvmPW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/depchecker/depchecker_versionsBehind.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  How to assess the info
&lt;/h4&gt;

&lt;p&gt;The vast majority of npm package versioning will use the &lt;a href="https://semver.org/"&gt;semver&lt;/a&gt; &lt;code&gt;MAJOR.MINOR.PATCH&lt;/code&gt; format,&lt;br&gt;
which makes it pretty easy to figure out how far behind your project version is and how much potential risk there is to upgrading.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PATCH (x.x.0)&lt;/strong&gt; -&lt;br&gt;
This denotes "backwards compatible bug fixes." So if your version is just patches behind (like the lodash example in the screenshots above), you can pretty safely just bump the version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MINOR (x.0.x)&lt;/strong&gt; -&lt;br&gt;
This denotes new functionality that's been added "in a backwards compatible manner". Again, probably safe to upgrade so long as tests all pass.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MAJOR (0.x.x)&lt;/strong&gt; -&lt;br&gt;
This denotes "incompatible API changes" and requires diving into the changelogs, release notes, and other documentation in order to figure out the implications of doing a &lt;code&gt;MAJOR&lt;/code&gt; version upgrade.&lt;br&gt;
You'll probably need to do some manual refactoring with a major version upgrade!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;As a general note&lt;/strong&gt;, upgrading your project's dependency versions is safest with plenty of test coverage and a CI/CD pipeline.&lt;br&gt;
Awesome free tools like &lt;a href="https://dependabot.com/"&gt;dependabot&lt;/a&gt; can help automate this for you.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why you should care
&lt;/h4&gt;

&lt;p&gt;This is the factor most commonly thought of when it comes to dependency management, for good reason!&lt;br&gt;
Staying up-to-date gives you access to the latest and greatest, and helps avoid getting so far behind the current version that major bugs emerge or upgrading becomes a nightmare.&lt;/p&gt;

&lt;h3&gt;
  
  
  Factor 4: When was the dependency last updated?
&lt;/h3&gt;

&lt;p&gt;Whenever an npm package has a new version, it needs to be uploaded and published to the npm repository.&lt;br&gt;
The most recent time that this occurred is called the "Last Publish". So, you can say something like "React's last publish was 2 weeks ago."&lt;/p&gt;

&lt;h4&gt;
  
  
  Where to find info about it
&lt;/h4&gt;

&lt;p&gt;You can quickly find how long it's been since the last publish on a package's npm page.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Dtam_prL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/depchecker/depchecker_npm_lastPublish.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Dtam_prL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/depchecker/depchecker_npm_lastPublish.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For more details about exact dates of version releases, you'll have to check out any releases on GitHub or use the npm repository API.&lt;/p&gt;

&lt;h4&gt;
  
  
  How to assess the info
&lt;/h4&gt;

&lt;p&gt;Generally speaking, it's a great sign if an npm package is constantly being updated and has a recent last publish date - it signifies that the contributors are actively involved and care about the dependency.&lt;/p&gt;

&lt;p&gt;If a package hasn't been updated for a year or more, on the other hand, that could signify that the package is no longer maintained and neglected.&lt;/p&gt;

&lt;p&gt;How to interpret the exact time since last publish can vary from package to package depending on its nature.&lt;br&gt;
For example, a library of basic statistics probably doesn't need to be updated that often.&lt;br&gt;
Though in the modern age of JavaScript, not updating for a while has the potential for compiling issues or incompatible versions of other dependencies.&lt;/p&gt;

&lt;p&gt;I have some general, subjective rules-of-thumb in my head for how long it's been since the last publish...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;less than 2 months - GOOD&lt;/li&gt;
&lt;li&gt;less than 6 months - FINE&lt;/li&gt;
&lt;li&gt;less than a year ago - WARNING&lt;/li&gt;
&lt;li&gt;more than a year ago - DANGER&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Why you should care
&lt;/h4&gt;

&lt;p&gt;The time since last publish is a very strong indicator of the care and attention that an open source npm package has.&lt;/p&gt;

&lt;p&gt;If a dependency of yours is updated very often, it generally means you can confidently continue to use it and benefit from improvements in the future.&lt;br&gt;
On the other hand, a neglected package threatens your codebase and likely needs to be replaced by a comparable dependency before it causes bugs and issues for your team.&lt;/p&gt;

&lt;h3&gt;
  
  
  Factor 5: How many weekly downloads?
&lt;/h3&gt;

&lt;p&gt;Whenever someone installs an npm package, it counts as a download. npm keeps track of these downloads and provides a weekly downloads metric for all packages.&lt;/p&gt;

&lt;h4&gt;
  
  
  Where to find info about it
&lt;/h4&gt;

&lt;p&gt;It's easy to find on a package's npm page. You can also see a trend line there.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F5U34Gbs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/depchecker/depchecker_npm_downloads.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F5U34Gbs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/depchecker/depchecker_npm_downloads.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  How to assess the info
&lt;/h4&gt;

&lt;p&gt;This weekly downloads metric indicates to what extent that the dependency is being used by other developers.&lt;br&gt;
&lt;em&gt;Of course a download doesn't 100% mean the developer ended up keeping the dependency, but it's still a useful indicator.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here are my subjective rules-of-thumb for weekly download counts...&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;more than 100,000 - GOOD&lt;/li&gt;
&lt;li&gt;less than 100,000 - FINE&lt;/li&gt;
&lt;li&gt;less than 10,000 - WARNING&lt;/li&gt;
&lt;li&gt;less than 1,000 - BAD&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Trends in downloads are also helpful.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If going up, it could mean that the low download count is due to the package being young but still valuable.&lt;/li&gt;
&lt;li&gt;If going down, it could mean that the package has a superior alternative, that it's neglected, that it isn't needed anymore, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In addition to the tiny trend line on the npmjs.org site, there's a cool website called &lt;a href="https://www.npmtrends.com/"&gt;npm trends&lt;/a&gt; where you can dive deep into npm download trends.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why you should care
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;How popular am npm package is can mean a lot for its future, and therefore the future of your software.&lt;/li&gt;
&lt;li&gt;When deciding on what npm package alternative (e.g. Angular vs. React vs. Vue) to use in your project, the download trends can be telling of what the community thinks is superior/inferior.&lt;/li&gt;
&lt;li&gt;Downward trends can warn you about a dying dependency and allow you to preemptively remove or replace it before it negatively impacts your project.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Factor 6: How many GitHub stars?
&lt;/h3&gt;

&lt;p&gt;Projects on GitHub, where the vast majority of npm package repositories are, have a star system, which is basically how people can "like" a project.&lt;/p&gt;

&lt;h4&gt;
  
  
  Where to find info about it
&lt;/h4&gt;

&lt;p&gt;Pretty simple - just go to the GitHub repository for the npm package and the star count is on the top of the page.&lt;/p&gt;

&lt;h4&gt;
  
  
  How to assess the info
&lt;/h4&gt;

&lt;p&gt;Obviously, the more stars a repo has, the more popular and beloved by developers it is. A high star count usually indicates that the project works well and serves the purpose that it says it does in a way that devs love.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BUT BE CAREFUL&lt;/strong&gt;! A high star count is not enough to sign off on using/keeping a dependency, because stars accumulate over time. It's possible that the project has 20k stars, but the last star was a year ago, or it's just deprecated.&lt;/p&gt;

&lt;p&gt;Like the weekly downloads, trends are just as important as the current total of stars. There's a couple cool websites like &lt;a href="https://star-history.t9t.io/"&gt;Star History&lt;/a&gt; and &lt;a href="https://stars.przemeknowak.com/"&gt;this one&lt;/a&gt; that show Github star trend lines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here are my subjective rules-of-thumb for GitHub stars...&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;more than 1,000 - GOOD&lt;/li&gt;
&lt;li&gt;less than 1,000 - FINE&lt;/li&gt;
&lt;li&gt;less than 300 - WARNING&lt;/li&gt;
&lt;li&gt;less than 50 - BAD&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Why you should care
&lt;/h4&gt;

&lt;p&gt;Basically the same reasons as weekly downloads!&lt;/p&gt;

&lt;h3&gt;
  
  
  Factor 7: How many open issues and pull requests?
&lt;/h3&gt;

&lt;p&gt;The beauty of open source projects is that anyone can provide feedback and contribute in the form of GitHub issues, which can become pull requests for potentially incorporating new code into the master branch and ultimately releasing an updated version.&lt;/p&gt;

&lt;h4&gt;
  
  
  Where to find info about it
&lt;/h4&gt;

&lt;p&gt;In addition to going directly to the source on GitHub, npm provides the breakdown.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4kGPhToZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/depchecker/depchecker_npm_issues.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4kGPhToZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/depchecker/depchecker_npm_issues.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  How to assess the info
&lt;/h4&gt;

&lt;p&gt;The number of open issues and pull requests can indicate a few things...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How active the open source community surrounding the project is.&lt;/li&gt;
&lt;li&gt;To what extent the project has bugs or lacks desired functionality&lt;/li&gt;
&lt;li&gt;How active the maintainers are&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the number of open pull requests is high, that could show the community is desperate for improvements but the maintainers are asleep at the wheel or not accepting outside help - not a good sign.&lt;/p&gt;

&lt;p&gt;The absolute number of open issues and PRs can be misleading - bigger projects with more users should naturally have more issues on GitHub, and vice versa.&lt;/p&gt;

&lt;p&gt;So you'll want to normalize the number of open issues in your head to account for this. While far from scientific, you could think of a rough ratio of open issues and PRs to weekly downloads. The smaller the ratio, the better.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why you should care
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Lots of issues means an active user base for the dependency, which can mean it'll be maintained regularly and be safe to use long-term.&lt;/li&gt;
&lt;li&gt;Tons of bugs in the open pull requests isn't a great sign for a piece of software you want to include in your own.&lt;/li&gt;
&lt;li&gt;Good and bad signs can be gleaned from the current state of a dependency's open issues and pull requests - so it's valuable to pay attention!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Factor 8: What's the project license?
&lt;/h3&gt;

&lt;p&gt;Open source projects like npm dependencies have a license attached to them, which dictates how the project can be used and other legal stuff.&lt;/p&gt;

&lt;h4&gt;
  
  
  Where to find info about it
&lt;/h4&gt;

&lt;p&gt;You can find an npm package's license on its npm page.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--guwLb_KA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/depchecker/depchecker_npm_license.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--guwLb_KA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://yosts-posts.s3.amazonaws.com/depchecker/depchecker_npm_license.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For details of particular licenses, Google and this &lt;a href="https://choosealicense.com/appendix/"&gt;table-breakdown&lt;/a&gt; are helpful.&lt;/p&gt;

&lt;h4&gt;
  
  
  How to assess the info
&lt;/h4&gt;

&lt;p&gt;I'm by no means a legal expert, but there's a spectrum of licenses that can be attributed to open source dependencies.&lt;/p&gt;

&lt;p&gt;Most of them you don't have to worry about, but if an npm dependency of yours doesn't use the classic, free-reign MIT license, then it's prudent that you figure out the implications of the license for your software, especially if using in commercial software.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@vovabilonenko/licenses-of-npm-dependencies-bacaa00c8c65"&gt;Here's a great article with more on that.&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Why you should care
&lt;/h4&gt;

&lt;p&gt;I'm sure the legal team at your company does! &lt;br&gt;
If you mistakenly use an npm dependency in a manner against the license, then you expose your software and company to legal issues and other avoidable problems!&lt;/p&gt;

&lt;h2&gt;
  
  
  And that's it!
&lt;/h2&gt;

&lt;p&gt;This is just one way to approach npm dependency management - hope it helps you with your dependencies!&lt;/p&gt;

&lt;h3&gt;
  
  
  List of tools to help you manage dependencies
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://depchecker.com"&gt;DepChecker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/depcheck"&gt;depcheck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/npm-check"&gt;npm-check&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dependabot.com/"&gt;dependabot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmtrends.com/"&gt;npm trends&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://star-history.t9t.io/"&gt;Star History&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stars.przemeknowak.com/"&gt;stars.przemeknowak.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://choosealicense.com/appendix/"&gt;choosealicense.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Other links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://npmjs.org"&gt;npm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.npmjs.com/files/package.json#dependencies"&gt;npm project dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.npmjs.com/files/package.json#version"&gt;npm package version&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://semver.org/"&gt;official semver versioning docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.npmjs.com/about-semantic-versioning"&gt;npm's take on semver&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>npm</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
