<?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: Luigi Zaccagnini</title>
    <description>The latest articles on DEV Community by Luigi Zaccagnini (@luigizaccagnini).</description>
    <link>https://dev.to/luigizaccagnini</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%2F701778%2F7e252a15-3a97-47d9-9c78-0d0626811c93.jpeg</url>
      <title>DEV Community: Luigi Zaccagnini</title>
      <link>https://dev.to/luigizaccagnini</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luigizaccagnini"/>
    <language>en</language>
    <item>
      <title>First Week of Telescope</title>
      <dc:creator>Luigi Zaccagnini</dc:creator>
      <pubDate>Sat, 22 Jan 2022 05:03:04 +0000</pubDate>
      <link>https://dev.to/luigizaccagnini/first-week-of-telescope-4f1o</link>
      <guid>https://dev.to/luigizaccagnini/first-week-of-telescope-4f1o</guid>
      <description>&lt;p&gt;This week has been a tough week with the issues I have been trying to solve. This week I was focusing how to start integrating React Native into Telescope through this &lt;a href="https://github.com/Seneca-CDOT/telescope/discussions/2667"&gt;discussion&lt;/a&gt;. A lot of good things came from the discussion like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keeping a Monorepo.&lt;/li&gt;
&lt;li&gt;Deciding on the Expo CLI.&lt;/li&gt;
&lt;li&gt;An idea on a UI library to start with.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After figuring out how to move forward with the React Native, I wanted to fix an issue for the Release but I never got to make it. I was working on &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2511"&gt;CSP error in Dashboard with inline (“script-src” #2511)&lt;/a&gt;. I was able to get &lt;a href="https://content-security-policy.com/examples/allow-inline-script/"&gt;CSP examples&lt;/a&gt; from &lt;a href="https://github.com/AmasiaNalbandian"&gt;Amasia&lt;/a&gt;. After reading through the website I tried the two methods of fixing the issue, hashing the function and putting it in the &lt;code&gt;script-src&lt;/code&gt; or using nonces on the scripts causing the errors. I took me awhile to hack away with these methods as I thought the material-UI library was causing the scripting error but, I figured out that it was not. After trying to use the debugger to figure out the problem I had to take a break and step away from the computer for a little bit. I am hoping to look back at it with a pair of fresh eyes this week and finally close these issues. After I finish this issue and another issue assigned to me, I want to officially kick off React Native development.  &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Getting Telescope's React Native App</title>
      <dc:creator>Luigi Zaccagnini</dc:creator>
      <pubDate>Sat, 15 Jan 2022 00:18:43 +0000</pubDate>
      <link>https://dev.to/luigizaccagnini/getting-telescopes-react-native-app-2h1a</link>
      <guid>https://dev.to/luigizaccagnini/getting-telescopes-react-native-app-2h1a</guid>
      <description>&lt;p&gt;Hello again! It's me, Luigi again and today I am going to talk about the vision of &lt;a href="https://telescope.cdot.systems/"&gt;Telescope&lt;/a&gt; getting a React Native App. This is a very big subject so I am going to go over as much as I can during this blog post. Things I am going to discuss are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is React Native?&lt;/li&gt;
&lt;li&gt;React vs React Native?&lt;/li&gt;
&lt;li&gt;What CLI we should use for our development?&lt;/li&gt;
&lt;li&gt;Possible Telescope Goals&lt;/li&gt;
&lt;li&gt;How can you get started to help?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is React Native?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  React Native?
&lt;/h3&gt;

&lt;p&gt;React Native is a framework that allows programmers to write JavaScript code to build mobile applications. Some of the devices that React Native can build for currently is &lt;strong&gt;IOS&lt;/strong&gt;, &lt;strong&gt;Android&lt;/strong&gt; and &lt;strong&gt;Windows&lt;/strong&gt;(Still new and buggy).&lt;/p&gt;

&lt;h3&gt;
  
  
  React vs React Native
&lt;/h3&gt;

&lt;p&gt;React is a &lt;strong&gt;library&lt;/strong&gt; in &lt;strong&gt;JavaScript&lt;/strong&gt; that is used for building front-end web applications. React Native uses the React library to build the front-end for the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  What React Native CLI Should we use for our Development?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y1ATgNWi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/856/1%2AiUuAwVgvAMXZYNNJnQjcTw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y1ATgNWi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/856/1%2AiUuAwVgvAMXZYNNJnQjcTw.png" alt="React Native Expo" width="856" height="720"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Expo CLI vs React Native CLI
&lt;/h3&gt;

&lt;p&gt;When using React Native and starting a project you have the choice between two CLIs(Command Line Interfaces). You can choose between React Native's or Expo's. Both are awesome tools to build with but, each have their pros and cons.&lt;/p&gt;

&lt;h4&gt;
  
  
  Expo CLI
&lt;/h4&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast development setup&lt;/li&gt;
&lt;li&gt;Quickest way to start development with React Native&lt;/li&gt;
&lt;li&gt;Live reload in Development&lt;/li&gt;
&lt;li&gt;Library linking&lt;/li&gt;
&lt;li&gt;Can test app on apple/android devices (Expo builds apps)&lt;/li&gt;
&lt;li&gt;Can eject/convert back into a React Native CLI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Builds are done by Expo&lt;/li&gt;
&lt;li&gt;Native modules are not supported&lt;/li&gt;
&lt;li&gt;Expo apps are bigger because all libraries are included&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  React Native CLI
&lt;/h4&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Builds are done locally&lt;/li&gt;
&lt;li&gt;Native modules are supported&lt;/li&gt;
&lt;li&gt;You have more control over app size&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slow development setup&lt;/li&gt;
&lt;li&gt;No live reload in Development&lt;/li&gt;
&lt;li&gt;No library linking (things need to be linked with react-native link)&lt;/li&gt;
&lt;li&gt;Can't turn into an expo app&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why I Recommend Expo as our Starting Point?
&lt;/h3&gt;

&lt;p&gt;As someone who has worked with both, I think we should start development with Expo because it is easier/faster to setup for development, easier to develop in and can always be converted back into React Native CLI. This will encourage open source developers to learn and contribute because of how much easier it is to get involved with the project. Although React Native CLI provides native module support and control of the app size, I do not believe that those things are worth the frustration of working with the React Native CLI. If there are more pros or cons you know, please leave a comment in the description.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://telescope.cdot.systems/"&gt;Telescope&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dX6H7300--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d1m75rqqgidzqn.cloudfront.net/wp-data/2021/08/19143713/iStock-986556936-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dX6H7300--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d1m75rqqgidzqn.cloudfront.net/wp-data/2021/08/19143713/iStock-986556936-1.jpg" alt="Target that is red" width="880" height="660"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Starting Point
&lt;/h3&gt;

