<?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: Azriz Jasni</title>
    <description>The latest articles on DEV Community by Azriz Jasni (@azrizhaziq).</description>
    <link>https://dev.to/azrizhaziq</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%2F86582%2F93c78063-72ac-4713-a4b9-0a7b2fa63de6.jpeg</url>
      <title>DEV Community: Azriz Jasni</title>
      <link>https://dev.to/azrizhaziq</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/azrizhaziq"/>
    <language>en</language>
    <item>
      <title>Have you come across any websites that frustrate you?</title>
      <dc:creator>Azriz Jasni</dc:creator>
      <pubDate>Mon, 07 Jun 2021 00:57:05 +0000</pubDate>
      <link>https://dev.to/azrizhaziq/have-you-come-across-few-websites-that-you-frustrate-hlc</link>
      <guid>https://dev.to/azrizhaziq/have-you-come-across-few-websites-that-you-frustrate-hlc</guid>
      <description>&lt;p&gt;Frustrated because of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accessibility.&lt;/li&gt;
&lt;li&gt;Color contrast.&lt;/li&gt;
&lt;li&gt;Font too small, font type was set to &lt;code&gt;comic-sans&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Input does not auto-focus. Usually in sign-in page.&lt;/li&gt;
&lt;li&gt;Can't scroll the website since you have ad-block installed.&lt;/li&gt;
&lt;li&gt;Cant click disabled element&lt;/li&gt;
&lt;li&gt;No shortcut key&lt;/li&gt;
&lt;li&gt;Manually key-in a lot of input forms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fret not, I'll share few things from the list what you can do about it.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Can't click disabled dropdown/button
&lt;/h3&gt;

&lt;p&gt;Usually I faced this on client-side validation. The dev implement this to ensure and prevent user doing something funny. For your information, this is only on client side validation and let's be honest here, it's not all developer had a time to work on backend validation. So this is where we can take advantage. &lt;/p&gt;

&lt;p&gt;Most of the time the DOM will have similar structure like below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- copied from w3school --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;'iphone'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Buy iphone now!!&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;select&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;'iphone'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;'6'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;6 (only 50 left)&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;'7'&lt;/span&gt; &lt;span class="na"&gt;disabled&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;7 (sorry out of stocks)&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;'8'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;8&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You are dying want to buy iphone 7 but none left. What are we waiting for? just open your devtools and inspect the element using CMDSHIFTc (mac) or CTRLSHIFTc (window/linux), and hover to dropdown. After that, just double-click &lt;code&gt;disable&lt;/code&gt; and delete it. Now try to select and submit the form. If there is no error message then we are all good!!. You can use the same trick with disabled button.&lt;/p&gt;

&lt;p&gt;Also please note that, the dev could also set the element with &lt;code&gt;user-select: none&lt;/code&gt;. So in this case, just delete that css property.&lt;/p&gt;

&lt;h4&gt;
  
  
  Notes for devs:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;You should really consider working on validation in server side.&lt;/li&gt;
&lt;li&gt;Write tests, so that you can ship your product with confidence.&lt;/li&gt;
&lt;li&gt;For client side, add a second validation in javascript if else statement. It's not a perfect solution, but it just so that naughty user have difficult time.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isFormValid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;showErrorMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your-post-url&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Can't scroll the website since you have ad-block installed.
&lt;/h3&gt;

&lt;p&gt;If you happen to face this, we are on the same side. Kinda annoying since the website will usually block the scroll and will have big popup modal. So how to overcome this issue is:&lt;/p&gt;

&lt;p&gt;Install this extension&lt;br&gt;
&lt;a href="https://chrome.google.com/webstore/detail/user-javascript-and-css/nbhcbdghjpllgmfilhnhkllmkecfmpld"&gt;https://chrome.google.com/webstore/detail/user-javascript-and-css/nbhcbdghjpllgmfilhnhkllmkecfmpld&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What you can do with this extension is, you can inject your own javascript or css. So in our case here, usually I notice the dev will add &lt;code&gt;overflow: none&lt;/code&gt; to body.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So how we can combat this, here are the steps that you can follow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make sure you are on the website that you want to overwrite.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the extension and click "add new"&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PRaaIqPo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d1vmrdwvhqqf5wj9dfyi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PRaaIqPo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d1vmrdwvhqqf5wj9dfyi.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It will redirect you to a new tab.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Paste this css into css section&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;unset&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ojby-5iT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/epdh9c2lauetayppadja.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ojby-5iT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/epdh9c2lauetayppadja.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy right? Somehow, not all website are structured like this.&lt;/li&gt;
&lt;li&gt;Sometimes, it's not the body that is being blocked. It could be 2-3 level children of &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Also, to put this to every website it's not friendly. So in that case, change match url to &lt;code&gt;*&lt;/code&gt;, it will run to every website. Be warned tho, that this can have side effect tho.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How about the big modal?. You can use something like below to remove the modal.&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="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.ads-modal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But it'll be a little bit tricky, since we don't know when the modal is being shown to us. So I'm gonna share you an approach to auto remove the modal.&lt;/p&gt;

&lt;h4&gt;
  
  
  Using mutation observer + promise
&lt;/h4&gt;

&lt;p&gt;Basic idea with mutation observer is, if there are any changes happen to element that being observe, it will trigger an event. For example if the attributes, classes, children is being mutate, added, or deleted. &lt;/p&gt;

&lt;p&gt;This function is pretty handy and its really use-full especially if you are working on with browser extension. I also happen to use this function in my &lt;a href="https://github.com/AzrizHaziq/tradingview-syariah-indicator/blob/d3803978a70225ac6e4e4f4171ebb664761821e0/src/helper.js#L163-L181"&gt;extension here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// The original of work is from StackOverflow.&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;waitForElm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;found&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selector&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;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;MutationObserver&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="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;found, observer.disconnect()&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
          &lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disconnect&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;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;childList&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;subtree&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// find the element that you want to delete. &lt;/span&gt;
