<?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: Francesco Menghi</title>
    <description>The latest articles on DEV Community by Francesco Menghi (@menghif).</description>
    <link>https://dev.to/menghif</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%2F701880%2Fb7c3f61a-2f60-4fd7-9df9-1c68fbc9d3c7.jpeg</url>
      <title>DEV Community: Francesco Menghi</title>
      <link>https://dev.to/menghif</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/menghif"/>
    <language>en</language>
    <item>
      <title>Telescope 3.0</title>
      <dc:creator>Francesco Menghi</dc:creator>
      <pubDate>Sat, 23 Apr 2022 22:29:47 +0000</pubDate>
      <link>https://dev.to/menghif/telescope-30-gjg</link>
      <guid>https://dev.to/menghif/telescope-30-gjg</guid>
      <description>&lt;p&gt;&lt;a href="https://telescope.cdot.systems/" rel="noopener noreferrer"&gt;Telescope 3.0&lt;/a&gt; is finally out! For the final week of OSD700 I finished two issues that I mentioned in my previous &lt;a href="https://dev.to/menghif/close-to-the-finish-line-1m1b"&gt;blog post&lt;/a&gt; and some other small fixes.&lt;/p&gt;

&lt;p&gt;I successfully added the YouTube and Twitch sign-up page and it now looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hu32fvsuf44xz8c2dq9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hu32fvsuf44xz8c2dq9.png" alt="Telescope YouTube/Twitch sign-up page" width="800" height="792"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3505" rel="noopener noreferrer"&gt;PR&lt;/a&gt; was supposed to only add support for Twitch while &lt;a href="https://github.com/tcvan0707" rel="noopener noreferrer"&gt;Thanh&lt;/a&gt; was in charge of adding support for YouTube. However, after &lt;a href="https://github.com/humphd" rel="noopener noreferrer"&gt;Dave&lt;/a&gt;'s feedback, I ended up adding YouTube in the sign-up instructions and finally Thanh reviewed and approved my PR.&lt;/p&gt;

&lt;h2&gt;
  
  
  Many fixes
&lt;/h2&gt;

&lt;p&gt;When something doesn't work and you try to find a solution, often the fix turns out to be something really simple. This is what happed with our Turborepo CI cache implementation.&lt;/p&gt;

&lt;p&gt;The reason why the CI cache didn't work is because we were missing the &lt;code&gt;team&lt;/code&gt; flag in the command. I previously assumed it was not required by looking at the &lt;a href="https://github.com/humphd" rel="noopener noreferrer"&gt;Turborepo docs&lt;/a&gt; but Felix (the maintainer of the GitHub Action that we're using) came to the rescue and suggest &lt;a href="https://github.com/felixmosh/turborepo-gh-artifacts/issues/6#issuecomment-1105721055" rel="noopener noreferrer"&gt;the fix&lt;/a&gt;. In the end, this simple &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3539" rel="noopener noreferrer"&gt;PR&lt;/a&gt; made everything work!&lt;/p&gt;

&lt;h3&gt;
  
  
  ESlint change
&lt;/h3&gt;

&lt;p&gt;Our ESLint implementation included &lt;code&gt;TIMING=1&lt;/code&gt; to get a performance overview each time we lint our code. This however felt unnecessary most of the time so I decided to make it a &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3511" rel="noopener noreferrer"&gt;separate command&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Going forward we have two ESLint commands that are run using Turborepo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pnpm lint&lt;/code&gt;: runs ESLint in our repo.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pnpm lint-time&lt;/code&gt;: runs ESLint in our repo with the &lt;code&gt;TIMING=1&lt;/code&gt; option.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Docusaurus fix
&lt;/h3&gt;

&lt;p&gt;Another quick fix I made was removing these two options from Docusaurus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;showLastUpdateAuthor: true,
showLastUpdateTime: true,
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These two options allow you to use the git history to retrieve information on when a page was last updated and by whom. Unfortunately since our Docusaurus app lives inside the monorepo, &lt;code&gt;.git&lt;/code&gt; is only found in the root of the monorepo. So, when building the Docusaurus app in a Docker container, there was no git info being copied over and it resulted in a long list of errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  The end of OSD700
&lt;/h2&gt;

&lt;p&gt;This was the last week of OSD700 and last week of my studies at Seneca. I cannot believe I already reached the end. It feels like yesterday that I was learning things like navigating around a terminal or learning the basics of html, css and javascript.&lt;/p&gt;

&lt;p&gt;Both &lt;a href="https://wiki.cdot.senecacollege.ca/wiki/OSD600" rel="noopener noreferrer"&gt;OSD600&lt;/a&gt; and &lt;a href="https://wiki.cdot.senecacollege.ca/wiki/OSD700" rel="noopener noreferrer"&gt;OSD700&lt;/a&gt; were an incredible and unique experience. Last semester I learned how to use git and GitHub and made open source contributions during Hacktoberfest and beyond. This semester I participated into taking the Telescope project from version 2.0 to version 3.0 with an amazing group of people.&lt;/p&gt;

&lt;p&gt;Working in open source feels completely different than getting an assignment done and submitting it before a deadline. When you open a Pull Request, your code is there in the open ready for other people to take apart, find potential problems and eventually merge. In my experience, there is often a peer with better experience with a certain tool or technology that can provide help or guidance when you are stuck.&lt;/p&gt;

&lt;p&gt;Looking back at my &lt;a href="https://dev.to/menghif/osd700-goals-5ek3"&gt;first post&lt;/a&gt; of the semester where I wrote some goals for the class, I feel like I have accomplished what I setup to do. I worked a lot on monorepo tooling, I used Docker, NGinx, React, Docusaurus and more.&lt;/p&gt;

&lt;p&gt;I am excited for the future of Telescope and how the next group of students will influence its direction. I plan to stick around and continue to make contributions to the project!&lt;/p&gt;

</description>
      <category>telescope</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Close to the finish line</title>
      <dc:creator>Francesco Menghi</dc:creator>
      <pubDate>Sat, 16 Apr 2022 22:52:23 +0000</pubDate>
      <link>https://dev.to/menghif/close-to-the-finish-line-1m1b</link>
      <guid>https://dev.to/menghif/close-to-the-finish-line-1m1b</guid>
      <description>&lt;p&gt;We are now less than a week away from the final &lt;a href="https://github.com/Seneca-CDOT/telescope" rel="noopener noreferrer"&gt;Telescope&lt;/a&gt; release: version 3.0. Here's a quick update of what I've been up to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turborepo CI cache attempt