&lt;p&gt;I think the first goal we should have for functionality of the app is to have blog posts with basic user information display correctly. Although it sounds easy we are designing/developing/testing a new app that requires a lot of configuration, learning and fixing. A more detailed goal list would be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Splash Screen&lt;/li&gt;
&lt;li&gt;App Icon&lt;/li&gt;
&lt;li&gt;Published on app store&lt;/li&gt;
&lt;li&gt;Get time line of blogs to display with user information correctly&lt;/li&gt;
&lt;li&gt;Basic navigation setup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once we hit that goal we can add user authentication and eventually slowly layer more features onto the app and create better work flows with the power of Expo! If you have any ideas to add for goals please comment below!&lt;/p&gt;

&lt;h2&gt;
  
  
  How can you get started to help?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s8PLg4up--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.pexels.com/photos/3280130/pexels-photo-3280130.jpeg%3Fauto%3Dcompress%26cs%3Dtinysrgb%26dpr%3D2%26h%3D650%26w%3D940" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s8PLg4up--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.pexels.com/photos/3280130/pexels-photo-3280130.jpeg%3Fauto%3Dcompress%26cs%3Dtinysrgb%26dpr%3D2%26h%3D650%26w%3D940" alt="Community" width="880" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Well now you're wondering &lt;em&gt;"How can I get involved?"&lt;/em&gt;. Well to start, you should review documentation and practice using Expo so when we start development you're ready! The &lt;a href="https://docs.expo.dev/"&gt;Expo Documentation&lt;/a&gt; is an amazing source for learning how to get started with react native! They teach you everything from installing react native to learning work flows. Once you feel a little comfortable you should make a small prototype! I feel like when I learn a new framework, I try to create a small project to help me understand how to practically use the tool. Some ideas are a TODO app, Book app that displays book information, News app and really anything that inspires you! &lt;/p&gt;

</description>
      <category>opensource</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>reactnative</category>
    </item>
    <item>
      <title>Progress on Terminus </title>
      <dc:creator>Luigi Zaccagnini</dc:creator>
      <pubDate>Sat, 11 Dec 2021 04:52:36 +0000</pubDate>
      <link>https://dev.to/luigizaccagnini/progress-on-terminus-2389</link>
      <guid>https://dev.to/luigizaccagnini/progress-on-terminus-2389</guid>
      <description>&lt;p&gt;So far the problem with Terminus has stayed the same. I am currently trying to find a better way to communicate with the people of the community for my pull request. This repository doesn't get updated quite often so I am hoping that someone can review the pull request soon so I can spend more time improving. Everything was left off with tests working and the headers being passed correctly. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Although this was a short blog post about the status of the pull request, I wanted to go into detail about the entire experience of contributing. When I first picked the issue, I thought I would be working with the Telescope project. I decided to work with this code base because I was very comfortable and understood the project. I also found during this semester that working with newer projects took me a lot longer to learn and setup. Once I found out that I would have to work within Terminus, I was a little intimidated. I was worried it would take time to learn the code and understand how to work with it to get exactly what I needed. Eventually after moving on from being intimidated, I spent each night slowly examining the code and coming up with solutions to the problem. After that process I created the pull request. Working on this problem and the many problems this semester was a journey and I hope to work on more open source projects in the future in OSD700. &lt;/p&gt;

</description>
      <category>opensource</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Working on GoDaddy Terminus</title>
      <dc:creator>Luigi Zaccagnini</dc:creator>
      <pubDate>Fri, 10 Dec 2021 02:36:09 +0000</pubDate>
      <link>https://dev.to/luigizaccagnini/working-on-godaddy-terminus-2lpi</link>
      <guid>https://dev.to/luigizaccagnini/working-on-godaddy-terminus-2lpi</guid>
      <description>&lt;p&gt;Hello! Welcome to another blog post. Today I will be discussing my progress on my &lt;a href="https://github.com/Seneca-CDOT/telescope"&gt;Telescope&lt;/a&gt; issue and how I got to &lt;a href="https://github.com/godaddy/terminus"&gt;Terminus&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Trying to Solve the Problem
&lt;/h2&gt;

&lt;p&gt;To start, I thought I could solve &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2444"&gt;Telescopes Issue&lt;/a&gt; by fixing some code on Telescope or &lt;a href="https://github.com/Seneca-CDOT/satellite"&gt;Satellite&lt;/a&gt; in order for the CORS errors to stop. I soon learned that the main problem wasn't fixable from our code bases and had to be fixed from Terminus. &lt;/p&gt;

&lt;h2&gt;
  
  
  Working on Terminus
&lt;/h2&gt;

&lt;p&gt;Once I moved to &lt;a href="https://github.com/godaddy/terminus/issues/195"&gt;Terminus's issue&lt;/a&gt; I began to start learning the code and ways I can solve the CORS issue. I discussed ways inside the issue thread about how I can solve the CORS issue and how I could add middleware. The proposed ideas were all hypothetical solutions so I didn't know if they could work until I started working in the code. &lt;/p&gt;

&lt;h2&gt;
  
  
  Problems Encountered
&lt;/h2&gt;

&lt;p&gt;While trying to solve this problem I tried to add middleware with &lt;a href="https://github.com/blakeembrey/compose-middleware"&gt;compose-middleware&lt;/a&gt;. While trying to implement it I had troubles with integrating the middleware with the server. Since the middleware wasn't working I attempted to allow users to write headers instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coding in the Terminus Project
&lt;/h2&gt;

&lt;p&gt;Once I got comfortable and understood the code of the project I wanted to create a mock project to help.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&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&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;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&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;terminus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../terminus/index.js&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&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;/&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;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ok&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;app&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;healthCheck&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// `state.isShuttingDown` (boolean) shows whether the server is shutting down or not&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;
    &lt;span class="c1"&gt;// optionally include a resolve value to be included as&lt;/span&gt;
    &lt;span class="c1"&gt;// info in the health check response&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;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;healthChecks&lt;/span&gt;&lt;span class="p"&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;/healthcheck&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;healthCheck&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;verbatim&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="na"&gt;__unsafeExposeStackTraces&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="na"&gt;headers&lt;/span&gt;&lt;span class="p"&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;Access-Control-Allow-Origin&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;*&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;Access-Control-Allow-Methods&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;OPTIONS, POST, GET&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="nx"&gt;terminus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createTerminus&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;options&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;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This test project would help me test if I could pass headers to my local version of Terminus, and if I could fix any CORS related issues with the health check.&lt;/p&gt;