&lt;span class="c1"&gt;// Once mutation observer found it, it will resolve and run .remove()&lt;/span&gt;
&lt;span class="nx"&gt;waitForElm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.ads-modal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Notes for devs
&lt;/h4&gt;

&lt;p&gt;You can do a lot of stuff to punish users using ad-block.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can use this &lt;a href="https://dev.to/codingnepal/detect-adblock-using-html-css-javascript-dkh"&gt;approach&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/codingnepal"&gt;@codingnepal&lt;/a&gt;
.&lt;/li&gt;
&lt;li&gt;Use a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver"&gt;MutationObserver&lt;/a&gt; to the element you want to observe. Check if the element's attribute or css property is being changed or not, if so then run your custom script.&lt;/li&gt;
&lt;li&gt;Also there is some other people will use &lt;code&gt;print mode&lt;/code&gt; to read the content before the big modal popup show up. So in this case, write a custom css print media-queries.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;  &lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="n"&gt;print&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="nc"&gt;.user-has-ads-block&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt; &lt;span class="cp"&gt;!important&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;ul&gt;
&lt;li&gt;But, if you do like aforementioned above, I'm sure you are not getting any visitor soon 🤣.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Website does not provide shortcut key
&lt;/h3&gt;

&lt;p&gt;If you are regular visitor to certain website, and you also happen to click a lot certain buttons/actions, then is a good use case where you can create your own shortcut key. We will use same extension here, and below I would like to share a shortcut key to navigate twitter &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt; faster(the left side navigations).&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="c1"&gt;// go to twitter.com, and click "add new" at the extension popup. &lt;/span&gt;
&lt;span class="c1"&gt;// you might want to change the url match to https://twitter.com/**&lt;/span&gt;
&lt;span class="c1"&gt;// put this script in javascript section&lt;/span&gt;
&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keyup&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ctrlKey&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;navEle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nav&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;noKeyPress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Digit&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="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// get user key pressed and convert it to number&lt;/span&gt;

    &lt;span class="c1"&gt;// if user click No that larger than menu navigation has, then ignore it.&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;noKeyPress&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;navEle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// click the nav item&lt;/span&gt;
    &lt;span class="nx"&gt;navEle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;noKeyPress&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that you have set up it, try press CTRL2, it will navigate you to &lt;a href="https://twitter.com/explore"&gt;https://twitter.com/explore&lt;/a&gt;. You can customise your shortcut to your own preferences.&lt;/p&gt;

&lt;h2&gt;
  
  
  To summarise
&lt;/h2&gt;

&lt;p&gt;So if you have ever face any frustration with any websites, then just &lt;strong&gt;write a script&lt;/strong&gt; for it. You can also get more creative and write script to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automate your stuff. For example, buying hot-deals items which open at a limit time.&lt;/li&gt;
&lt;li&gt;Execute buy/sell in trade markets (should do with api tho).&lt;/li&gt;
&lt;li&gt;Stomping noobs in game.&lt;/li&gt;
&lt;li&gt;For Quality Engineer to test.&lt;/li&gt;
&lt;li&gt;Find a loophole in website for security purpose.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hope you learn something and thank you for your time.&lt;/p&gt;

&lt;p&gt;cover image by: &lt;a href="https://unsplash.com/@punttim"&gt;https://unsplash.com/@punttim&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>I've been using vim in total a year, and I'll stick to it. </title>
      <dc:creator>Azriz Jasni</dc:creator>
      <pubDate>Sat, 05 Jun 2021 00:06:19 +0000</pubDate>
      <link>https://dev.to/azrizhaziq/i-ve-been-using-vim-in-total-a-year-and-i-ll-stick-using-it-2e8k</link>
      <guid>https://dev.to/azrizhaziq/i-ve-been-using-vim-in-total-a-year-and-i-ll-stick-using-it-2e8k</guid>
      <description>&lt;p&gt;And heres why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;after you learn vim, you will be less pressing ALT, CMD, CTRL, HOME.&lt;/li&gt;