&lt;/h2&gt;

&lt;p&gt;With my latest &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3458" rel="noopener noreferrer"&gt;PR&lt;/a&gt;, I added support for Turborepo for our tests. I also tried to add the ability to keep a Turborepo cache as GitHub Artifacts in CI.&lt;/p&gt;

&lt;p&gt;I used this &lt;a href="https://github.com/felixmosh/turborepo-gh-artifacts" rel="noopener noreferrer"&gt;GitHub Action&lt;/a&gt; by Felix Mosheev which basically creates a local server in CI that can be used to upload/download the cache during a CI run. The Turborepo &lt;a href="https://turborepo.org/docs/features/remote-caching#custom-remote-caches" rel="noopener noreferrer"&gt;docs&lt;/a&gt; mention that Remote Cache can be self-hosted and used with the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;turbo run build &lt;span class="nt"&gt;--api&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://my-server.example.com"&lt;/span&gt; &lt;span class="nt"&gt;--token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxxxxxxxxxxx"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Felix has a fully working &lt;a href="https://github.com/felixmosh/turborepo-gh-artifacts-example" rel="noopener noreferrer"&gt;example&lt;/a&gt; that I used as a guide. To run the Action we need a token that is used to connect to the local server. We are using the unique GitHub sha as the token each time.&lt;/p&gt;

&lt;p&gt;Unfortunately even after &lt;a href="https://github.com/humphd" rel="noopener noreferrer"&gt;Dave&lt;/a&gt;'s &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3468" rel="noopener noreferrer"&gt;follow-up&lt;/a&gt; &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3471" rel="noopener noreferrer"&gt;attempts&lt;/a&gt; to make this work, the local server starts but no cache is saved. I don't think this is an urgent issue to get done before the 3.0 release so I might end up keeping this one for later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add Twitch URL to Sign Up flow
&lt;/h2&gt;

&lt;p&gt;The other &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2843" rel="noopener noreferrer"&gt;issue&lt;/a&gt; I started working on is allowing the frontend Sign Up page to take a Twitch URL. &lt;a href="https://github.com/tcvan0707" rel="noopener noreferrer"&gt;Thanh&lt;/a&gt; is also doing the same but for Youtube.&lt;/p&gt;

&lt;p&gt;During a meeting, Dave suggested to rework the feed-discovery to handle not only blogs, but also Youtube and Twitch channels and he did so in a live coding session with Thanh and I. I reviewed his &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3488" rel="noopener noreferrer"&gt;PR&lt;/a&gt; and I think it should be ready merged soon.&lt;/p&gt;

&lt;p&gt;Youtube provides RSS feeds for all channels. You just need the Youtube channel id number and then put it at the end of this URL: &lt;code&gt;https://www.youtube.com/feeds/videos.xml?channel_id=&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Twitch however does not do the same. This is were &lt;a href="https://github.com/RSS-Bridge/rss-bridge" rel="noopener noreferrer"&gt;RSS-Bridge&lt;/a&gt; comes in handy. It creates an RSS feed for websites that don't provide one.&lt;/p&gt;

&lt;p&gt;Finishing up the Sign Up flow is important so that future students can get started with Telescope by signing up directly on the website. Other students have already done the heavy lifting in this area but adding Youtube and Twitch support will be the cherry on top. I'll have an update on this in next week's blog post.&lt;/p&gt;

</description>
      <category>telescope</category>
      <category>github</category>
      <category>turborepo</category>
    </item>
    <item>
      <title>Telescope 3.0 alpha</title>
      <dc:creator>Francesco Menghi</dc:creator>
      <pubDate>Mon, 11 Apr 2022 02:09:40 +0000</pubDate>
      <link>https://dev.to/menghif/telescope-30-alpha-2pn0</link>
      <guid>https://dev.to/menghif/telescope-30-alpha-2pn0</guid>
      <description>&lt;p&gt;With Telescope 3.0-alpha &lt;a href="https://github.com/Seneca-CDOT/telescope/releases/tag/3.0.0-alpha.0" rel="noopener noreferrer"&gt;released&lt;/a&gt; this past Friday, we are now one release away from the big 3.0!&lt;/p&gt;

&lt;p&gt;With this release the Docusaurus app is now live on production. It is available at &lt;a href="https://telescope.cdot.systems/docs" rel="noopener noreferrer"&gt;https://telescope.cdot.systems/docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After last week's &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3367" rel="noopener noreferrer"&gt;work&lt;/a&gt; to have a Dockerfile for both the web app and our docs, this week I &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3400" rel="noopener noreferrer"&gt;added&lt;/a&gt; the necessary config to Nginx to deploy the Docusaurus app. It was actually easier than I expected, I just had to add the following to &lt;code&gt;config/nginx.conf.template&lt;/code&gt; just like I previously did in our dev config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;location /docs {
  root /usr/share/nginx/html;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Docusaurus path
&lt;/h2&gt;

&lt;p&gt;I also had to &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3406" rel="noopener noreferrer"&gt;fix&lt;/a&gt; the Docusaurus path since after adding it to nginx we ended up with &lt;code&gt;/docs/docs&lt;/code&gt; in the path (The first &lt;code&gt;/docs&lt;/code&gt; from nginx and the second from Docusarus). I couldn't find a good way to do it and then I remembered that &lt;a href="https://pnpm.io" rel="noopener noreferrer"&gt;pnpm&lt;/a&gt; uses Docusaurus for their docs and they do not have &lt;code&gt;/docs&lt;/code&gt; in their path. In fact if you click the "Docs" link from their homepage, you are redirected to their first documentation page which is: &lt;a href="https://pnpm.io/motivation" rel="noopener noreferrer"&gt;https://pnpm.io/motivation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Their docs are &lt;a href="https://github.com/pnpm/pnpm.github.io" rel="noopener noreferrer"&gt;open source&lt;/a&gt; so I went digging and found that they have &lt;code&gt;routeBasePath: '/',&lt;/code&gt; in their config. This did the trick for our Telescope docs.&lt;/p&gt;

&lt;p&gt;Finally to get the app production ready I had to change the Telescope green to our Telescope &lt;strong&gt;blue&lt;/strong&gt;! We still have dinosaurs on the homepage but &lt;a href="https://github.com/sirinoks" rel="noopener noreferrer"&gt;Alex&lt;/a&gt; is working on a new one that should be up by the 3.0 release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Goodbye Satellite
&lt;/h2&gt;