&lt;p&gt;Within Terminus I wrote an extra parameter to allow users to send over their header options:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; decorateWithSignalHandler(server, state, {
    signals,
    onSignal,
    beforeShutdown,
    onShutdown,
    timeout,
    logger
  }, options.headers)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By passing the header parameter through the &lt;code&gt;decorateWithSignalHandler&lt;/code&gt; I am now able to give the &lt;code&gt;sendSuccess&lt;/code&gt; and &lt;code&gt;sendFailure&lt;/code&gt; functions the headers information needed so I could write my CORS headers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;So far everything is working and the next steps are to get the pull request accepted and to figure out a way to include middleware into the project.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Planning for Contributing to Telescope</title>
      <dc:creator>Luigi Zaccagnini</dc:creator>
      <pubDate>Sat, 04 Dec 2021 01:33:09 +0000</pubDate>
      <link>https://dev.to/luigizaccagnini/planning-for-contributing-to-telescope-3iig</link>
      <guid>https://dev.to/luigizaccagnini/planning-for-contributing-to-telescope-3iig</guid>
      <description>&lt;p&gt;Hello! Welcome to another blog post about contributing to open source. This blog post I am going to discuss the issue I picked to solve and how I am planning to solve it. &lt;/p&gt;

&lt;h2&gt;
  
  
  Issue at Hand
&lt;/h2&gt;

&lt;p&gt;The issue I decided to choose for this was &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2444"&gt;issue 2444&lt;/a&gt;. This issue is about adding CORS to the health checks in Telescope. CORS(cross-origin resource sharing) allows for restricted resources (Stylesheets, scripts, etc.) from one domain to be accessed from another domain. For this issue, when Satellite another Seneca open source project tries to communicate with telescope it causing the CORS issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Action Plan
&lt;/h2&gt;

&lt;p&gt;Since this issue requires me to add CORS to satellites health checks, I will have to implement CORS into the &lt;code&gt;src/satellite.js&lt;/code&gt;. Here is a rough idea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const { createTerminus } = require('@godaddy/terminus');

const { createApp, createRouter } = require('./app');
const redis = require('./redis');
const elastic = require('./elastic');
const logger = require('./logger');
const cors = require('cors');

function createServer(app, credentials) {
  // If we're given key/cert credentials, use HTTPS,otherwiseHTTP 

  app.use(cors()); 

  if (credentials) {
    return require('https').createServer(credentials, app);
  }
  return require('http').createServer(app);
}

class Satellite {
  constructor(options = {}) {
    // If we're given a healthCheck function, we'll use it with terminus below.
    // NOTE: this function should return a Promise.
    this.healthCheck =
      typeof options.healthCheck === 'function' ? options.healthCheck : () =&amp;gt; Promise.resolve();

    // If we're given a shutDown function, we'll use it with terminus below.
    // NOTE: this function should return a Promise.
    this.shutDown =
      typeof options.shutDown === 'function' ? options.shutDown : () =&amp;gt; Promise.resolve();

    // Keep track of credentials if we're passed any
    this.credentials = options.credentials;
    // Use the router passed to us
    this.router = options.router || createRouter();
    // Expose the app
    this.app = createApp(this.router, options);
  }

  start(port, callback) {
    if (this.server) {
      throw new Error('server already started');
    }

    if (typeof port !== 'number') {
      throw new Error(`port number required, got ${port}`);
    }

    // Expose the server
    this.server = createServer(this.app, this.credentials);

    // Graceful shutdown and healthcheck
    createTerminus(this.server, {
      healthChecks: {
        '/healthcheck': this.healthCheck,
      },
      signal: 'SIGINT',
      onSignal() {
        // Do any async cleanup required to gracefully shutdown. The calls to
        // redis/elastic shutDown() will be no-ops if no connections are open.
        return Promise.all([this.shutDown(), redis.shutDown(), elastic.shutDown()]).catch((err) =&amp;gt;
          logger.error({ err }, 'unexpected error while shutting down')
        );
      },
      logger: (...args) =&amp;gt; logger.error(...args),
    });

    // Start the server
    this.server.listen(port, callback);
  }

  stop(callback) {
    const self = this;

    function finished() {
      self.server = null;
      if (typeof callback === 'function') {
        callback();
      }
    }

    if (!this.server) {
      finished();
      return;
    }

    this.server.close(finished);
  }
}

module.exports = Satellite;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another solution could be to use set headers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;res.writeHead(200, 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'OPTIONS, POST, GET');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a plan I hope works but I have much to find out when I start working on the project. Stay tuned for my more in depth blog about working on the issue. &lt;/p&gt;

</description>
      <category>opensource</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Contributing to Local Opensource Projects</title>
      <dc:creator>Luigi Zaccagnini</dc:creator>
      <pubDate>Tue, 30 Nov 2021 03:57:16 +0000</pubDate>
      <link>https://dev.to/luigizaccagnini/contributing-to-local-opensource-projects-cjk</link>
      <guid>https://dev.to/luigizaccagnini/contributing-to-local-opensource-projects-cjk</guid>
      <description>&lt;p&gt;Hello! During this blog post I will be discussing the two issues I decided to take for this release, the two pull requests that closed the issues and the two small code reviews I did in the &lt;a href="https://github.com/Seneca-CDOT/telescope"&gt;Telescope Project&lt;/a&gt;! &lt;/p&gt;

&lt;h2&gt;
  
  
  To kill Two Birds with Two Stones
&lt;/h2&gt;

&lt;p&gt;Picking two issues that challenged me more than my Hacktoberfest issues was not an easy process. The last challenge I left off on from Hacktoberfest was contributing a new provider to &lt;a href="https://github.com/notifirehq/notifire"&gt;Notifire&lt;/a&gt;. Eventually I ended up choosing a &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2504"&gt;Telescope&lt;/a&gt; issue and &lt;a href="https://github.com/redxzeta/Awesome-Adoption/issues/231"&gt;issue&lt;/a&gt; for a small opensource project. &lt;/p&gt;

&lt;h3&gt;
  
  
  Telescope Issue
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2504"&gt;telescope issue&lt;/a&gt; was switching telescope from using &lt;code&gt;body-parser&lt;/code&gt; to express.json(). This issue was not as difficult as I thought it was but, it taught me something really cool! Before this issue I would always use &lt;code&gt;body-parser&lt;/code&gt; but after researching I learned that you could just use express. Once I understood that it was built in to express, implementing the solution for the &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2512"&gt;PR&lt;/a&gt; was easy! &lt;/p&gt;

&lt;h3&gt;
  
  
  Awesome-Adoption
&lt;/h3&gt;