&lt;li&gt;you can achieve so many things with less keystrokes&lt;/li&gt;
&lt;li&gt;vim also can record your commands with macros, so be sure to check it out below.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/IiwGbcd8S7I"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/d8XtNXutVto"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I'll be sharing few highlights from both of the video above that I feel its very handy. Hence, if you just started to
learn how to use vim, please watch both of the video first as my examples below is suitable to someone already familiar
with basics(Visual, Editing, Deleting, and Navigating). &lt;/li&gt;
&lt;li&gt;However, I'll try to make this interactive as much as possible,
so that anyone could get start easily. Since both of the video is quite long, I have 1 little tip on how to learn faster
on my previous &lt;a href="https://dev.to/azrizhaziq/unpopular-opinion-on-learning-approach-119i"&gt;article&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Few notes before we start:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;First, I've been editing this article for quite long with nested bullet points, and it doesn't really work. The
numbering, indentation and some other stuff not properly align. Hence, I'll be using gist since it works fine. Also average reading will be around ~10min instead of 2min.&lt;/li&gt;
&lt;li&gt;All the char is case-sensitive, and please excuse me if I'm using incorrect term/syntax 😅.&lt;/li&gt;
&lt;li&gt;Please note that on below example I'll be using a lot of &lt;code&gt;&amp;lt;cursor here&amp;gt;&lt;/code&gt; to indicate you need to move your cursor
somewhere around there.&lt;/li&gt;
&lt;li&gt;If you see &lt;code&gt;&amp;lt;enter&amp;gt;&lt;/code&gt; it means you have to press enter. Same goes to &lt;code&gt;&amp;lt;esc&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Plus, if you see a formatting like this q, it means press the 'q' key in keyboard.&lt;/li&gt;
&lt;li&gt;Lastly, I'm using this awesome &lt;a href="https://github.com/amix/vimrc"&gt;repo&lt;/a&gt; for my vim config. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you prefer to read in github gist, you can click this link. &lt;a href="https://gist.github.com/AzrizHaziq/adcfdbf12c3b30b6523495e19f282b58#file-vim-md"&gt;https://gist.github.com/AzrizHaziq/adcfdbf12c3b30b6523495e19f282b58#file-vim-md&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's get started then:
&lt;/h2&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Now that you have learn few things here, why not give it a try first? You might have same hobbies like mine (search
above 🤣).&lt;/li&gt;
&lt;li&gt;Please, don't try to remember all the keys, since vim already have a good mnemonics. &lt;/li&gt;
&lt;li&gt;However, there is a lot of things that I didn't mention in both of the videos. Hence, I strongly suggest you to watch it. - I hope my example is easy to understand. Let me know if the example is not clear enough for you/typos or anything in comment. Thank you for reading.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>vim</category>
      <category>dx</category>
      <category>devrel</category>
    </item>
    <item>
      <title>Unpopular opinion on learning approach.</title>
      <dc:creator>Azriz Jasni</dc:creator>
      <pubDate>Wed, 02 Jun 2021 08:54:28 +0000</pubDate>
      <link>https://dev.to/azrizhaziq/unpopular-opinion-on-learning-approach-119i</link>
      <guid>https://dev.to/azrizhaziq/unpopular-opinion-on-learning-approach-119i</guid>
      <description>&lt;p&gt;Have you ever seen a scene in Dragon Ball where Goku went on training in other dimension? If you didn't you can watch below&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/_Ib0avVtpEg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The idea is, you get to train 1year in other dimension which is equal to 1 day in earth. But can we apply the same to our real world?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Yes, but there is trade off.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can achieve this when watching a video or listening to audio. But, in this article, I would like to share more on video, since I'm rarely listen to any audio(podcast etc...)&lt;/p&gt;

&lt;p&gt;Have you notice that Youtube have &lt;code&gt;Playback Speed&lt;/code&gt;. You can find this at youtube's gear icon(bottom right side) and then click &lt;code&gt;Playback Speed&lt;/code&gt; and it will show you a list of options which is &lt;code&gt;0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2&lt;/code&gt;. Try to change it to &lt;code&gt;2&lt;/code&gt;. The video play faster right?.&lt;/p&gt;

&lt;p&gt;At first it's quite hard to understand some of the content creator's message or when they communicate and you have to really focus and listen carefully what they said. You can set to &lt;code&gt;1.25&lt;/code&gt; first and then, after few trials, try set to &lt;code&gt;2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Imagine that you are watching a video 30min long, and if you set the speed to &lt;code&gt;2&lt;/code&gt;, averagely you only watched the video in ~15min long instead of 30min and this save you 50% of time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;// formula
videoLength/playbackSpeed = new total video 
30min/2 = ~15min
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In other words, if you allocate 1hour to learn everyday, you can actually enjoy learning up to 2hour of content while other people only spend 1hour!!. Unfortunately its not 1 to 1 mapping with Dragon Ball, but this is good enough.&lt;/p&gt;

