<?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: artem avetisyan</title>
    <description>The latest articles on DEV Community by artem avetisyan (@artemave).</description>
    <link>https://dev.to/artemave</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%2F173175%2F0da7d602-d187-41fe-ba42-b07c04070835.png</url>
      <title>DEV Community: artem avetisyan</title>
      <link>https://dev.to/artemave</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/artemave"/>
    <language>en</language>
    <item>
      <title>Building a documentation website</title>
      <dc:creator>artem avetisyan</dc:creator>
      <pubDate>Fri, 07 Jun 2019 08:52:24 +0000</pubDate>
      <link>https://dev.to/featurist/building-a-documentation-website-1f5d</link>
      <guid>https://dev.to/featurist/building-a-documentation-website-1f5d</guid>
      <description>&lt;p&gt;&lt;em&gt;Original post - &lt;a href="https://featurist.co.uk/blog/building-documentation-website/"&gt;https://featurist.co.uk/blog/building-documentation-website/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So you want a documentation website for your project. You already have a good project README.md, but turning it into website seems like a big and intimidating task. Probably also because building a website is sufficiently different from whatever you are doing on your project. Even - somewhat bizarrely - if your project is related to building websites!&lt;/p&gt;

&lt;p&gt;Anyway, like it often happens with things that seem big and intimidating, it turns out to be not that bad when you get right down to it.&lt;/p&gt;

&lt;p&gt;Building documentation websites is no exception. All it takes is a few good tools put together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basic website
&lt;/h2&gt;

&lt;p&gt;The crown jewel in our toolset is &lt;a href="https://docsify.js.org/#/"&gt;Docsify&lt;/a&gt;. Docsify turns a bunch of markdown files into a beautiful website literally in minutes. There is code highlighting, full text search, themes and more. There is even a &lt;a href="https://codefund.io/"&gt;codefund&lt;/a&gt; plugin to make you rich. But, above all, it just works and it's easy to use. Follow their &lt;a href="https://docsify.js.org/#/quickstart"&gt;Quick Start&lt;/a&gt; to get going.&lt;/p&gt;

&lt;p&gt;This implies you'll need to chop the README into some sensible bits. By the end of this exercise, you'll likely end up with a &lt;code&gt;/docs&lt;/code&gt; folder containing Docsify's &lt;code&gt;index.html&lt;/code&gt;. It's a static website, serve it locally to test. For example, with &lt;a href="https://www.npmjs.com/package/serve"&gt;serve&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;serve ./docs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Publishing
&lt;/h2&gt;

&lt;p&gt;There are many ways to host a static website. By far the simplest option is to use &lt;a href="https://pages.github.com/"&gt;GitHub Pages&lt;/a&gt;. This way it's all within GitHub - no need for external tools, accounts, integrations, etc.&lt;/p&gt;

&lt;p&gt;In the repository setting, there is a GitHub Pages section where you need to choose "master branch /docs folder" option and that's all it takes for &lt;code&gt;https://&amp;lt;yourname&amp;gt;.github.io/&amp;lt;yourproject&amp;gt;&lt;/code&gt; to get published. Further changes do the &lt;code&gt;/docs&lt;/code&gt; on master branch will be automatically published too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Runnable examples
&lt;/h2&gt;

&lt;p&gt;So far our website looks pretty good. But, let's face it, it's little more than a glorified github readme. There's got to be something more than to justify us pushing users to click an extra link and familiarize themselves with a new ui.&lt;/p&gt;

&lt;p&gt;What that killer feature could be depends on the nature of the project. But if it has anything to do with javascript, then embedding runnable code examples definitely brings the documentation experience onto the whole new level.&lt;/p&gt;

&lt;p&gt;Docsify comes with a plugin for embedding jsfiddle react/vue snippets. But what about other tech? And what if you need more than just snippets?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codesandbox.io/"&gt;codesandbox&lt;/a&gt; is a great online development environment that can also be embedded in an iframe. It's a perfect fit for showcasing small example projects along side the docs.&lt;/p&gt;

&lt;p&gt;Create a sandbox project, make it work, and then copy an iframe code from the sharing options and paste it into the your markdown. It'll appear on the docsify website in all its glory.&lt;/p&gt;

&lt;p&gt;This approach works great for a couple of examples, but it does not scale very well. As the number of examples grows, it'll get harder to keep them all in check and make sure they keep working.&lt;/p&gt;

&lt;p&gt;One well established way to keep code from such deterioration is to use version control. So we should house all example code in the same repo along side the docs. Luckily, codesandbox allows to download the entire project so this gives us a starting point.&lt;/p&gt;