&lt;p&gt;Awesome-Adoption the second project I worked on for this project. Awesome-Adoption is a opensource project that allows people to adopted pets. The &lt;a href="https://github.com/redxzeta/Awesome-Adoption/issues/231"&gt;issue&lt;/a&gt; I worked on required me to write tests that tested the donate page of the website. The main checks were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test for filtering&lt;/li&gt;
&lt;li&gt;Drop down&lt;/li&gt;
&lt;li&gt;Expecting the elements from the list&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was very intimidating for me as I am still pretty new to writing tests but, the challenge was on! I first was trying to test the donate page with render test and Jest. I had a lot of problems trying to simulate drop downs so I had to turn to the community for help. One of the members of the community guided me to &lt;a href="https://testing-library.com/docs/ecosystem-user-event"&gt;user-event | Testing Library&lt;/a&gt;. This really helped me start to form the tests by writing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test("Test for filtering", () =&amp;gt; {
  render(&amp;lt;Donate /&amp;gt;);

  userEvent.selectOptions(
    screen.getByTestId("dropdown"),
    screen.getByTestId("donate-test-selection-united-states", {
      name: "united states",
    })
  );
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Above was one of the first tests I wrote using the &lt;code&gt;userEvent&lt;/code&gt; tool. To grab elements in React, I used a &lt;code&gt;testID&lt;/code&gt; to grab the elements. Although this worked and the tests were running, there was a better way to do this. A code review recommended me to use the &lt;code&gt;getByRole&lt;/code&gt; option. This option allowed us to: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get the option element without tags.&lt;/li&gt;
&lt;li&gt;Send it the value we wanted selected.&lt;/li&gt;
&lt;li&gt;Get the amount of options available.&lt;/li&gt;
&lt;li&gt;Get the currently selected option.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;userEvent.selectOptions(
    screen.getByTestId("dropdown"),
    screen.getByRole("option", {
      name: "united states",
    })
  );

 expect(
    screen.getByRole("option", {
      name: "united states",
    }).selected
  ).toBeTruthy();

expect(screen.getAllByRole("option").length).toBe(10);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was so powerful and allowed code to be more readable. I also found a tool that allowed me to query the text in the document &lt;code&gt;screen.queryAllByText&lt;/code&gt;. This allowed me to check and make sure that after I selected an option, the correct data could display. This &lt;a href="https://github.com/redxzeta/Awesome-Adoption/pull/237"&gt;pull request&lt;/a&gt; taught me a lot of neat tricks for writing tests and I recommend you go take a look and see it for yourself! &lt;/p&gt;

&lt;h2&gt;
  
  
  Code Reviews
&lt;/h2&gt;

&lt;p&gt;I found that the two code reviews were very difficult for me. I felt that looking through the code and trying to improve it was very hard at first. The code looked good and if there was a problem it was very small. Eventually I found things that could help pull requests and improve the code!&lt;/p&gt;

&lt;h3&gt;
  
  
  First Review
&lt;/h3&gt;

&lt;p&gt;My &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2199#discussion_r757564395"&gt;first review&lt;/a&gt; was a very small review. I found that in the pull request, the programmer was using the &lt;code&gt;color : 'black'&lt;/code&gt; instead of &lt;code&gt;#000000&lt;/code&gt;. This may be a bit picky but the style of css uses hexacode to define colors. &lt;/p&gt;

&lt;h3&gt;
  
  
  Second Review
&lt;/h3&gt;

&lt;p&gt;My &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2531/files/f00486c971e8806fb1abea37029b6e05385e1862"&gt;second review&lt;/a&gt; wasn't much bigger but taught me a ESLint rule. To start I found style mix matches with the &lt;code&gt;margin&lt;/code&gt; in css using &lt;code&gt;pixels&lt;/code&gt; or &lt;code&gt;em&lt;/code&gt;. So I recommended sticking to one so there isn't a mix in units. The second comment was an ESLint error caused by unary operators. ESLint doesn't allow for unary operators causing the error in the code. To fix this I reccomended using &lt;code&gt;variable += 1&lt;/code&gt; instead of &lt;code&gt;variable++&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This release was a very difficult challenge but taught me a lot about collaborating with new projects and that you never stop learning. Now that I am moving from this, I will be working on my final project of the semester. A difficult issue that will take me 3 weeks. See you next time!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Publishing Octo to NPM</title>
      <dc:creator>Luigi Zaccagnini</dc:creator>
      <pubDate>Sat, 27 Nov 2021 03:19:48 +0000</pubDate>
      <link>https://dev.to/luigizaccagnini/publishing-octo-to-npm-3l0g</link>
      <guid>https://dev.to/luigizaccagnini/publishing-octo-to-npm-3l0g</guid>
      <description>&lt;p&gt;Hello! Welcome to another blog post about Octo! In this blog post I am going to discuss what I used to publish Octo, the process of how I did it, how I tested it and how to install Octo for yourself! &lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Ready for Publishing Octo
&lt;/h2&gt;

&lt;p&gt;To start, I used &lt;a href="https://docs.npmjs.com/packages-and-modules/contributing-packages-to-the-registry"&gt;NPM&lt;/a&gt; to release Octo to the public.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "name": "octo-ssg",
  "version": "0.1.0",
  "description": "A tool that allows you to generate static sites based off of text data.",
  "main": "bin/app.js",
  "bin": {
    "octo": "./bin/app.js"
  },
  "scripts": {
    "prepare": "husky install",
    "start": "node ./bin/app.js",
    "build": "npm run prettier &amp;amp;&amp;amp; npm run eslint-fix &amp;amp;&amp;amp; npm run eslint",
    "test": "jest",
    "coverage": "jest --coverage",
    "eslint": "npx eslint .",
    "eslint-fix": "eslint --fix .",
    "prettier": "prettier --write .",
    "prettier-check": "prettier --check ."
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/LuigiZaccagnini/octo.git"
  },
  "keywords": [
    "ssg",
    "static",
    "site",
    "generator"
  ],
  "author": "Luigi Zaccagnini &amp;lt;contact@luigizaccagnini.com&amp;gt; (https://luigizaccagnini.com/)",
  "license": "GPL-3.0-or-later",
  "bugs": {
    "url": "https://github.com/LuigiZaccagnini/octo/issues"
  },
  "homepage": "https://github.com/LuigiZaccagnini/octo#readme",
  "dependencies": {
    "boxen": "^4.2.0",
    "chalk": "2.4",
    "enzyme": "^3.9.0",
    "react": "^16.8.6",
    "react-dom": "^16.8.6",
    "react-test-renderer": "^17.0.2",
    "showdown": "^1.9.0",
    "yargs": "^17.2.1"
  },
  "devDependencies": {
    "eslint": "^8.1.0",
    "husky": "^7.0.4",
    "jest": "^27.3.1",
    "prettier": "2.4.1"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I had to go over my package.json to make sure that all my information was correct because this in the information that would be going live. So when you decide to go through with publishing your package, you should make sure your package.json is up to date with information. Once my package.json was good, I had to go through my code and test it to make sure I wasn't publishing a broken tool! Since I have already integrated tools into the project this part was easy (Read &lt;a href="https://dev.to/luigizaccagnini/using-static-analysis-tooling-with-open-source-67n"&gt;Using Static Analysis Tooling with Open Source!&lt;/a&gt;, &lt;a href="https://dev.to/luigizaccagnini/creating-tests-for-octo-2okg"&gt;Creating Tests for Octo&lt;/a&gt; and &lt;a href="https://dev.to/luigizaccagnini/octo-continuous-integration-4kd"&gt;Octo: Continuous Integration&lt;/a&gt; for more information about adding tools to your project)! Most of my project altering was updating documentation to help users install Octo. Finally push an annotated tag for this release. Since this was Octo's first release I used &lt;code&gt;git tag -a v1.0 -m "version 1.0"&lt;/code&gt; to set it as version and &lt;code&gt;git push --follow-tags&lt;/code&gt; to push the tag to the repository. &lt;/p&gt;

&lt;h2&gt;
  
  
  Working with NPM
&lt;/h2&gt;

&lt;p&gt;Now that my project was ready, I created an account at &lt;a href="https://www.npmjs.com/signup"&gt;NPM&lt;/a&gt; and logged into it through terminal using &lt;code&gt;npm login&lt;/code&gt;. You need to confirm you email address for the next steps to work or you will get a &lt;code&gt;403 error&lt;/code&gt;. Another problem I ran into was that if your package name already exists on NPM, you need to change it in your package.json or you will get a &lt;code&gt;403 Error&lt;/code&gt;. This error took me awhile to learn about because the error just stated that I didn't have permission to upload my package. Now that I was logged in and everything is setup correctly, I ran &lt;code&gt;npm publish&lt;/code&gt; and Octo was published!&lt;/p&gt;

&lt;h2&gt;
  
  
  User Testing
&lt;/h2&gt;

&lt;p&gt;For the best user testing I got my sister who is learning web development to try installing my project. I thought this would be perfect because she is using another operating system and I can get a fresh opinion. The main problem I had with the testing was documentation to guide the user to install Octo. When my sister tried to install it on her PC, it wouldn't work because it was not globally installed. So I just fixed the documentation to globally install the project. &lt;/p&gt;

&lt;h2&gt;
  
  
  How to Install Octo on Your Computer
&lt;/h2&gt;

&lt;p&gt;To install Octo is pretty easy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make sure you have &lt;a href="https://nodejs.org/en/download/"&gt;Node LTS&lt;/a&gt; downloaded and setup on your computer.&lt;/li&gt;
&lt;li&gt;Open your terminal/cmd and enter &lt;code&gt;npm i octo-ssg -g&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Once installed convert a markdown file to html using &lt;code&gt;octo -i markdownFile.md&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Adding CI with NPM Releases
&lt;/h2&gt;

&lt;p&gt;Creating a CI for each release was simple using Github actions. They provided me a template for NPM releases and that was it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Node.js Package

on:
  release:
    types: [created]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: 14
      - run: npm ci
      - run: npm test

  publish-npm:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: 14
          registry-url: https://registry.npmjs.org/
      - run: npm ci
      - run: npm publish
        env:
          NODE_AUTH_TOKEN: ${{secrets.npm_token}}

  publish-gpr:
    needs: build
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: 14
          registry-url: https://npm.pkg.github.com/
      - run: npm ci
      - run: npm publish
        env:
          NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see above, whenever I push a tag to releases this code will publish Octo to NPM. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I thought this lab would be very difficult because of the daunting idea of having my package on NPM seemed so crazy. The tool I always use for my projects is hosting one of mine, like wow. I am very proud of this achievement and I am very excited with what I can now do with this knowledge. If you have ever published a NPM package comment about what package it is! Thanks for reading, until next time!  &lt;/p&gt;

</description>
      <category>opensource</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>npm</category>
    </item>
    <item>
      <title>Octo: Continuous Integration</title>
      <dc:creator>Luigi Zaccagnini</dc:creator>
      <pubDate>Sat, 20 Nov 2021 04:49:06 +0000</pubDate>
      <link>https://dev.to/luigizaccagnini/octo-continuous-integration-4kd</link>
      <guid>https://dev.to/luigizaccagnini/octo-continuous-integration-4kd</guid>
      <description>&lt;p&gt;Welcome to another post about my project &lt;a href="https://github.com/LuigiZaccagnini/octo"&gt;Octo&lt;/a&gt;! In this blog I am going to go over:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The process of integrating CI(continuous integration) into my open source project Octo&lt;/li&gt;
&lt;li&gt;How writing tests for another repository felt&lt;/li&gt;
&lt;li&gt;Thoughts of CI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Continuous Integration
&lt;/h2&gt;

&lt;p&gt;Setting up CI with Github actions was extremely easy. Github has prefabs of node configurations making CI easy to integrate in your project. If you followed my previous blogs about &lt;a href="https://dev.to/luigizaccagnini/creating-tests-for-octo-2okg"&gt;testing&lt;/a&gt; and &lt;a href="https://dev.to/luigizaccagnini/using-static-analysis-tooling-with-open-source-67n"&gt;static analysis tooling&lt;/a&gt;, creating your config should be short. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Navigate to your Github repository and click the actions button beside projects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on the basic node configuration. Once you click on that, it should bring you to a new page with the creation of a .yml file.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Node.js CI

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [12.x, 14.x, 16.x]
        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/

    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node-version }}
          cache: "npm"
      - run: npm ci
      - run: npm run prettier-check
      - run: npm run eslint
      - run: npm test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Octo's .yml looks like the above code. Most of the code above was provided by Github as a template to start with. I only added my npm commands created before as checks for the CI so, if you haven't done that yet you should go read those blogs! Once this is done, your CI should be now included in your repository! &lt;/p&gt;

&lt;h2&gt;
  
  
  Writing Tests in Another Repo
&lt;/h2&gt;

&lt;p&gt;Working in another person's repo was a little tough. The repo's contributing.md was outdated so I had to find the files and commands to use for testing the project. Once I was able to figure that out writing a new test was not as difficult because of Jest's &lt;code&gt;--coverage&lt;/code&gt; flag. This helped generate a report to find all the missing coverage for tests in the project. This also helped me understand how the project works and how to write tests for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts on CI
&lt;/h2&gt;

&lt;p&gt;I think everyone should have CI integrated in their projects, even if it is being developed solo. I believe this is important for each project because it helps keep broken code from being pushed to a repo. Although developers may feel that they won't run into this, keeping a mind set of writing tests while developing a project makes your code better.   &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Creating Tests for Octo</title>
      <dc:creator>Luigi Zaccagnini</dc:creator>
      <pubDate>Wed, 17 Nov 2021 00:54:10 +0000</pubDate>
      <link>https://dev.to/luigizaccagnini/creating-tests-for-octo-2okg</link>
      <guid>https://dev.to/luigizaccagnini/creating-tests-for-octo-2okg</guid>
      <description>&lt;p&gt;Hello! Welcome to another blog post about my open source project &lt;a href="https://github.com/LuigiZaccagnini/octo"&gt;Octo&lt;/a&gt;. If you're new to my blogs, Octo is an open source static site generation tool created by me! Today I am going to review the process of writing tests and explain how I implemented them in my project. &lt;/p&gt;

&lt;h2&gt;
  
  
  What Framework to Use?
&lt;/h2&gt;

&lt;p&gt;The framework I picked for my project was &lt;a href="https://jestjs.io/"&gt;Jest&lt;/a&gt;. I picked Jest because it is the framework I am most comfortable with and it is very easy to setup in your project! &lt;/p&gt;

&lt;h2&gt;
  
  
  Jest Setup
&lt;/h2&gt;

&lt;p&gt;To add Jest to your project, run &lt;code&gt;yarn add --dev jest&lt;/code&gt; or &lt;code&gt;npm install --save-dev jest&lt;/code&gt;. Once Jest is installed, open your &lt;code&gt;package.json&lt;/code&gt; and create a new npm script &lt;code&gt;"test":"jest"&lt;/code&gt;. Now whenever you want to run your tests all you need to do is run &lt;code&gt;npm test&lt;/code&gt;. I strongly recommend storing all of your test files in your root directory in a test folder. It will help keep your project nice and organized.   &lt;/p&gt;

&lt;h2&gt;
  
  
  Writing Tests
&lt;/h2&gt;

&lt;p&gt;Everything up until this point was simple for me. Once I started writing tests I ran into a bunch of errors that confused me. Good thing I ran into those so you can now learn from my mistakes! To start off, create a file in the format of &lt;code&gt;myFileThatNeedsTesting.test.js&lt;/code&gt;. Once done, open the file and add &lt;code&gt;/* eslint-disable no-undef */&lt;/code&gt; at the top. If you do not do this, eslint will think you're making a bunch of errors and might make you a little confused. &lt;/p&gt;

&lt;h3&gt;
  
  
  Writing a Matchers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test('Checks if it can add a directory', () =&amp;gt; {
  expect(ff.addDirectory('./dist')).toBeUndefined();
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A matcher is a test that checks its value to see if it is correct. As you can see above, I created a test to check if my &lt;code&gt;addDirectory&lt;/code&gt; function would return undefined. I check for undefined because the &lt;code&gt;addDirectory&lt;/code&gt; function will only return errors. So if I do get anything, there is a problem. This is a very basic matcher but, if you're interested in more matcher options check &lt;a href="https://jestjs.io/docs/using-matchers"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  Snapshots
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;it('Markdown to HTML renders correctly', () =&amp;gt; { 
ff.markdownToHTML('test/markdownTest.md').then(html =&amp;gt; {
  const tree = ReactTestRenderer
    .create(html)
    .toJSON();
  expect(tree).toMatchSnapshot();
  });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Snapshot testing was my favourite part! I found it really useful to compare test render code with the correct code. Above I use my &lt;code&gt;markdownToHTML&lt;/code&gt; function to convert a markdown file and then make sure, it matched the snapshot. At first I was having problems with this because my functions could not find the file. I eventually figured out that I need to path from the root of my project. Once I had that working, the file was correctly displaying the correct information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generating a Coverage Report
&lt;/h3&gt;

&lt;p&gt;Generating a coverage report is very simple and gives you a lot of information about how and where you can write more tests for your code. To generate the report use &lt;code&gt;yarn test --coverage&lt;/code&gt;. After running that command you should see a folder with all the information.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Setting up tests for my code was a very fun process. It taught me the importance of testing code as well as a different approach on how to write code. I have attempted to write tests for code before but would always get stuck. Now that I finally have learned how to write tests properly, I will continue to write tests for future projects and encourage others to do the same!   &lt;/p&gt;

</description>
      <category>opensource</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Using Static Analysis Tooling with Open Source!</title>
      <dc:creator>Luigi Zaccagnini</dc:creator>
      <pubDate>Fri, 05 Nov 2021 22:08:39 +0000</pubDate>
      <link>https://dev.to/luigizaccagnini/using-static-analysis-tooling-with-open-source-67n</link>
      <guid>https://dev.to/luigizaccagnini/using-static-analysis-tooling-with-open-source-67n</guid>
      <description>&lt;p&gt;Welcome to another blog post about the journey of &lt;a href="https://github.com/LuigiZaccagnini/octo"&gt;Octo&lt;/a&gt;, the open source tool for static site generation! Today I will be going over how I added static analysis tooling into the project and how you can do the same for your open source projects! &lt;/p&gt;

&lt;h2&gt;
  
  
  Tools Overview
&lt;/h2&gt;

&lt;p&gt;To start, I am going to go over all the tools that I added to Octo and show you how to add them to your project. I will also be providing links if you want more configuration options or more information on the projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Eslint
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://eslint.org/"&gt;Eslint&lt;/a&gt; is a great tool for checking errors in your code! I would strongly recommend you use eslint in your developer environment and all projects you work on. I have been using eslint as my linter for a few year now with all my code and it has helped me keep my code in good shape. To add eslint to your project run &lt;code&gt;npm install eslint --save-dev&lt;/code&gt;. Now that eslint is in your dev dependencies, you can run &lt;code&gt;npx eslint --init&lt;/code&gt;. This will prompt you to create a config file that works for your project. If you now run &lt;code&gt;npx eslint .&lt;/code&gt; eslint will check all the files in your project for errors!&lt;/p&gt;

&lt;p&gt;Octo's &lt;code&gt;.eslintrc.json&lt;/code&gt; looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "env": {
    "browser": false,
    "node": true,
    "es2021": true
  },
  "extends": "eslint:recommended",
  "parserOptions": {
    "ecmaVersion": 13,
    "sourceType": "module"
  },
  "rules": {}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I set &lt;code&gt;"browser" : false&lt;/code&gt; and &lt;code&gt;"node": true&lt;/code&gt; because my project is a tool that uses node and doesn't use the browser to operate. &lt;/p&gt;

&lt;h3&gt;
  
  
  Prettier
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://prettier.io/"&gt;Prettier&lt;/a&gt; is a code formatter that supports a ton of languages including javascript! We are using this as it helps make our code readable and it allows us to enjoy one style of coding! &lt;/p&gt;

&lt;p&gt;To install Prettier run: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev --save-exact prettier&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;echo {}&amp;gt; .prettierrc.json&lt;/code&gt; to create an empty config file. &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;echo &amp;gt;&amp;gt; .prettierignore&lt;/code&gt; to creat a ignore file exactly like &lt;a href="https://git-scm.com/docs/gitignore"&gt;gitignore&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Octo's &lt;code&gt;.prettierrc.json&lt;/code&gt; is currently empty because the current formatting for me is good. The &lt;code&gt;.prettierignore&lt;/code&gt; is just a copy of our &lt;code&gt;.gitignore&lt;/code&gt; so for your project you can do the same! &lt;/p&gt;

&lt;p&gt;Now prettier should be in your project! To use prettier run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;npx prettier --write .&lt;/code&gt; to format and save all your files.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npx prettier --check .&lt;/code&gt; to see if your project is formatted.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Writing NPM Commands
&lt;/h3&gt;

&lt;p&gt;Now that we have our two first awesome tools, we should write some scripts so we aren't constantly writing multiple commands at once! head over to your &lt;code&gt;package.json&lt;/code&gt; in your preferred text editor and look for the scripts section. It should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"scripts": {
    "start": "node ./bin/app.js"
  },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once we are there we can start writing some scripts to help us reduce the amount of commands we are writing. To start lets write a basic test script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"scripts": {
    "start": "node ./bin/app.js",
    "test": "prettier --check &amp;amp;&amp;amp; npx eslint ."
  },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;"test"&lt;/code&gt; part of the command can be named anything you like but should be related to what it runs. Our test command runs &lt;code&gt;prettier --check&lt;/code&gt; to check if all files are formatted. We then use &lt;code&gt;&amp;amp;&amp;amp; npx eslint .&lt;/code&gt; to use eslint to check our project. If we now run &lt;code&gt;npm run test&lt;/code&gt; it will run both commands with a single line! Now lets go to the next level!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"scripts": {
    "start": "node ./bin/app.js",
    "test": "npm run prettier-check &amp;amp;&amp;amp; npm run eslint",
    "eslint": "npx eslint .",
    "prettier-check": "prettier --check ."
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we know how to write one command, why not use those commands with other commands. With this script we wrote two new commands &lt;code&gt;eslint&lt;/code&gt; and &lt;code&gt;prettier-check&lt;/code&gt;. &lt;code&gt;eslint&lt;/code&gt; runs eslint check and &lt;code&gt;prettier-check&lt;/code&gt; checks the files to make sure they're formatted! Now we can call those commands in the &lt;code&gt;test&lt;/code&gt; command using &lt;code&gt;npm run&lt;/code&gt;. You can also use the commands separately now if you don't want to run both at the same time. &lt;/p&gt;

&lt;p&gt;As you can see, you can get very creative with it as you can see with Octo's scripts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"scripts": {
    "prepare": "husky install",
    "start": "node ./bin/app.js",
    "build": "npm run prettier &amp;amp;&amp;amp; npm run eslint-fix &amp;amp;&amp;amp; npm run eslint",
    "test": "npm run prettier-check &amp;amp;&amp;amp; npm run eslint",
    "eslint": "npx eslint .",
    "eslint-fix": "eslint --fix .",
    "prettier": "prettier --write .",
    "prettier-check": "prettier --check ."
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Husky
&lt;/h3&gt;

&lt;p&gt;Wow that is a lot of information about two tools! Now how cool would it be if your project would automatically run these tools whenever you made a push or commit? Well here comes Git hooks to the rescue with the power of &lt;a href="https://github.com/typicode/husky"&gt;Husky&lt;/a&gt;! To install husky run &lt;code&gt;npm install husky -D&lt;/code&gt;. That doesn't fully install husky, to fully install it we have to run another command. Since we just learned about writing scripts in our package, we should write a new one for preparing our project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"scripts": {
    "prepare": "husky install",
    "start": "node ./bin/app.js",
    "test": "npm run prettier-check &amp;amp;&amp;amp; npm run eslint",
    "eslint": "npx eslint .",
    "prettier-check": "prettier --check ."
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we have &lt;code&gt;husky install&lt;/code&gt; as a command, we can run &lt;code&gt;npm run prepare&lt;/code&gt; to get husky fully installed. It should have a generated &lt;code&gt;.husky&lt;/code&gt; folder in the root of your project. Now lets write our first hook! &lt;/p&gt;

&lt;p&gt;Run this command to create a pre-commit script for husky:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx husky add .husky/pre-commit "npm test"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This command creates a file within the .husky folder and names it pre-commit. It sets the command &lt;code&gt;npm test&lt;/code&gt; to run every single time you commit within the project. &lt;/p&gt;

&lt;h2&gt;
  
  
  Customize your Developer Environment!
&lt;/h2&gt;

&lt;p&gt;Now that we have our cool customized developer environment for our project, we want to make sure people working on our project are using the tools we utilized today. To do that we need to create &lt;code&gt;.vscode&lt;/code&gt; folder with our rules. This part is easy depending on how much rules you want to add to your project. To start you should create a folder called &lt;code&gt;.vscode&lt;/code&gt; and within it create two files named &lt;code&gt;settings.json&lt;/code&gt; and &lt;code&gt;extensions.json&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Settings
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "editor.formatOnSave": true,
  "files.autoSave": "afterDelay",
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.formatOnPaste": true,
  "editor.inlineSuggest.enabled": true
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are Octo's rules. These rules are inherited from my personal profile. The rule that is very important here is &lt;code&gt;"editor.defaultFormatter": "esbenp.prettier-vscode"&lt;/code&gt;. This makes sure that when someone is working in your project that they're using prettier as the default formatter. The other lines in the file are about auto formatting so if you forget to save often like me you might want to use them! If you want to use your own settings on VS Code you can open command palette and type &lt;code&gt;settings.json&lt;/code&gt;. It should give you options on which settings you would like to open. You can then copy that into your &lt;code&gt;settings.json&lt;/code&gt; within the &lt;code&gt;.vscode&lt;/code&gt; folder we created earlier. &lt;/p&gt;

&lt;h3&gt;
  
  
  Extensions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "recommendations": [
    "dbaeumer.vscode-eslint",
    "esbenp.prettier-vscode",
    "streetsidesoftware.code-spell-checker"
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is Octo's recommendations for extensions. Whenever someone opens your project in VS Code it will ask them to download the recommended extensions for the project. One extension I didn't talk about was &lt;code&gt;code-spell-checker&lt;/code&gt;. This extension is great for checking for spelling errors within your code. &lt;/p&gt;

&lt;h2&gt;
  
  
  Extra Information
&lt;/h2&gt;

&lt;p&gt;If you enjoy these extensions you can download them through the extensions tab on VS Code. I have used these tools in my personal developer setup for an extremely long time and they have helped me a ton. I used them on Octo before I went to an automatic setup so the tools didn't find any problems yet. Having them installed doesn't hurt and will only help you! &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Now you have an awesome project that uses tools to automatically make sure whoever is working on your project is following your rules! If you want to contribute to Octo you can &lt;a href="https://github.com/LuigiZaccagnini/octo/issues"&gt;here&lt;/a&gt;. If you have recommendations for other tools or want to share your developer setups, I would love to read them in the comments! Thanks for reading!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Final Hacktoberfest Pull Requests! </title>
      <dc:creator>Luigi Zaccagnini</dc:creator>
      <pubDate>Tue, 02 Nov 2021 03:35:07 +0000</pubDate>
      <link>https://dev.to/luigizaccagnini/final-hacktoberfest-pull-requests-39p6</link>
      <guid>https://dev.to/luigizaccagnini/final-hacktoberfest-pull-requests-39p6</guid>
      <description>&lt;p&gt;Wow! What an amazing month! We finally finished Hacktoberfest and it was one crazy ride! During this blog post I will be going over the issues and final PR I did for Hacktoberfest.&lt;/p&gt;

&lt;h2&gt;
  
  
  The issues that were taken
&lt;/h2&gt;

&lt;p&gt;The two issues I took were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/notifirehq/notifire/issues/57"&gt;notifirehq&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2389"&gt;telescope&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Notifirehq
&lt;/h3&gt;

&lt;p&gt;This issue was a big step for me as I was contributing to a project I have never contributed to and was adding a feature to the repository. I had to integrate support for the whispir provider. It took a lot of time preparing and reviewing their rules to contributing. Since it is a small project there is not much support for it but, the people who are working on it are very motivated and inspired to work on it. If I ever had any questions the community was there always helping me! Submitting the first pull request took some time as I didn't have a template and I had to do research for the provider that needed to be added. The pull request is still being finished currently because I am fixing changes that are requested. You can find the pull request &lt;a href="https://github.com/notifirehq/notifire/pull/65"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Telescope
&lt;/h3&gt;

&lt;p&gt;Near the end of Hacktoberfest I was able to pick up two issues from the telescope project updating outdated dependencies. I wasn't able to create a pull request as I am currently in the process moving so I did not have the time to complete the issues but, will update you guys in a future blog post about the completion. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Hacktoberfest was a lot of fun to contribute to and learn new code. This year was a rough start because some projects I tried to contribute to were not respondent or required a lot more time and support from the community. Although I had those tough obstacles, I am hoping next year to complete a lot more pull requests and to contribute to projects I personally use.  Thank you for reading my last Hacktoberfest blog until 2022!    &lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Inspired to improve Octo!</title>
      <dc:creator>Luigi Zaccagnini</dc:creator>
      <pubDate>Sun, 31 Oct 2021 18:43:52 +0000</pubDate>
      <link>https://dev.to/luigizaccagnini/inspired-to-improve-octo-4gmj</link>
      <guid>https://dev.to/luigizaccagnini/inspired-to-improve-octo-4gmj</guid>
      <description>&lt;p&gt;Hello! In this blog post I am going to go over how it was to work with Docusaurus and adding an upgrade to Octo inspired by Docusaurus! Working with Docusaurus was a lot of fun and I hope you learn a lot from this post so you can use it for your open source projects too!&lt;/p&gt;

&lt;h2&gt;
  
  
  Docuwhatus?
&lt;/h2&gt;

&lt;p&gt;Docusaurus is a tool that allows anyone to build a static website with a text format called Markdown! This tool has many purposes but, I think I would mostly use this for writing documentation for my projects! &lt;/p&gt;

&lt;h2&gt;
  
  
  Starting with Docusaurus
&lt;/h2&gt;

&lt;p&gt;Making a base static site with Docusaurus is super easy and fun to learn! To start you need a &lt;strong&gt;Node.js version &amp;gt;= 12.13.0&lt;/strong&gt; or &lt;strong&gt;Yarn version &amp;gt;= 1.5&lt;/strong&gt; . You can check both of these versions by using &lt;code&gt;node -v&lt;/code&gt; or &lt;code&gt;yarn —version&lt;/code&gt;. I personally had trouble with this as I was using another version of node for another project I was working on. To fix this I ended up using Node Version Manager (nvm) to help with switching between versions of node. After making sure npm or yarn are their correct versions run:&lt;br&gt;
&lt;br&gt;
 &lt;code&gt;npx create-docusaurus@latest project-name classic&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
 and a basic package will be created for you. Once the package is downloaded &lt;code&gt;cd project-name&lt;/code&gt; and run &lt;code&gt;npm run start&lt;/code&gt; and you will have your awesome basic project running! There is so much more features you can do with Docusaurus and I highly encourage you to check out the &lt;a href="https://docusaurus.io/docs/installation"&gt;docs&lt;/a&gt; and play around with it! &lt;a href="https://luigizaccagnini.github.io/docusaurus-demo/"&gt;Here&lt;/a&gt; is my Docusaurus demo and here is the &lt;a href="https://github.com/LuigiZaccagnini/docusaurus-demo"&gt;project repo&lt;/a&gt;!&lt;/p&gt;
&lt;h2&gt;
  
  
  Adding a new Feature to Octo
&lt;/h2&gt;

&lt;p&gt;After playing around with Octo I got inspired to add something cool to Octo that would make it more fun to use! To start I think the most important feature that needed to be added as soon as possible was full Markdown support. This was a very needed feature because only having one Markdown feature was annoying and made Octo a less desirable tool. So to start I had to research a package that could translate text into markdown. Eventually I found &lt;a href="https://www.npmjs.com/package/showdown"&gt;Showdown&lt;/a&gt; and adding this feature was 100 times easier! Adding the full Markdown support for me was very easy, I just had one bug I had to fix regarding how it processed multiline Markdown. &lt;/p&gt;

&lt;p&gt;So if I had:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\```


Hello


```\
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It would not process this correctly because my code was processing the Markdown by line and not by the entire document. So I had to feed Showdown the entire file opposed to line by line. &lt;/p&gt;

&lt;h2&gt;
  
  
  Future for Octo
&lt;/h2&gt;

&lt;p&gt;Now that I have Markdown finished for Octo I have filed some &lt;a href="https://github.com/LuigiZaccagnini/octo/issues"&gt;issues&lt;/a&gt; for the next steps of what I would like to be down for the tool.&lt;br&gt;
Some of the features I want are:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/LuigiZaccagnini/octo/issues/15"&gt;Search Engine Optimization&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/LuigiZaccagnini/octo/issues/3"&gt;Liquid tags support&lt;/a&gt;&lt;br&gt;
More code refactoring&lt;/p&gt;

&lt;p&gt;If you are interested to tackle these issues, just follow the link and ask to take on the feature! Thanks for reading another one of my blogs! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/LuigiZaccagnini/octo"&gt;Octo&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/LuigiZaccagnini/octo/commit/1aa2423ed0a119141a0901871fb2e94e3a8b63dd"&gt;Octo Feature PR&lt;/a&gt;&lt;br&gt;
&lt;a href="https://luigizaccagnini.github.io/docusaurus-demo/"&gt;Docusaurus Demo&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/LuigiZaccagnini/docusaurus-demo"&gt;Docusaurus Repo&lt;/a&gt;&lt;/p&gt;

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