&lt;p&gt;Remember when I mention that there is &lt;code&gt;trade off&lt;/code&gt;. Yes, it does have trade off as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sometime its hard to listen the video clearly.&lt;/li&gt;
&lt;li&gt;You might miss the essential part of the video. And usually if I didn't understand it, I had to go back to previous frame multiple times.&lt;/li&gt;
&lt;li&gt;You need to have a good internet connections as well as CPU and RAM (I'll explain down below why)&lt;/li&gt;
&lt;li&gt;Generally, if you are learning something that is not in your expertise, sometime it's hard to understand few keywords/jargon that they are using. I experience this a lot when learning finance terms. It is very challenging path.&lt;/li&gt;
&lt;li&gt;Depend on content creator effort. Creating a content it's not an easy task. It require huge passion to create a video.
(Please thumbs up creator's video, they'll feel appreciated)&lt;/li&gt;
&lt;li&gt;Can't really rely everything you learn in youtube. Might be misleading. Hence, still need to have other resources.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, I believe that, the PRO out-weight the CONS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Save you a lot of time&lt;/strong&gt; and you can spend learning other things as well.&lt;/li&gt;
&lt;li&gt;If you didn't understand a word in a video, you can just search another video with the same content. You might be able to understand the next one.&lt;/li&gt;
&lt;li&gt;Huge benefit if someone who would like to sharpen their practical skill. Cooking, sewing, renovate, makeover room to name a few. In some cases, you don't really need to hear the audio at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lastly, this is just &lt;strong&gt;my opinion&lt;/strong&gt; and do give it a try. Who know you might like it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Now that we are done with theories let proceed to, how behind the scene is done with Javascript.
&lt;/h2&gt;

&lt;p&gt;Usually a video will render in this kind of element in DOM, while for audio is &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;// taken from youtube html and stripped few things
&lt;span class="nt"&gt;&amp;lt;video&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"video-stream html5-main-video"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"blob:https://www.youtube.com/...id"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/video&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So how do we change the playback speed rate? Every &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt; element exposed a &lt;code&gt;playbackRate&lt;/code&gt; getter and setter. You can set this to any speed. 3, 4, 5, 6 and so on... its your call. Just be aware that, higher the number might hang your browser since its your browser doing the work. &lt;/p&gt;

&lt;p&gt;Let's get hand dirty with javascript. Open the &lt;code&gt;console&lt;/code&gt; in Devtool and paste this. It will find all video element and set the playbackRate to 2. This is useful if the website still didn't implement playback rate like in facebook, twitter, vimeo, netflix and etc...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/playbackRate"&gt;MDN Doc&lt;/a&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="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;video&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;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;playbackRate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But to write this code to every website and open Devtool its not cool. And I want to share 1 extension tools that I used. Just install it and press &lt;code&gt;s&lt;/code&gt; to slower, and &lt;code&gt;d&lt;/code&gt; to faster. And you can set the speed more than &lt;code&gt;2&lt;/code&gt;. You can find other extension tho, I'm just lazy to try others 🤣.&lt;/p&gt;

&lt;p&gt;Video Speed Controller&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/video-speed-controller/nffaoalbilbmmfgbnbgppjihopabppdk"&gt;https://chrome.google.com/webstore/detail/video-speed-controller/nffaoalbilbmmfgbnbgppjihopabppdk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/igrigorik/videospeed"&gt;https://github.com/igrigorik/videospeed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hope you enjoy this article and learn something.&lt;/p&gt;

&lt;p&gt;image source: &lt;a href="https://unsplash.com/@jakobowens1"&gt;jakobowens1&lt;/a&gt;&lt;/p&gt;

</description>
      <category>learnfaster</category>
    </item>
    <item>
      <title>How self-xss work in bookmark.</title>
      <dc:creator>Azriz Jasni</dc:creator>
      <pubDate>Sat, 29 May 2021 01:39:15 +0000</pubDate>
      <link>https://dev.to/azrizhaziq/how-self-xss-work-in-bookmark-15ok</link>
      <guid>https://dev.to/azrizhaziq/how-self-xss-work-in-bookmark-15ok</guid>
      <description>&lt;p&gt;On my previous &lt;a href="https://dev.to/azrizhaziq/github-on-steroids-3d23"&gt;article&lt;/a&gt;, I share on how to add javascript code in bookmark which later user can just click on it and browser will run it. And after published the article, I had another idea of writing this article. Before I share my findings, I would like to share with the audience what is the definition of &lt;code&gt;Self-XSS&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Self-XSS operates by tricking users into &lt;strong&gt;copying and pasting&lt;/strong&gt; malicious content into their browsers' web developer console&lt;/p&gt;
&lt;h6&gt;
  
  
  wikipedia
&lt;/h6&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  So let's continue on our example.
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;First let setup our bookmark script. But before you copy the code, let me brief what the code does.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;javascript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;scriptInString&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scriptInString&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="cm"&gt;/* .then(scriptInString =&amp;gt; new Function(scriptInString)()) */&lt;/span&gt;
&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="s2"&gt;`https://gist.githubusercontent.com/AzrizHaziq/adcfdbf12c3b30b6523495e19f282b58/raw/a959157530b4c282aae0386fda1b3c3b1656bb7d/notify.js`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First we wrap our code in IIFE. Which mean it will execute it right away. Also I used it because, I want to avoid naming a function. Hence, it will make shorter scripts.&lt;/p&gt;

&lt;p&gt;Next, we use fetch to trigger &lt;strong&gt;http GET&lt;/strong&gt;(pun intended) to our script. Once the http is resolve, we want to convert it to &lt;strong&gt;string&lt;/strong&gt;. And finally, since our script is in the form of string, we can &lt;strong&gt;eval&lt;/strong&gt;uate it with &lt;code&gt;eval&lt;/code&gt; or &lt;code&gt;new Function&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;And the snippet code in &lt;a href="https://gist.github.com/AzrizHaziq/adcfdbf12c3b30b6523495e19f282b58#file-notify-js"&gt;github gist&lt;/a&gt; is exactly like below&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="c1"&gt;// notify.js in gist github&lt;/span&gt;
&lt;span class="c1"&gt;// code copied from https://developer.mozilla.org/en-US/docs/Web/API/notification&lt;/span&gt;
&lt;span class="c1"&gt;// and was changed into iife&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="c1"&gt;// Let's check if the browser supports notifications&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&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;Notification&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This browser does not support desktop notification&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="c1"&gt;// Let's check whether notification permissions have already been granted&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Notification&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;permission&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;granted&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="c1"&gt;// If it's okay let's create a notification&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;notification&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Notification&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hi there!&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="c1"&gt;// Otherwise, we need to ask the user for permission&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Notification&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;permission&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;denied&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;Notification&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;requestPermission&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;permission&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// If the user accepts, let's create a notification&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;permission&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;granted&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;var&lt;/span&gt; &lt;span class="nx"&gt;notification&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Notification&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hi there!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// At last, if the user has denied notifications, and you&lt;/span&gt;
  &lt;span class="c1"&gt;// want to be respectful there is no need to bother them any more.&lt;/span&gt;
&lt;span class="p"&gt;})()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you save into bookmark it will look like this:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ee0syhoh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5h77x4u5nm89161d4ap8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ee0syhoh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5h77x4u5nm89161d4ap8.png" alt="image"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://example.com"&gt;https://example.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Just for the sake of this example, please &lt;code&gt;allow&lt;/code&gt; notification. Since our script in gist will trigger notification. (For chrome, click the padlock icon in url bar and Allow notification)&lt;/li&gt;
&lt;li&gt;Click the bookmark that you just create. &lt;/li&gt;
&lt;li&gt;If you didn't see the notification then that's mean, I can panic 🤣🤣. If yes, well done you follow the steps correctly 😀.&lt;/li&gt;
&lt;li&gt;You can block notification, and delete the bookmark too. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now of course this example does not have big impact to you, since my objective is to make it interactive. But, I would like to highlight one thing here. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Imagine that if let say after a few month or years after I published this article, I can just silently edit my &lt;code&gt;notify.js&lt;/code&gt; to any nasty code. Anyone who click the bookmark  usually would assume it just the same old script and will fall into my trap. Pretty slick right?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is also another scenario I want to share. In future, we will have &lt;a href="https://web.dev/browser-fs-access/"&gt;read &amp;amp; write permission&lt;/a&gt; in browser. What will happen if you just blindly run a script that you copy and paste? That script may hog your file-size, plant a malware, read sensitive file, and it could be anything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  As developer, how do you prevent this
&lt;/h2&gt;