&lt;p&gt;Next step is naturally to make sure codesandbox is using that code for the embedded projects. And - you guessed it - there is a tool for that too: &lt;a href="https://github.com/featurist/codesandbox-example-links"&gt;codesandbox-example-links&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instead of pasting iframe code in the markdown, we put special markdown links that point to the example project location within the repo. Then &lt;code&gt;codesandbox-example-links&lt;/code&gt; cli turns those links into actual iframes. For example, given a file &lt;code&gt;/docs/doc.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Demo&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;codesandbox&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;/docs/examples/demo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



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

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;npx codesandbox-example-links &lt;span class="nt"&gt;--iframe&lt;/span&gt; &lt;span class="nt"&gt;--output-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;./dist ./docs/&lt;span class="k"&gt;*&lt;/span&gt;.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Will generate this &lt;code&gt;/dist/doc.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Demo&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;iframe&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://codesandbox.io/api/v1/sandboxes/define?embed=1&amp;amp;parameters=N4IgZglgNgpgziAXKAdAIwIZplATgYyVHwHsA7AFxkqRGAB0yACJ-kAB13hgrjcSYBtRixZtqANzYAaEaLYALAJ7sYuACYkAtmzkBdRgF8Qh6SAhl1MAB4oFFLVCIhSlahVoAeAIQARAPIAwgAqAJoACgCiTPaOAHyMnrFQCcxMSTAY6qmi6RQQFLBx4RgEOEwAyhiWaCTWngD0-YUwOaKeWjwYTPgKpXA8ALxsAKrBAGIAtAAcbEwNbY0KmdmMcp616kptLJ7qEBJMEOrDIBjs7GxxjfsSqXK7cPi4EOwUTHAEp5_4DWi4JAA7gNcA0LFZbAArPgga4NJ4vN6LP4kLapJYOFKMExmdgYfAAawwAHMYChoeRnK4qDREHQ5GwyBhOvxWCBlKoNNpJqSKJM4BRSlR1JMLAUZAyQBI1HAIORWWwAIwoAAMqolaTYVgRr3y8qQbIAEio1JotExfDAtCQmAApCoasQgLQYCwK8yWGx2TGOtk6t4wgQMNJOgVC914spQI6e2zJJiTSYkVRkX1OtAAV2g6gjpXw5Uz2ZjEO9jl0aVMkqsKasZHwEHgrODuTYmGwUEmnG4fI5pu07qgGCoArTbN7XJ0BrYg-HFHLLErmpAVgklpr1HrjYNzfkHDzOEmmcssFwA6H8DnIDki6dBJgSkBJA0gaEBjIhmxphAPz-AOBagac52HJOBrCpcgaQ8OlXAFGITQnJhBiYLgAEcsy4AAKRR4LNNgAEoAG5GBg95gGWKAoBIQxEOQmA0IgTC2BQeEKCUWA4BQfA4BhQi1jIa11AzWAUBsdgn14Gj8EHbimAAQQuJgdy4T1cCYDC8MUh5aIoDNcGYJJFR6aS4EGMicEoww4kNcybTAAFzWNTkzW8JZFTaD930_Mwf3-IEQTBWMQPAtxaRcchYPHM0aNQ9CYCw9kcP7EBeLrcL3nk9horo2L4uYoD8KI1MyEi7QUCA6h1AwzR8AzTpKHQVElGkJgyBgQE5IudSUpxb8CF_PyAIFNj4E47jgsg2hEGJSjMCgDDNiUDSdzACDJjAZloCUAQ2GsqBpXyfBugAORgDMYBkOSXgwKBmrgao4H5NQIDAQqPMYOwbM0tIqGsPkKFwe6VtwLQBAzC41EOgZXs_QxDCAA"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"width:100%; height:500px; border:0; border-radius: 4px; overflow:hidden;"&lt;/span&gt; &lt;span class="na"&gt;sandbox=&lt;/span&gt;&lt;span class="s"&gt;"allow-modals allow-forms allow-popups allow-scripts allow-same-origin"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And while we're at it, there is also another magic link that inserts regular markdown code snippets from example projects. This is to spare copy/pasting bits of example projects into the markdown. For example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Demo&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;view-code&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;/docs/examples/demo/file.js#L3-L5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;will be produce (ignore the extra &lt;code&gt;\&lt;/code&gt; - I couldn't find a way to otherwise quote markdown in markdown):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Demo&lt;/span&gt;

&lt;span class="sb"&gt;`\``&lt;/span&gt;js
  // line 3 of file.js
  // line 4
  // line 5
&lt;span class="sb"&gt;`\``&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This is pretty exciting, but we've just introduced a build step. Github Pages does not have a way to run it for us (unless we add &lt;a href="https://jekyllrb.com/"&gt;Jekyll&lt;/a&gt; into the mix). We could keep both source of and built markdown in the repo. It would only be a matter of time, however, until someone starts editing the built markdown instead of the source one and then it's all messed up. So let's not do that.&lt;/p&gt;