&lt;p&gt;I moved the Satellite project inside of the Telescope monorepo &lt;a href="https://dev.to/menghif/last-piece-of-the-puzzle-moving-satellite-inside-telescope-1f89"&gt;last month&lt;/a&gt; and, this week, the time came to &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3391" rel="noopener noreferrer"&gt;archive&lt;/a&gt; the original repo. Before clicking the big red button, I had to do some spring cleaning of the issues and PRs, change some outdated links and also remove the Satellite contribution info from the Dashboard (Something I actually added &lt;a href="https://dev.to/menghif/fetching-the-github-api-119e"&gt;last semester&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;We archived the Satellite repo but the project lives on an is healthier than ever!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Getting Nginx to work</title>
      <dc:creator>Francesco Menghi</dc:creator>
      <pubDate>Mon, 04 Apr 2022 02:29:36 +0000</pubDate>
      <link>https://dev.to/menghif/getting-nginx-to-work-1g3l</link>
      <guid>https://dev.to/menghif/getting-nginx-to-work-1g3l</guid>
      <description>&lt;p&gt;This past week I finally finished the work necessary for the &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2993" rel="noopener noreferrer"&gt;issue&lt;/a&gt; about sharing a single nginx container for all static sites.&lt;/p&gt;

&lt;p&gt;I moved &lt;code&gt;docusaurus&lt;/code&gt; and &lt;code&gt;test-web-content&lt;/code&gt; into &lt;code&gt;src/web&lt;/code&gt; in &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3349" rel="noopener noreferrer"&gt;separate&lt;/a&gt; &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3360" rel="noopener noreferrer"&gt;PRs&lt;/a&gt; and then started working on the Nginx config and Dockerfile.&lt;/p&gt;

&lt;p&gt;I originally posted a &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3367" rel="noopener noreferrer"&gt;PR&lt;/a&gt; with an Nginx config that would put the Telescope app and the Docusaurus app in two different ports but I was told in the review process to keep everything on port 8000 and simply have Docusaurus at &lt;code&gt;/docs&lt;/code&gt; which makes a lot more sense.&lt;/p&gt;

&lt;p&gt;I was stuck for a while on getting the Docusaurus app to show on &lt;code&gt;localhost:8000/docs&lt;/code&gt; as I kept getting a 403 Error message. Eventually, with help from &lt;a href="https://github.com/manekenpix" rel="noopener noreferrer"&gt;Josue&lt;/a&gt;, I managed to make the configuration work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dockefile
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/Seneca-CDOT/telescope/blob/3db970d106d8d9aaffb539d8b45f98c34ddd58ba/src/web/Dockerfile" rel="noopener noreferrer"&gt;Dockerfile&lt;/a&gt; is divided into different layers. It starts with &lt;code&gt;node:16&lt;/code&gt; as base and then goes through separate layers to install dependencies and build the apps. Each layer is specific to either the Telescope app or the Docusaurus app so that if there's a change in one, not everything needs to be rebuilt from scratch.&lt;/p&gt;

&lt;p&gt;The final layer uses the Nginx Alpine image (Alpine images are famous for being much smaller in size) and inside we copy the builds from previous layers like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;nginx:1.20.2-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;deploy&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=build-app /app/out /var/www/data&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=build-docs /docs/build /usr/share/nginx/html/docs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Nginx config
&lt;/h2&gt;