&lt;p&gt;This example work because at time of me writing this article &lt;a href="https://example.com"&gt;https://example.com&lt;/a&gt; doesn't have &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP"&gt;CSP protection&lt;/a&gt;. CSP is big topic which I'm not an expert. It has a lot of configs and in case this is your first time hearing it, let me try to give a tldr(too long didn't read). &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Explicitly define what kind of tasks/scrips/images/domain/styles/things that can run/load in your document. (psst: I might be wrong, please correct me 🙂)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Let say I'm on &lt;a href="https://example.com"&gt;https://example.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;I also specify images to load only from &lt;a href="https://unsplash.com"&gt;https://unsplash.com&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;And if there is a request to different domain then it will trigger CSP error in Devtools.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- these should load fine in dom --&amp;gt;&lt;/span&gt;  
&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/static/logo.png"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; 
&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://unsplash.com/static/my-image.png"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; 

&lt;span class="c"&gt;&amp;lt;!-- CSP errors and it will not load --&amp;gt;&lt;/span&gt;  
&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://s3.aws.com/bucket..."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

// please check the MDN doc as it is more detail example
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just in case if you click the bookmark while you are currently in &lt;code&gt;twitter.com&lt;/code&gt; it will not trigger the notification since &lt;code&gt;twitter.com&lt;/code&gt; already have CSP layer. And if you want to see how they implement it, you can go to network tool and look at the first downloaded document, then look for &lt;code&gt;content-security-policy&lt;/code&gt; in response header. You will be surprise to see how long it is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TTG9hDz0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6ct51pj8xlm2e7b7fz5t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TTG9hDz0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6ct51pj8xlm2e7b7fz5t.png" alt="twitter CSP"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  In Conclusion.
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Please be aware &lt;strong&gt;copying and pasting&lt;/strong&gt; any code from online. Especially obfuscated code.&lt;/li&gt;
&lt;li&gt;Please take you time understand the code. Any term or keyword that you never heard of it just search in MDN or google.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Originally, the idea for this article is coming from &lt;a href="http://imbrianj.github.io/debugCSS/"&gt;DebugCSS&lt;/a&gt;. After I knew how they implement it and ensure that every user who click it, will always run the latest version, I just write a draft for this article. For you information, while they are using &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; and inject to dom, mine was using http get and eval the script.&lt;/p&gt;

&lt;p&gt;Image Source: &lt;a href="https://unsplash.com/@firmbee"&gt;firmbee&lt;/a&gt;&lt;/p&gt;

</description>
      <category>xss</category>
      <category>javascript</category>
      <category>bookmark</category>
    </item>
    <item>
      <title>Github on Steroids </title>
      <dc:creator>Azriz Jasni</dc:creator>
      <pubDate>Fri, 21 May 2021 14:22:39 +0000</pubDate>
      <link>https://dev.to/azrizhaziq/github-on-steroids-3d23</link>
      <guid>https://dev.to/azrizhaziq/github-on-steroids-3d23</guid>
      <description>&lt;p&gt;Hi everyone, I have few tips on how to increase productivity with Github. &lt;/p&gt;

&lt;h2&gt;
  
  
  Navigating through source codes in repository
&lt;/h2&gt;

&lt;p&gt;Often time when we open any repository in Github we will be displayed with root folders and files. But, what if you want to navigate deep nested file? You would have to navigate through each nested folder until you find the file you want to open. &lt;/p&gt;

&lt;p&gt;It's not really efficient way since every click to folder its actually trigger a lot of network calls, waiting for it to resolve and then browser render it to UI(user interface). And imagine that you are currently on slow 3G connection, you would have wasting your time waiting and clicking.&lt;/p&gt;

&lt;p&gt;There are other points that can be added up but its not the objective of this article. So there are 2 way that I can recommend you:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. &lt;a href="https://www.octotree.io/" rel="noopener noreferrer"&gt;Octotree&lt;/a&gt; (freemium)
&lt;/h2&gt;

&lt;p&gt;It is a browser extension and they support a lot of browsers(please check their website). For me, their killer feature is &lt;strong&gt;Code Review&lt;/strong&gt; and &lt;strong&gt;multiple tabs&lt;/strong&gt; 🙂. It's much easier when reviewing your peer PR(pull request). Please refer their main website for services that they provide.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/tyUNy-WFs-c"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  2. &lt;a href="https://github.com/conwnet/github1s" rel="noopener noreferrer"&gt;Github 1s&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;This is another level of navigating thru all the files and folder. Just add &lt;code&gt;1s&lt;/code&gt; to the domain from &lt;code&gt;github.com&lt;/code&gt; to &lt;code&gt;github1s.com&lt;/code&gt;. Then you will see vscode in your browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from https://github.com/facebook/react
to   https://github1s.com/facebook/react
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cool right!. But I would like to highlight 1 more interesting thing, which is how to improve your workflow. Based on their readme, they share a shortcut key with a click in your bookmark, and here how would you setup it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Since I'm using chrome go to &lt;code&gt;chrome://bookmarks&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Then click 3 dots icon on your most top right&lt;/li&gt;
&lt;li&gt;Create a bookmark and enter this line of code to URL input box. For name you can named it yourself (I named it Github1s)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;javascript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/github&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;1s&lt;/span&gt;&lt;span class="se"&gt;)?&lt;/span&gt;&lt;span class="sr"&gt;.com/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;p1&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;github.com&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="s1"&gt;github1s.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;It will look like this
&lt;img src="https://media.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%2Fnvxfhm7q0rqjvqpz8mu3.png" alt="bookmark github1s.com"&gt;
&lt;/li&gt;
&lt;li&gt;Once that done, now feel free to open any repo and click the bookmark that you just created. 
&lt;a href="https://github.com/facebook/react" rel="noopener noreferrer"&gt;Github ReactJS&lt;/a&gt;
&lt;a href="https://github1s.com/facebook/react" rel="noopener noreferrer"&gt;Github1s ReactJS&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Another alternative for this is &lt;a href="https://github.com/surfcodes/surf" rel="noopener noreferrer"&gt;Github Surf&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Look at file history interactively
&lt;/h2&gt;