&lt;p&gt;In addition to "master branch docs folder", Github Pages has a couple of other options to look for the source of your website. One of them is "gh-pages branch". Whatever is in the root of &lt;code&gt;gh-pages&lt;/code&gt; branch, is going to be served. All we need to do is to run the build step and push the result into the root of &lt;code&gt;gh-pages&lt;/code&gt; branch. And - you guessed it again - there is a tool that's doing just that: &lt;a href="https://www.npmjs.com/package/gh-pages"&gt;gh-pages&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For example, the following command will push the contents of &lt;code&gt;./dist&lt;/code&gt; into the root of &lt;code&gt;gh-pages&lt;/code&gt; branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;npx gh-pages &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; ./dist
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-t&lt;/code&gt; option tells &lt;code&gt;gh-pages&lt;/code&gt; to also include dot files. In our case there is an important one not to miss - &lt;code&gt;.nojekyll&lt;/code&gt;. It tells Github Pages to skip Jekyll build.&lt;/p&gt;

&lt;p&gt;You could have something like this in the &lt;code&gt;package.json&lt;/code&gt; scripts to automate build and publish steps (assuming both &lt;code&gt;codesandbox-example-links&lt;/code&gt; and &lt;code&gt;gh-pages&lt;/code&gt; are added as dependencies):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nl"&gt;"build-website"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rm -rf ./dist &amp;amp;&amp;amp; cp -r ./docs ./dist &amp;amp;&amp;amp; codesandbox-example-links --iframe --output-dir=./dist ./docs/*.md"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"publish-website"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run build-website &amp;amp;&amp;amp; gh-pages -t -d ./dist"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And that's all there is to it. We have a beautiful website with runnable examples.&lt;/p&gt;

&lt;p&gt;The approach outlined in this post was used to create &lt;a href="https://hyperdom.org"&gt;https://hyperdom.org&lt;/a&gt;. Check out github sources for further details.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>docsify</category>
      <category>codesandbox</category>
    </item>
    <item>
      <title>Manage dependency versions</title>
      <dc:creator>artem avetisyan</dc:creator>
      <pubDate>Wed, 05 Jun 2019 12:04:03 +0000</pubDate>
      <link>https://dev.to/featurist/manage-dependency-versions-17on</link>
      <guid>https://dev.to/featurist/manage-dependency-versions-17on</guid>
      <description>&lt;p&gt;&lt;em&gt;Original post &lt;a href="https://featurist.co.uk/blog/keeping-dependencies-up-to-date/"&gt;https://featurist.co.uk/blog/keeping-dependencies-up-to-date/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In the pre &lt;code&gt;yarn.lock&lt;/code&gt;/&lt;code&gt;package-lock.json&lt;/code&gt; era there was only one way to make sure your project does not break tomorrow because of some dependency library introducing a breaking change: setting &lt;em&gt;precise&lt;/em&gt; package versions in &lt;code&gt;package.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&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;"express"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4.17.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sqlite3"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4.0.8"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"left-pad"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.2.0"&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;p&gt;There was a glaring problem there however: nothing guaranteed that the dependencies of dependencies wouldn't move on. Every fresh &lt;code&gt;npm install&lt;/code&gt; - for example when the project is deployed to production - could potentially break. Those were shady times, for the brave to venture.&lt;/p&gt;

&lt;p&gt;Now that there is yarn and &lt;code&gt;package-lock.json&lt;/code&gt; things have finally settled with all versions - not just the explicit dependencies - locked down. As a side effect, there is not much point in keeping versions specified in &lt;code&gt;package.json&lt;/code&gt;. Indeed, once you add a dependency its version is looked up in the lock file and lock file only. We might as well just set all dependency versions to &lt;code&gt;latest&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&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;"express"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"latest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sqlite3"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"latest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"left-pad"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"latest"&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;p&gt;As the time goes on you keep updating dependencies. You should do anyway. Upgrading everything to latest might break things and sometimes those things are easy to fix. Other times - not so much. And sometimes latest versions introduce bugs that you simply can not do anything about.&lt;/p&gt;

&lt;p&gt;So you might choose not to upgrade &lt;em&gt;some&lt;/em&gt; dependencies. And this is the time to go back and swap the &lt;code&gt;latest&lt;/code&gt; on those packages - remember we've set all version to &lt;code&gt;latest&lt;/code&gt; - to whatever version that was known to work.&lt;/p&gt;

&lt;p&gt;The above approach, if applied routinely, will leave you with &lt;code&gt;package.json&lt;/code&gt; where most of the versions are set to &lt;code&gt;latest&lt;/code&gt; with may be a handful more strict ones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&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;"express"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"latest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sqlite3"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"latest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"left-pad"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.2.0"&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;p&gt;This has benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;yarn upgrade&lt;/code&gt; does not upgrade strict versions. So it can be run often without touching the troublesome ones.&lt;/li&gt;
&lt;li&gt;offending packages are visible at a glance in &lt;code&gt;package.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git blame&lt;/code&gt; on the line with a specific version reveals a commit with any details of why upgrading this package was problematic (e.g. link to github issue). This is a nice workaround for the lack of comments in &lt;code&gt;package.json&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>npm</category>
      <category>yarn</category>
    </item>
  </channel>
</rss>