&lt;p&gt;For Nginx, I had to add following to the &lt;a href="https://github.com/Seneca-CDOT/telescope/blob/3db970d106d8d9aaffb539d8b45f98c34ddd58ba/config/nginx.conf.development.template#L154" rel="noopener noreferrer"&gt;config template&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;location /docs {
&lt;/span&gt;&lt;span class="gp"&gt;    root /usr/share/nginx/html;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and change the baseUrl in &lt;code&gt;docusaurus.config.js&lt;/code&gt; to &lt;code&gt;/docs/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It definitely took longer than I expected to get all of this working since I am still new to Docker but it was very rewarding to see it work. Hopefully this PR can be merged soon.&lt;/p&gt;




&lt;p&gt;Finally, since we are getting close to release the Docusaurus app to production, I also took the opportunity to fix all the broken links with this &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3376" rel="noopener noreferrer"&gt;PR&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Slow and steady</title>
      <dc:creator>Francesco Menghi</dc:creator>
      <pubDate>Mon, 28 Mar 2022 15:11:26 +0000</pubDate>
      <link>https://dev.to/menghif/slow-and-steady-400p</link>
      <guid>https://dev.to/menghif/slow-and-steady-400p</guid>
      <description>&lt;p&gt;This past Friday we released version 2.9 of &lt;a href="https://github.com/Seneca-CDOT/telescope" rel="noopener noreferrer"&gt;Telescope&lt;/a&gt; and we are now closer and closer to the big final 3.0 release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breaking things down
&lt;/h2&gt;

&lt;p&gt;I received feedback on my &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3237" rel="noopener noreferrer"&gt;PR&lt;/a&gt; from the previous week about sharing a single Nginx container for all static sites. The restructuring of the directories made the PR too big with hundreds of file changes (although most just renaming). To make it easier for reviewer (and for myself!) I decided to split the &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2993" rel="noopener noreferrer"&gt;work&lt;/a&gt; into multiple PRs. I started with moving the &lt;code&gt;src/web&lt;/code&gt; directory to &lt;code&gt;src/web/app&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I searched again through the whole project for paths that needed to be updated. This more narrow focus on a smaller task helped me find some relative paths that I missed in the original PR. This really shows the benefits of splitting a big task into smaller pieces to make it more manageable.&lt;/p&gt;

&lt;p&gt;Before merging this &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3287" rel="noopener noreferrer"&gt;PR&lt;/a&gt; we needed to update the path on &lt;a href="https://vercel.com/" rel="noopener noreferrer"&gt;Vercel&lt;/a&gt; and give a heads-up to other students working on frontend issues that they needed to rebase their branch before moving forward.&lt;/p&gt;

&lt;p&gt;I still have to do the same with the &lt;code&gt;docusaurus&lt;/code&gt; and &lt;code&gt;test-web-content&lt;/code&gt; directories and then make the necessary Docker and Nginx changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frontend changes
&lt;/h2&gt;

&lt;p&gt;The other &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2923" rel="noopener noreferrer"&gt;issue&lt;/a&gt; I worked on this week was adding a copy button for code snippets. I had to revisit a lot of Web APIs features so I spent a lot of time on &lt;a href="https://developer.mozilla.org/en-US/" rel="noopener noreferrer"&gt;MDN&lt;/a&gt; (I love this website, there's always something new to learn on it). I originally used &lt;code&gt;MouseEvent&lt;/code&gt; to capture the mouse movement and add a copy button to the DOM. &lt;a href="https://github.com/TueeNguyen" rel="noopener noreferrer"&gt;Tue&lt;/a&gt; helped out by suggesting to use &lt;code&gt;mouseenter&lt;/code&gt; and &lt;code&gt;mouseleave&lt;/code&gt; so I made the appropriate changes.&lt;/p&gt;

&lt;p&gt;As of Friday the copy button was working but the code was not great and it used the text 'copy' instead of an icon. Because of this it did not make it into the 2.9 release.&lt;/p&gt;

&lt;p&gt;Busy with an endless Android assignment that took over my weekend, I did not manage to continue to work on it. To my surprise, &lt;a href="https://github.com/DukeManh" rel="noopener noreferrer"&gt;Duc&lt;/a&gt; took over the &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3281" rel="noopener noreferrer"&gt;PR&lt;/a&gt; and made it truly great! His final version turned the button into a React component that feels a lot more at home on Telescope than my original version.&lt;/p&gt;

&lt;p&gt;Working on this reminded me that Open Source is a team sport and we really shouldn't be afraid to get help from others that might have more experience.&lt;/p&gt;

&lt;p&gt;Tue and I got the ball rolling and then Duc scored the goal. In the end we all win! 🔭&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Towards Telescope 2.9</title>
      <dc:creator>Francesco Menghi</dc:creator>
      <pubDate>Sat, 19 Mar 2022 21:38:46 +0000</pubDate>
      <link>https://dev.to/menghif/towards-telescope-29-4pcm</link>
      <guid>https://dev.to/menghif/towards-telescope-29-4pcm</guid>
      <description>&lt;p&gt;By the time we ship the last release this semester (&lt;a href="https://turborepo.org/" rel="noopener noreferrer"&gt;Telescope 3.0&lt;/a&gt; on April 21th), I would like to have finished our monorepo tooling setup with &lt;a href="https://turborepo.org/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;. So far we have made great progress as a group but there are still problems popping up &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/3153" rel="noopener noreferrer"&gt;left and right&lt;/a&gt;, especially with ESlint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monorepo tooling
&lt;/h2&gt;

&lt;p&gt;As of right now I am not assigned to any of these remaining ESLint bugs but I have been active fixing bugs related to CI, reviewing PRs and offering help to my peers.&lt;/p&gt;

&lt;p&gt;We are using Turborepo to manage ESLint in each package but there is more that can be done. We can use Turborepo for our tests as well so I will have an issue posted about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker and Nginx
&lt;/h2&gt;

&lt;p&gt;In the meantime, I have been working with Docker and Nginx because I wanted to get out of my comfort zone and learn more about these two very popular tools.&lt;/p&gt;

&lt;p&gt;I am very interested in Docker but I have only played with it on my own so far. I have learned the basics after watching all of the &lt;a href="https://apps.senecacollege.ca/ssos/findOutline.do?subjectCode=CCP555" rel="noopener noreferrer"&gt;CCP555&lt;/a&gt; lectures related to it.&lt;/p&gt;

&lt;p&gt;I picked up an &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2993" rel="noopener noreferrer"&gt;issue&lt;/a&gt; about sharing a single nginx container for all static sites. To do this I had to restructure the project to have both the Telescope app and our new Docusaurus docs to share a single Dockerfile. Inside this new Dockerfile, there will be a single Nginx container to deploy both sites.&lt;/p&gt;

&lt;p&gt;I like this change because it will group all of our static sites into &lt;code&gt;src/web&lt;/code&gt;. The &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3237" rel="noopener noreferrer"&gt;PR&lt;/a&gt; is still a work in progress but I am hoping to have it ready for Telescope 2.9 next week.&lt;/p&gt;

</description>
      <category>monorepo</category>
      <category>telescope</category>
    </item>
    <item>
      <title>Last piece of the puzzle: Moving Satellite inside Telescope</title>
      <dc:creator>Francesco Menghi</dc:creator>
      <pubDate>Sat, 12 Mar 2022 17:06:40 +0000</pubDate>
      <link>https://dev.to/menghif/last-piece-of-the-puzzle-moving-satellite-inside-telescope-1f89</link>
      <guid>https://dev.to/menghif/last-piece-of-the-puzzle-moving-satellite-inside-telescope-1f89</guid>
      <description>&lt;p&gt;This week we released Telescope 2.8 and, as part of the new release, we &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2677" rel="noopener noreferrer"&gt;moved&lt;/a&gt; the &lt;a href="https://github.com/Seneca-CDOT/satellite" rel="noopener noreferrer"&gt;Satellite&lt;/a&gt; project inside of the &lt;a href="https://github.com/Seneca-CDOT/telescope" rel="noopener noreferrer"&gt;Telescope&lt;/a&gt; monorepo. Satellite is the microservice framework used by Telescope.&lt;/p&gt;

&lt;p&gt;I am excited about this change because until now Satellite was the only piece of the telescope project that was in a separate repo. Now we will be able to work on Satellite all from within the monorepo!&lt;/p&gt;

&lt;p&gt;This is only possible because we can publish the Satellite package to the Npmjs registry using &lt;code&gt;pnpm -r publish&lt;/code&gt; as I discussed in my previous &lt;a href="https://dev.to/menghif/publish-packages-from-within-a-monorepo-3b96"&gt;blog post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The initial idea was to copy the project's files over to &lt;code&gt;src/satellite&lt;/code&gt; in Telescope and then add to &lt;code&gt;package.json&lt;/code&gt; a &lt;a href="https://docs.npmjs.com/cli/v6/configuring-npm/package-json#people-fields-author-contributors" rel="noopener noreferrer"&gt;section&lt;/a&gt; about the original contributors like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-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;"name"&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="s2"&gt;"Barney Rubble"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&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="s2"&gt;"b@rubble.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&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="s2"&gt;"http://barnyrubble.tumblr.com/"&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;However this was not great because we would have lost all of the git history. Thanks to &lt;a href="https://github.com/DukeManh" rel="noopener noreferrer"&gt;Duke&lt;/a&gt;, I discovered a very useful git command called &lt;code&gt;subtree&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Git subtree
&lt;/h2&gt;

&lt;p&gt;This is the full command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git subtree add --prefix src/satellite/ git@github.com:Seneca-CDOT/satellite.git HEAD&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Let's break it down.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--prefix&lt;/code&gt;: this tells git where to add the repo. In our case it's in &lt;code&gt;src/satellite&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git@github.com:Seneca-CDOT/satellite.git&lt;/code&gt;: Satellite repo remote address.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;HEAD&lt;/code&gt;: reference to the latest commit in the Telescope branch.&lt;/p&gt;

&lt;p&gt;After successfully running the above command, we get this commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;commit 85522ffc4205da8c6a6f736073f55aaff595c382
Merge: 8360d5dc 5491bbb0
&lt;/span&gt;&lt;span class="gp"&gt;Author: Francesco Menghi &amp;lt;53121061+menghif@users.noreply.github.com&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;Date:   Tue Mar 8 09:55:48 2022 -0500

    Add 'src/satellite/' from commit '5491bbb058d121552a3191b49199d75cfc56956b'

    git-subtree-dir: src/satellite
    git-subtree-mainline: 8360d5dc434878d92527bc134882ea1aed003e53
    git-subtree-split: 5491bbb058d121552a3191b49199d75cfc56956b
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;git-subtree-mainline&lt;/code&gt; is the last Telescope commit and &lt;code&gt;git-subtree-split&lt;/code&gt; is the last Satellite commit.&lt;/p&gt;

&lt;h2&gt;
  
  
  ESLint fixes
&lt;/h2&gt;

&lt;p&gt;Once the Satellite &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3136" rel="noopener noreferrer"&gt;PR&lt;/a&gt; was merged, I worked on the ESLint config for Satellite (&lt;a href="https://github.com/Seneca-CDOT/telescope/issues/3144" rel="noopener noreferrer"&gt;Issue&lt;/a&gt;, &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/3151" rel="noopener noreferrer"&gt;PR&lt;/a&gt;). While doing this, I discovered that all of the other package's ESLint configurations were not setup properly and so we were not actually linting our code at all.&lt;/p&gt;

&lt;p&gt;Since we had an ESLint config for the whole repo before and now we have a config for each package within the repo, we are still getting used to the change.&lt;/p&gt;

&lt;p&gt;Basically we were missing the &lt;code&gt;eslint&lt;/code&gt; and &lt;code&gt;@senecacdot/eslint-config-telescope&lt;/code&gt; dependencies in each package so the command &lt;code&gt;pnpm lint&lt;/code&gt; was not actually doing anything.&lt;/p&gt;

&lt;p&gt;This is now being fixed and tracked in this &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/3153" rel="noopener noreferrer"&gt;Metabug&lt;/a&gt;. Soon ESLint will be fully functional again and faster than ever thanks to &lt;a href="https://turborepo.org/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>git</category>
      <category>monorepo</category>
      <category>eslint</category>
    </item>
    <item>
      <title>Publish packages from within a Monorepo</title>
      <dc:creator>Francesco Menghi</dc:creator>
      <pubDate>Tue, 01 Mar 2022 02:47:24 +0000</pubDate>
      <link>https://dev.to/menghif/publish-packages-from-within-a-monorepo-3b96</link>
      <guid>https://dev.to/menghif/publish-packages-from-within-a-monorepo-3b96</guid>
      <description>&lt;p&gt;In this blog post I will go over the details of how we manage and publish packages inside our Telescope monorepo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/humphd/" rel="noopener noreferrer"&gt;David&lt;/a&gt; recently shared a &lt;a href="https://monorepo.tools/" rel="noopener noreferrer"&gt;link&lt;/a&gt; where I found a good definition for monorepo that I wanted to share:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A monorepo is a single repository containing multiple distinct projects, with well-defined relationships.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Within Telescope, we have just that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;└── src
   ├── api
   ├── backend
   ├── docs
   ├── mobile
   └── web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have all of the APIs, backend, frontend, mobile app and the new Docusaurus docs all inside the same repo.&lt;/p&gt;

&lt;p&gt;We recently made the switch to Turborepo and to try out its &lt;a href="https://turborepo.org/docs" rel="noopener noreferrer"&gt;features&lt;/a&gt;, I have &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2862" rel="noopener noreferrer"&gt;changed&lt;/a&gt; the way we lint our project. We used to run eslint from the root of Telescope, but now we have individual &lt;code&gt;.eslintrc.js&lt;/code&gt; files inside each project and let Turborepo manage it all.&lt;/p&gt;

&lt;p&gt;Since &lt;a href="https://turborepo.org/blog/turbo-1-1-0#turbojson-support" rel="noopener noreferrer"&gt;version 1.1&lt;/a&gt;, Turborepo config moved from &lt;code&gt;package.json&lt;/code&gt; to its own &lt;code&gt;turbo.json&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;This is our &lt;code&gt;turbo.json&lt;/code&gt; that defines the &lt;code&gt;lint&lt;/code&gt; command inside its &lt;code&gt;pipeline&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-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;"pipeline"&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;"build"&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;"dependsOn"&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;"^build"&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;"lint"&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;"outputs"&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="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="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;When we run &lt;code&gt;pnpm turbo run lint&lt;/code&gt;, Turborepo will go over each package defined in &lt;code&gt;pnpm-workspace.yaml&lt;/code&gt; and run the lint command. This process is very efficient because it keeps a cache and reuses it if there are no changes to the files in the project.&lt;/p&gt;

&lt;p&gt;For example, if I make changes to the docs, Turborepo will only run eslint in the docs, and use the previously created cache for everywhere else.&lt;/p&gt;

&lt;p&gt;We have a new &lt;code&gt;@senecacdot/eslint-config-telescope&lt;/code&gt; package that contains the rules we reuse with every &lt;code&gt;.eslintrc.js&lt;/code&gt; and it lives inside the &lt;code&gt;tools&lt;/code&gt; directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;└── tools
   └── eslint
      ├── index.js
      └── package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This package is &lt;a href="https://www.npmjs.com/package/@senecacdot/eslint-config-telescope" rel="noopener noreferrer"&gt;published&lt;/a&gt; to the npmjs registry. To call it inside a &lt;code&gt;.eslintrc.js&lt;/code&gt; file we use &lt;code&gt;extends&lt;/code&gt;:&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="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="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;extends&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@senecacdot/eslint-config-telescope&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="na"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="c1"&gt;// more rules here&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;Since &lt;code&gt;@senecacdot/eslint-config-telescope&lt;/code&gt; lives inside the monorepo, we have automated the release of the package thanks to &lt;a href="https://pnpm.io/cli/publish" rel="noopener noreferrer"&gt;pnpm publish&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Release to npmjs registry
&lt;/h3&gt;

&lt;p&gt;There is a GitHub Actions &lt;a href="https://github.com/Seneca-CDOT/telescope/blob/master/.github/workflows/release.yml" rel="noopener noreferrer"&gt;workflow&lt;/a&gt; that handles the release of Telescope and, at the end of it, I added:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pnpm/action-setup@v2.0.1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;6.30.1&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NPM Publish&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;16.x'&lt;/span&gt;
          &lt;span class="na"&gt;registry-url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://registry.npmjs.org'&lt;/span&gt;
          &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pnpm'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pnpm install&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pnpm -r publish --no-git-checks --access=public&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;NODE_AUTH_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.NPM_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key part here is &lt;code&gt;pnpm -r publish&lt;/code&gt;. The &lt;code&gt;-r&lt;/code&gt; stands for recursive: pnpm will go look at each &lt;code&gt;package.json&lt;/code&gt; to see if a package has an updated version and, if so, will publish it to the registry.&lt;/p&gt;

</description>
      <category>monorepo</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Telescope Sheriff</title>
      <dc:creator>Francesco Menghi</dc:creator>
      <pubDate>Mon, 21 Feb 2022 16:37:17 +0000</pubDate>
      <link>https://dev.to/menghif/telescope-sheriff-bep</link>
      <guid>https://dev.to/menghif/telescope-sheriff-bep</guid>
      <description>&lt;p&gt;This past week it was my turn to be &lt;a href="https://github.com/Seneca-CDOT/telescope/wiki/How-to-be-a-Sheriff" rel="noopener noreferrer"&gt;sheriff&lt;/a&gt; for the &lt;a href="https://github.com/Seneca-CDOT/telescope" rel="noopener noreferrer"&gt;Telescope&lt;/a&gt; project. There were a lot of responsibilities and a lot of tasks to complete.&lt;/p&gt;

&lt;p&gt;A big part of the role is to lead the weekly meetings, go over outstanding PRs and assign tasks for the following release. It was my turn to be at the helm of the ship and to always be available on Slack if any problem occurred. Looking at all the incoming PRs forced me to have a more holistic view of Telescope and learn more about all the great things other students are working on.&lt;/p&gt;

&lt;p&gt;My outstanding PR about &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2862" rel="noopener noreferrer"&gt;Turborepo linting&lt;/a&gt; was merged and I will have another blog post to talk about it in more details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breaking Telescope
&lt;/h2&gt;

&lt;p&gt;Everything went pretty smoothly until it was time for the release. While on a call with &lt;a href="https://github.com/TueeNguyen" rel="noopener noreferrer"&gt;Tue&lt;/a&gt; and &lt;a href="https://github.com/humphd" rel="noopener noreferrer"&gt;David&lt;/a&gt;, releasing version 2.7 of Telescope first broke production and then staging.&lt;br&gt;
The call quickly turned into a one hour debugging session and I experienced first hand how to debug Docker containers from David (Which is something still new for me).&lt;/p&gt;

&lt;p&gt;The issue was caused by a recent &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2957" rel="noopener noreferrer"&gt;PR&lt;/a&gt; that changed SECRET to JWT_SECRET (To use with the latest version of &lt;a href="https://github.com/Seneca-CDOT/satellite" rel="noopener noreferrer"&gt;Satellite&lt;/a&gt;) without adding the required variables in &lt;code&gt;env.staging&lt;/code&gt; and &lt;code&gt;env.production&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project management
&lt;/h2&gt;

&lt;p&gt;Over the week I reviewed many more PRs than in the past and merged a lot of them into master myself. I also added milestone labels and tags to keep things organized.&lt;/p&gt;

&lt;p&gt;This experience made me realize how much non coding related work there is to manage an open source project. I now understand why teams in big projects have people specialized in doing this all day and keep team members accountable and on track with their work.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>management</category>
    </item>
    <item>
      <title>Packages, Docs and Accessibility</title>
      <dc:creator>Francesco Menghi</dc:creator>
      <pubDate>Sat, 12 Feb 2022 03:40:03 +0000</pubDate>
      <link>https://dev.to/menghif/packages-docs-and-accessibility-46k7</link>
      <guid>https://dev.to/menghif/packages-docs-and-accessibility-46k7</guid>
      <description>&lt;p&gt;There has been a lot of activity within the Telescope project and it's going so fast that it is hard to follow everything. From my end, I am still working a lot on monorepo tooling with Turborepo, but I also decided to pick other interesting issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monorepo local package
&lt;/h2&gt;

&lt;p&gt;After reviewing &lt;a href="https://github.com/tcvan0707" rel="noopener noreferrer"&gt;Thanh&lt;/a&gt;'s &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2805" rel="noopener noreferrer"&gt;Pull Request&lt;/a&gt; about starting to &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2736" rel="noopener noreferrer"&gt;migrate eslint to our microservices&lt;/a&gt; (with the goal to speed things up with Turborepo), I realized that we would end up with many &lt;code&gt;.eslint.js&lt;/code&gt; files containing a lot of duplicate code.&lt;/p&gt;

&lt;p&gt;It turns out that it is possible to have a local package in a monorepo and share it to our microservices without having to publish it. So, &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2862" rel="noopener noreferrer"&gt;the idea&lt;/a&gt; I had was to create a local eslint-config package and reuse it in all of our microsevices, thus reducing any duplicate code.&lt;/p&gt;

&lt;p&gt;This is possible thanks to the pnpm &lt;a href="https://pnpm.io/workspaces" rel="noopener noreferrer"&gt;workspaces&lt;/a&gt; feature. For example to add the &lt;code&gt;eslint-config&lt;/code&gt; package to a microservice, we would add it as a dependency in its &lt;code&gt;package.json&lt;/code&gt; 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;"eslint-config": "workspace:*"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will search for the &lt;code&gt;eslint-config&lt;/code&gt; package inside each workspace defined in &lt;code&gt;pnpm-workspaces.yaml&lt;/code&gt; instead of searching the npmjs registry.&lt;/p&gt;

&lt;p&gt;A local package seemed like a great solution in my mind by after opening the PR, we quickly realized that we still rely on npm in some places, so we will not be able to follow this path.&lt;/p&gt;

&lt;p&gt;The other solution suggested by Dave is to actually publish the &lt;code&gt;eslint-config&lt;/code&gt; package to the npmjs registry. The &lt;a href="https://twitter.com/humphd/status/1491873257007599620" rel="noopener noreferrer"&gt;question&lt;/a&gt; is, how do you automate the release of a package that lives inside a monorepo?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/zkochan" rel="noopener noreferrer"&gt;Zoltan&lt;/a&gt;, the author of &lt;code&gt;pnpm&lt;/code&gt; &lt;a href="https://twitter.com/ZoltanKochan/status/1491876468225458179" rel="noopener noreferrer"&gt;responded&lt;/a&gt; to Dave's tweet and said that we can actually use &lt;a href="https://pnpm.io/cli/publish" rel="noopener noreferrer"&gt;&lt;strong&gt;pnpm publish&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;According to the docs:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When running this command recursively (pnpm -r publish), pnpm will publish all the packages that have versions not yet published to the registry.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I still have to test and see if it will work, I will have an update on next week's blog, but I am hopeful!&lt;/p&gt;

&lt;h2&gt;
  
  
  Accessibility Improvements
&lt;/h2&gt;

&lt;p&gt;Something that I really enjoyed this week was diving deeper into accessibility standards for the web. I started by picking  this &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1608" rel="noopener noreferrer"&gt;issue&lt;/a&gt; about improving the accessibility of Telescope.&lt;/p&gt;

&lt;p&gt;Since the main Telescope page is a feed of many blogs, we cannot control if the authors use proper accessibility standards. So what I decided to tackle was Telescope's About page.&lt;/p&gt;

&lt;p&gt;Using Google Lighthouse, I found three accessibility issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://web.dev/link-name/" rel="noopener noreferrer"&gt;Links do not have a discernible name&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.dev/heading-order/" rel="noopener noreferrer"&gt;Heading elements are not in a sequentially-descending order&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.dev/tap-targets/" rel="noopener noreferrer"&gt;Tap targets are not sized appropriately&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2884" rel="noopener noreferrer"&gt;fixes&lt;/a&gt; take the page to a perfect 100 accessibility score which is nice to see.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftlboxjucwzxb0kzdivtr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftlboxjucwzxb0kzdivtr.jpg" alt="Lighthouse Accessibility Score: 100" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Docusaurus!
&lt;/h2&gt;

&lt;p&gt;Last semester I loved working with Docusaurus but I was left hungry for more. This week, &lt;a href="https://github.com/cindyledev" rel="noopener noreferrer"&gt;Cindy&lt;/a&gt; migrated the telescope docs to Docusaurus and I had to get involved!&lt;/p&gt;

&lt;p&gt;I reviewed Cindy's &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2869" rel="noopener noreferrer"&gt;PR&lt;/a&gt; and also worked on &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2882" rel="noopener noreferrer"&gt;improving the Getting Started page&lt;/a&gt; by taking advantage of a cool Docusaurus feature called &lt;a href="https://docusaurus.io/docs/next/markdown-features/tabs" rel="noopener noreferrer"&gt;tabs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since Docusaurus is build with React, we can actually use &lt;strong&gt;JSX in Markdown&lt;/strong&gt; (which is actually &lt;a href="https://mdxjs.com/" rel="noopener noreferrer"&gt;MDX&lt;/a&gt;... mind blown!) and that's how the Tabs feature is implemented.&lt;/p&gt;

&lt;p&gt;The idea was to separate the Docker installation guide based on the operating system (Windows, macOS, Linux) to simplify the reading experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzoskn0q8379kvy24aoll.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzoskn0q8379kvy24aoll.jpg" alt="Tabs in markdown" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I think the &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2888" rel="noopener noreferrer"&gt;end result&lt;/a&gt; is great and I cannot wait for the Docusaurus documentation to ship!&lt;/p&gt;

</description>
      <category>monorepo</category>
      <category>pnpm</category>
      <category>docusaurus</category>
      <category>a11y</category>
    </item>
    <item>
      <title>Fixes and documentation</title>
      <dc:creator>Francesco Menghi</dc:creator>
      <pubDate>Sat, 05 Feb 2022 02:48:53 +0000</pubDate>
      <link>https://dev.to/menghif/fixes-and-documentation-hg6</link>
      <guid>https://dev.to/menghif/fixes-and-documentation-hg6</guid>
      <description>&lt;p&gt;This week I spent some time helping other students getting acquainted with &lt;a href="https://turborepo.org/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt; by running a meeting and answer questions. It was a good exercise since I don't get to present very often and I was reminded that having to explain something to others is one of the best ways to learn. I'm happy that there is excitement around Turborepo and that more people are getting involved.&lt;/p&gt;

&lt;p&gt;After the meeting I wrote a small documentation page (&lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2737" rel="noopener noreferrer"&gt;Issue&lt;/a&gt;, &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2813" rel="noopener noreferrer"&gt;Pull Request&lt;/a&gt;) for how we use Turborepo within &lt;a href="https://telescope.cdot.systems/" rel="noopener noreferrer"&gt;Telescope&lt;/a&gt; to be able to explain the basic commands to newcomers.&lt;/p&gt;

&lt;h3&gt;
  
  
  CSS Fix
&lt;/h3&gt;

&lt;p&gt;We have recently finished the mobile version of the GitHub info sidebar and it looks great but, after every new feature there are always bugs trailing behind.&lt;/p&gt;

&lt;p&gt;One &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2778" rel="noopener noreferrer"&gt;bug&lt;/a&gt; resurfaced recently. There was a horizontal overflow at certain window sizes that was caused by the addition of &lt;code&gt;display: 'flex'&lt;/code&gt;. We used the flex layout for the mobile view but we don't need it for the desktop view.&lt;/p&gt;

&lt;p&gt;To &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2839" rel="noopener noreferrer"&gt;fix&lt;/a&gt; this I put &lt;code&gt;display: 'flex'&lt;/code&gt; and &lt;code&gt;flexWrap: 'wrap'&lt;/code&gt;  inside of &lt;code&gt;theme.breakpoints.down(1205)&lt;/code&gt; to use flexbox only for the mobile view (Window size smaller than 1205px).&lt;/p&gt;

&lt;h3&gt;
  
  
  Towards Telescope 2.7
&lt;/h3&gt;

&lt;p&gt;There is an ongoing &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2677" rel="noopener noreferrer"&gt;issue&lt;/a&gt; that I am trying to address: moving the &lt;a href="https://github.com/Seneca-CDOT/satellite" rel="noopener noreferrer"&gt;Satellite&lt;/a&gt; repo inside Telescope to complete the monorepo. I haven't been successful so far, so I will ask other students to collaborate on this one, and maybe it can be done by Release 2.7.&lt;/p&gt;

&lt;p&gt;Finally I am looking to expand my knowledge of Docker so I assigned myself to this &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2835" rel="noopener noreferrer"&gt;issue&lt;/a&gt; about modifying one of our containers to use a smaller image. I like everything that has to do with optimization and speeding up workflows, so this seems like a great fit.&lt;/p&gt;

&lt;p&gt;There's a lot of activity within the Telescope community so I'll be on the lookout for more issues to hack on.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Turborepo, React Native and more</title>
      <dc:creator>Francesco Menghi</dc:creator>
      <pubDate>Sat, 29 Jan 2022 16:22:48 +0000</pubDate>
      <link>https://dev.to/menghif/turborepo-react-native-and-more-2m0h</link>
      <guid>https://dev.to/menghif/turborepo-react-native-and-more-2m0h</guid>
      <description>&lt;p&gt;As I was writing this blog post last night, I got distracted by a dependency vulnerability alert on &lt;a href="https://github.com/Seneca-CDOT/telescope" rel="noopener noreferrer"&gt;telescope&lt;/a&gt;. I ended up merging the automatic &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2772" rel="noopener noreferrer"&gt;PR&lt;/a&gt; from &lt;a href="https://github.com/marketplace/renovate" rel="noopener noreferrer"&gt;renovatebot&lt;/a&gt; and then did a patch release. We are now at version 2.5.4. Our fourth patch release in the span of one week!&lt;/p&gt;

&lt;p&gt;One thing I love about Open Source is the flexibility. We have plans and a release schedule to keep everyone on track but, if I have an idea (or if I find a bug), I can bring it up, send a Pull Request and the unplanned change quickly finds its way to the master branch.&lt;/p&gt;

&lt;p&gt;This week I had two of these moments while working on bigger tasks.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2726" rel="noopener noreferrer"&gt;&lt;em&gt;first&lt;/em&gt;&lt;/a&gt; was fixing a css bug I noticed while using telescope on Safari on my mac. It can be tedious to find the reason why Safari is not acting the same as Firefox and Chrome (Safari is generally behind when it comes to implementing some CSS properties). However, after some trial and error and some luck, I managed to fix the bug by removing just on line of code.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2749" rel="noopener noreferrer"&gt;&lt;em&gt;second&lt;/em&gt;&lt;/a&gt; small fix was an update that I &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2741" rel="noopener noreferrer"&gt;suggested&lt;/a&gt; for our GitHub Actions CI implementation. I noticed that all of our tests (that usually take about 10 minutes to complete) would run even for a simple change that does not impact the code such as updating the docs.&lt;/p&gt;

&lt;p&gt;I followed the GitHub Actions &lt;a href="https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#example-excluding-paths" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; and I added a &lt;code&gt;paths-ignore&lt;/code&gt; option to ignore the &lt;code&gt;/docs&lt;/code&gt; folder for the workflow that we run every time something is pushed to a PR or to master. There is now a docs specific workflow that is much faster because it only includes Prettier and ESLint (1 minute in total run time).&lt;/p&gt;

&lt;p&gt;Other than these two small changes, what I worked on this week (and what took most of my time) involved &lt;a href="https://turborepo.org" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt; and &lt;a href="https://expo.dev" rel="noopener noreferrer"&gt;Expo&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Turborepo
&lt;/h3&gt;

&lt;p&gt;I briefly talked about Turborepo in my previous &lt;a href="https://dev.to/menghif/telescope-25-update-4lcd"&gt;blog post&lt;/a&gt;: It is a fantastic tool to manage a monorepo like telescope. This week my &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2721" rel="noopener noreferrer"&gt;PR&lt;/a&gt; to &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1778" rel="noopener noreferrer"&gt;add support for Turborepo&lt;/a&gt; was merged and we are now ready to use it with &lt;code&gt;pnpm&lt;/code&gt;. As of right, now it is only used for the &lt;code&gt;build&lt;/code&gt; command: Using &lt;code&gt;pnpm turbo run build&lt;/code&gt; will go look inside each workspaces (using &lt;code&gt;pnpm-workspace.yaml&lt;/code&gt;) to look for a &lt;code&gt;build&lt;/code&gt; command and then will run them all.&lt;/p&gt;

&lt;p&gt;Other students have shown interest in the Turborepo setup. In the coming weeks, we will work together to get to a point where we can use this tool to its &lt;a href="https://turborepo.org/docs#why-turborepo" rel="noopener noreferrer"&gt;full potential&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  React Native with Expo
&lt;/h3&gt;

&lt;p&gt;The last thing I worked on this week was &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2729" rel="noopener noreferrer"&gt;setting up a new React Native project&lt;/a&gt; within the telescope monorepo.&lt;/p&gt;

&lt;p&gt;As a group we decided to use Expo, which is a framework to manage a React Native app. The problem I ran into was that Expo is not currently compatible with &lt;code&gt;pnpm&lt;/code&gt;. As a workaround we now change directory to &lt;code&gt;src/mobile&lt;/code&gt; where the React Native app lives and then use &lt;code&gt;npm&lt;/code&gt; there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcuhh41uhjb8m0kry3t7l.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcuhh41uhjb8m0kry3t7l.jpg" alt="Expo with iOS Simulator" width="800" height="634"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I tested the app on iOS, Android and the web and it works on all 3 platforms (The &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2744" rel="noopener noreferrer"&gt;PR&lt;/a&gt; was merged yesterday). The app is empty for now but by the end of the semester we should have something functional and maybe even publish it to the App Store and Play Store!&lt;/p&gt;

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