&lt;p&gt;Sometime you want to know what changes have been made to a file. Github do have a history button for a file, but In my opinion, it's not really detail and still have to click a a lot of things. Luckily there is another awesome tool &lt;a href="https://githistory.xyz/" rel="noopener noreferrer"&gt;Git History&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will use this ReactJS package.json file as for our example. Same thing like above, you want to change the url domain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from https://github.com/repo/path/to/file
to   https://githistory.xyz/repo/path/to/file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To make it easier for the audience to click, you can play around below links&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/facebook/react/blob/master/package.json" rel="noopener noreferrer"&gt;https://github.com/facebook/react/blob/master/package.json&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://githistory.xyz/facebook/react/blob/master/package.json" rel="noopener noreferrer"&gt;https://githistory.xyz/facebook/react/blob/master/package.json&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h6&gt;
  
  
  Please use keyboard arrow right and left to navigate and for mobile user you can drag left and right as well.
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fg3rn9dfvfw06ejx04lsz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fg3rn9dfvfw06ejx04lsz.png" alt="githistory.xyz reactjs package.json file"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And lastly, you also can create a bookmark and below is the code. Please refer the step above.&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;javascript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="s2"&gt;`https://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;github.com&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="s1"&gt;githistory.xyz&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="s1"&gt;github.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. [Github] New update!, Github have built in editor
&lt;/h2&gt;

&lt;p&gt;Just click .&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1425505817827151872-681" src="https://platform.twitter.com/embed/Tweet.html?id=1425505817827151872"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1425505817827151872-681');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1425505817827151872&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Plus it also support Pull Request view!!.&lt;br&gt;
PR: &lt;a href="https://github.com/DefinitelyTyped/DefinitelyTyped/pull/56026" rel="noopener noreferrer"&gt;https://github.com/DefinitelyTyped/DefinitelyTyped/pull/56026&lt;/a&gt;&lt;br&gt;
Editor view: &lt;a href="https://github.dev/DefinitelyTyped/DefinitelyTyped/pull/56026" rel="noopener noreferrer"&gt;https://github.dev/DefinitelyTyped/DefinitelyTyped/pull/56026&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hope you enjoy reading it, Thank you.&lt;/p&gt;

</description>
      <category>github</category>
      <category>devrel</category>
      <category>dx</category>
      <category>debugging</category>
    </item>
    <item>
      <title>Better way to unsubscribe in Angular</title>
      <dc:creator>Azriz Jasni</dc:creator>
      <pubDate>Mon, 16 Mar 2020 01:48:09 +0000</pubDate>
      <link>https://dev.to/azrizhaziq/better-way-to-unsubscribe-in-angular-4dcl</link>
      <guid>https://dev.to/azrizhaziq/better-way-to-unsubscribe-in-angular-4dcl</guid>
      <description>

&lt;p&gt;You might be wondering why do we need to unsubscribe every subscriptions. Well, you can get the answer from our friend here &lt;a href="https://netbasal.com/why-its-important-to-unsubscribe-from-rxjs-subscription-a7a6455d6a02"&gt;Netanel Basal&lt;/a&gt;. He have a nice .gif example so check it out.&lt;/p&gt;

&lt;p&gt;As time goes on, we(developer) really tired of keep repeating the same process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Importing ngOnDestroy,
2. Implement the interface
3. Create public function ngOnDestroy() { … }
4. Create a variables to keep list of subscriptions
5. … 
6. …
7. And repeat the whole process for other components.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is tedious and a waste productivity.&lt;br&gt;
So, I'm going to share a 2 approach on how to unsubscribe subscription easily. But let's start with normal approach.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. Using Inheritance
&lt;/h2&gt;

&lt;p&gt;Create a BaseComponent so that, whoever extends this component are able to easily add subscription and easily unsubscribe on destroy.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;And this is how to implement in component class.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;One caveat tho, if the component extends BaseComponent and it also have implement ngOnDestroy() you would have to add super.ngOnDestroy();&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  2. Decorators
&lt;/h2&gt;

&lt;p&gt;I think this approach kinda complicated a little bit as it mutate prototype. BTW i'm using &lt;a href="https://javascript.info/mixins"&gt;mixin&lt;/a&gt; approach. Plus is not battle tested with &lt;code&gt;this&lt;/code&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;And here how to implement it&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Thats all, feel free to play around here.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://stackblitz.com/edit/better-way-to-unsubscribe-in-angular?embed=1&amp;amp;view=both&amp;amp;" width="100%" height="500"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Update
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Decorator approach with previous example it doesn't really work&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;once&lt;/code&gt; method to auto close the subscription. Can be really help full for something like click button, then trigger one http, and after that close it. (save your time to import &lt;code&gt;take&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Added type to functions params and return&lt;/li&gt;
&lt;li&gt;I'm still having difficulty with the return type in Decorator approach. Any typescripts master, please help me with this.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>rxjs</category>
      <category>angular</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Secure your apps with Angular Directive when using target='_blank'</title>
      <dc:creator>Azriz Jasni</dc:creator>
      <pubDate>Wed, 01 May 2019 10:16:41 +0000</pubDate>
      <link>https://dev.to/azrizhaziq/secure-your-apps-with-angular-directive-for-target-blank-fi9</link>
      <guid>https://dev.to/azrizhaziq/secure-your-apps-with-angular-directive-for-target-blank-fi9</guid>
      <description>&lt;p&gt;Hi, today I want to share with you guys on how to secure your apps if you are using &lt;code&gt;target='_blank'&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Usually to link an external url, we will do something like this:&lt;br&gt;
&lt;code&gt;&amp;lt;a href='https://dev.to'&amp;gt;Dev.to&amp;lt;/a&amp;gt;&lt;/code&gt;.Please noted that this will still work. But unfortunately there is an security issues here.You can read more about it here and it also included with example:&lt;br&gt;
&lt;a href="https://mathiasbynens.github.io/rel-noopener/#hax"&gt;https://mathiasbynens.github.io/rel-noopener/#hax&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To solve this issue we can simply add an extra attribute to anchor tag.&lt;br&gt;
&lt;code&gt;&amp;lt;a href='https://dev.to' rel='noopener noreferrer'&amp;gt;Dev.to&amp;lt;/a&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;However, let say in our app we have a lot of external link to put.&lt;br&gt;
And personally, I dont really like to write &lt;code&gt;rel='noopener noreferrer'&lt;/code&gt; to every anchor tag I have.&lt;/p&gt;

&lt;p&gt;With that, we can automatically add &lt;code&gt;rel='noopener noreferrer'&lt;/code&gt; to every anchor tag with Angular Directive.&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="c1"&gt;// target-blank.directive.ts&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Directive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;HostBinding&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&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="nd"&gt;Directive&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="c1"&gt;// target every &amp;lt;a target="_blank"&amp;gt;...&amp;lt;a&amp;gt;&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a[target=_blank]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;TargetBlankDirective&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// will add &amp;lt;a ... rel='noopener noreferrer'&amp;gt;...&amp;lt;/a&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;HostBinding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;attr.rel&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;rel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;noopener noreferrer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;// and just use it like this
&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;'someurl'&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;'_blank'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;someurl&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;

// will render like this
&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;'someurl'&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;'_blank'&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;'noopener noreferrer'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;someurl&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One last thing, let say you have dynamic action on click. How would we want to prevent this.&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;function&lt;/span&gt; &lt;span class="nx"&gt;openInNewTab&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// open link in new tab&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newTab&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;_blank&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;// set opener to null so that no one can references it&lt;/span&gt;
    &lt;span class="nx"&gt;newTab&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;opener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;openInNewTab&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://dev.to&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can play around here &lt;br&gt;
&lt;iframe src="https://stackblitz.com/edit/angular-target-blank?embed=1&amp;amp;&amp;amp;" width="100%" height="500"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;In conclusion: &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pro&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Automatically add rel='noopener noreferrer'&lt;/td&gt;
&lt;td&gt;New Developer unaware of this directive behaviour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Able to prevent this issue automatically&lt;/td&gt;
&lt;td&gt;Client disable JS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You can read more here &lt;br&gt;
&lt;a href="https://www.pixelstech.net/article/1537002042-The-danger-of-target%3D_blank-and-opener"&gt;https://www.pixelstech.net/article/1537002042-The-danger-of-target%3D_blank-and-opener&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>frontend</category>
      <category>angular</category>
    </item>
    <item>
      <title>Inspect Stateless Component Props in ReactJs</title>
      <dc:creator>Azriz Jasni</dc:creator>
      <pubDate>Sat, 17 Nov 2018 05:58:51 +0000</pubDate>
      <link>https://dev.to/azrizhaziq/inspect-stateless-component-props-in-reactjs-501a</link>
      <guid>https://dev.to/azrizhaziq/inspect-stateless-component-props-in-reactjs-501a</guid>
      <description>&lt;p&gt;Hi, recently I've shared my tips in javascript, &lt;a href="https://dev.to/azrizhaziq/tip-when-in-javascript-497f"&gt;checkout here&lt;/a&gt;. On the last section, I did mention how do you debug using &lt;code&gt;console.log&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;So today, I'm going to share a little bit the same concept but it will be in ReactJs context. I hope it will useful for us 😊.&lt;/p&gt;

&lt;p&gt;In my previous post, you can log current params of a callback function with&lt;br&gt;
&lt;code&gt;console.log(data) || ...someFn()&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nameAndEmails&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; 
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt; 
   &lt;span class="p"&gt;}))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In ReactJs, especially for stateless components, sometime our coworker didn't write any &lt;a href="https://reactjs.org/docs/typechecking-with-proptypes.html"&gt;PropTypes&lt;/a&gt;. Hence, it a little bit hard to know what kind of &lt;code&gt;props&lt;/code&gt; shape it will receive. &lt;/p&gt;

&lt;p&gt;Lets jump to the example:&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="c1"&gt;// let say you have this kind of component&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;btn btn-primary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;props&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="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;    
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// use it like this &lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Submit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Click&lt;/span&gt; &lt;span class="nx"&gt;Me&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You would not want to convert this component into &lt;code&gt;{ ... return (); }&lt;/code&gt;, because it requires a lot of typing, like this:&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="c1"&gt;// 😓, need to type aloot of things here&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;btn btn-primary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;props&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="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, instead of convert to ordinary function, you can try this approach to log the &lt;code&gt;props&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;btn btn-primary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;props&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="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// It will logs: &lt;/span&gt;
&lt;span class="c1"&gt;// { &lt;/span&gt;
&lt;span class="c1"&gt;//    type: 'Submit',&lt;/span&gt;
&lt;span class="c1"&gt;//    children: 'Click Me'&lt;/span&gt;
&lt;span class="c1"&gt;// }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essentially, you can use this trick to any callback function like in &lt;code&gt;map.&lt;/code&gt;, &lt;code&gt;.filter&lt;/code&gt;, &lt;code&gt;.reduce&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I hope you get the idea, See you next time.&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>javascript</category>
      <category>react</category>
      <category>rxjs</category>
    </item>
    <item>
      <title>Tips in Javascript</title>
      <dc:creator>Azriz Jasni</dc:creator>
      <pubDate>Mon, 12 Nov 2018 14:15:20 +0000</pubDate>
      <link>https://dev.to/azrizhaziq/tip-when-in-javascript-497f</link>
      <guid>https://dev.to/azrizhaziq/tip-when-in-javascript-497f</guid>
      <description>

&lt;p&gt;Hi and greetings. So today I would like to share some different way when writing &lt;code&gt;console.log&lt;/code&gt;. You can freely copy the code and paste it on your browser's devtool. &lt;/p&gt;

&lt;p&gt;At the time I'm writing, I was using Chrome 70. We will be using JSON response from this awesome service &lt;a href="https://jsonplaceholder.typicode.com/"&gt;JSONPlaceholder&lt;/a&gt;. Also noted that I'm going to use &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/New_in_JavaScript/ECMAScript_Next_support_in_Mozilla"&gt;Javascript ESNext&lt;/a&gt; syntax.&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// this will be our dummy data list of users&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Leanne Graham"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Bret"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Sincere@april.biz"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"street"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Kulas Light"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"suite"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Apt. 556"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Gwenborough"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"zipcode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"92998-3874"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"geo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"lat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"-37.3159"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"lng"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"81.1496"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"phone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"1-770-736-8031 x56442"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"website"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"hildegard.org"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Ervin Howell"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Antonette"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Shanna@melissa.tv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"street"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Victor Plains"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"suite"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Suite 879"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Wisokyburgh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"zipcode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"90566-7771"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"geo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"lat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"-43.9509"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"lng"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"-34.4618"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"phone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"010-692-6593 x09125"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"website"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"anastasia.net"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Clementine Bauch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Samantha"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Nathan@yesenia.net"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"street"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Douglas Extension"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"suite"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Suite 847"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"McKenziehaven"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"zipcode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"59590-4157"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"geo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"lat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"-68.6102"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"lng"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"-47.0653"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"phone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"1-463-123-4447"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"website"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ramiro.info"&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;We have a dummy data called &lt;code&gt;users&lt;/code&gt; and we only interested in user's &lt;code&gt;name&lt;/code&gt;     and &lt;code&gt;email&lt;/code&gt;. &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map"&gt;Array.prototype.map&lt;/a&gt; come to the rescue.&lt;/p&gt;



&lt;div class="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;nameAndEmails&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&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="cm"&gt;/*
  [
    {
      "name": "Leanne Graham",
      "email": "Sincere@april.biz"
    },
    {
      "name": "Ervin Howell",
      "email": "Shanna@melissa.tv"
    },
    {
      "name": "Clementine Bauch",
      "email": "Nathan@yesenia.net"
    }
  ]

*/&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Yay, the result we get contains &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;email&lt;/code&gt;. But we can write this better and shorter syntax with &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#Advanced_Syntax"&gt;object literal expression&lt;/a&gt; and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment"&gt;destructuring&lt;/a&gt;&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;// 👍 implicitly return object literal expression&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nameAndEmails&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}))&lt;/span&gt;


    &lt;span class="c1"&gt;// 👍👍destructuring function parameter and return object literal expression&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nameAndEmails&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&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;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Ok, lets pretend that after 1 months after coding this code, there is a high chances that you already forgot the &lt;code&gt;User Shape&lt;/code&gt;, and you might also need to return user's phone number. So we need to &lt;code&gt;console.log&lt;/code&gt; so that we can have a look at our &lt;code&gt;User Shape&lt;/code&gt; again.  &lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="c1"&gt;// 1) Write console.log(users) before running the function.&lt;/span&gt;
   &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&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;nameAndEmails&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&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;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt;

   &lt;span class="c1"&gt;// 2) Open devtool and reload the browser&lt;/span&gt;
   &lt;span class="c1"&gt;// 3) Lastly, look at the logged `users` &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;As for me this approach is kinda tiresome and below is approach that I found in the internet.&lt;/p&gt;



&lt;div class="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;nameAndEmails&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; 
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;
   &lt;span class="p"&gt;}))&lt;/span&gt;

   &lt;span class="nx"&gt;or&lt;/span&gt; 

   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nameAndEmails&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;otherPayload&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;otherPayload&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Cwqudhyh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/a31o4cr8f3eobl2rknhd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Cwqudhyh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/a31o4cr8f3eobl2rknhd.png" alt="output"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WHY?&lt;/strong&gt;, it is because &lt;code&gt;console.log&lt;/code&gt; return &lt;code&gt;undefined&lt;/code&gt;, and the browser will still running the code after &lt;code&gt;||&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;You can play around with these examples into devtool: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;undefined || 'return me'&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;console.log('log me') || 'return me'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;true &amp;amp;&amp;amp; console.log('log me')&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;false &amp;amp;&amp;amp; console.log('do not log me')&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope you learned something  😁😁;&lt;/p&gt;


</description>
      <category>javascript</category>
      <category>consolelog</category>
      <category>debugging</category>
    </item>
  </channel>
</rss>
