<?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: Gajanan Patil</title>
    <description>The latest articles on DEV Community by Gajanan Patil (@gajananpp).</description>
    <link>https://dev.to/gajananpp</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%2F769207%2F95e2152f-e1cf-44fc-b74d-328b89f8df4e.gif</url>
      <title>DEV Community: Gajanan Patil</title>
      <link>https://dev.to/gajananpp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gajananpp"/>
    <language>en</language>
    <item>
      <title>JavaScript's queueMicrotask(): Running Code ASAP (But Not Right Now)</title>
      <dc:creator>Gajanan Patil</dc:creator>
      <pubDate>Thu, 08 May 2025 11:44:32 +0000</pubDate>
      <link>https://dev.to/gajananpp/javascripts-queuemicrotask-running-code-asap-but-not-right-now-3c6c</link>
      <guid>https://dev.to/gajananpp/javascripts-queuemicrotask-running-code-asap-but-not-right-now-3c6c</guid>
      <description>&lt;p&gt;Ever needed to run a piece of JavaScript code &lt;em&gt;right after&lt;/em&gt; the current script finishes, but &lt;em&gt;before&lt;/em&gt; the browser does anything else like rendering or handling timer callbacks? Meet &lt;code&gt;queueMicrotask()&lt;/code&gt;!&lt;/p&gt;

&lt;p&gt;It's a fundamental part of understanding JavaScript's concurrency model and the Event Loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Does It Do?
&lt;/h2&gt;

&lt;p&gt;In simple terms, &lt;code&gt;queueMicrotask(callback)&lt;/code&gt; schedules a function (&lt;code&gt;callback&lt;/code&gt;) to be executed in the &lt;strong&gt;microtask queue&lt;/strong&gt;. Think of it as saying: "Run this function as soon as the current synchronous block of code is done executing, no matter what, and &lt;em&gt;before&lt;/em&gt; handling less urgent things."&lt;/p&gt;

&lt;h2&gt;
  
  
  The Crucial Timing: Microtasks vs. Macrotasks
&lt;/h2&gt;

&lt;p&gt;This is where &lt;code&gt;queueMicrotask()&lt;/code&gt; shines and differs from something like &lt;code&gt;setTimeout(callback, 0)&lt;/code&gt;. Here's the general flow of the event loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Execute the current synchronous script/task until the call stack is empty.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Process the Microtask Queue:&lt;/strong&gt; Execute &lt;em&gt;all&lt;/em&gt; functions currently in the microtask queue, one by one, until the queue is empty. New microtasks added during this process are also executed before moving on.&lt;/li&gt;
&lt;li&gt; (Optional: Perform UI rendering updates, if needed and conditions allow).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Process the Macrotask Queue:&lt;/strong&gt; Take &lt;em&gt;one&lt;/em&gt; task from the macrotask queue (like a &lt;code&gt;setTimeout&lt;/code&gt; callback, &lt;code&gt;setInterval&lt;/code&gt;, I/O operation, user interaction handler) and execute it. This execution might queue more microtasks.&lt;/li&gt;
&lt;li&gt; Repeat from step 2.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Key takeaway:&lt;/strong&gt; Microtasks (&lt;code&gt;queueMicrotask&lt;/code&gt;, Promise &lt;code&gt;.then&lt;/code&gt;/&lt;code&gt;.catch&lt;/code&gt;/&lt;code&gt;.finally&lt;/code&gt;) have higher priority and run &lt;em&gt;before&lt;/em&gt; the next macrotask (&lt;code&gt;setTimeout&lt;/code&gt;, &lt;code&gt;setInterval&lt;/code&gt;, rendering).&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use It?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fine-grained Control:&lt;/strong&gt; Perform cleanup or follow-up actions immediately after a block of code finishes, without yielding to the browser's rendering or other macrotasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency with Promises:&lt;/strong&gt; Promise callbacks are handled as microtasks. Using &lt;code&gt;queueMicrotask&lt;/code&gt; allows you to schedule work with the same timing semantics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frameworks/Libraries:&lt;/strong&gt; Useful internally in frameworks or libraries to schedule updates or reactions after state changes but before the browser might repaint.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&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;Start&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Macrotask - will run much later&lt;/span&gt;
&lt;span class="nf"&gt;setTimeout&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="nf"&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;setTimeout (Macrotask)&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Microtask - runs after 'End', before setTimeout&lt;/span&gt;
&lt;span class="nf"&gt;queueMicrotask&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="nf"&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;queueMicrotask (Microtask)&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;// Promise.then also queues a Microtask&lt;/span&gt;
&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&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="nf"&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;Promise.then (Microtask)&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&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;End&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="cm"&gt;/*
Expected Output:
---------------
Start
End
queueMicrotask (Microtask)
Promise.then (Microtask)
setTimeout (Macrotask)
*/&lt;/span&gt;

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

&lt;/div&gt;



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

&lt;p&gt;queueMicrotask() gives you precise control to schedule code execution immediately after the current task, bypassing the queue for larger tasks like timers or rendering. It's a powerful tool when you need that "as soon as possible, but still async" behavior, especially when working alongside Promises.&lt;/p&gt;

&lt;p&gt;It's been 3 (tough) years since I last wrote a post on dev.to and it felt nice writing post again. Will try to maintain streak going ahead.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>javascript</category>
      <category>coding</category>
    </item>
    <item>
      <title>Get subtitles for any audio/video being played in browser</title>
      <dc:creator>Gajanan Patil</dc:creator>
      <pubDate>Tue, 05 Apr 2022 19:02:17 +0000</pubDate>
      <link>https://dev.to/gajananpp/get-subtitles-for-any-audiovideo-being-played-in-browser-fdm</link>
      <guid>https://dev.to/gajananpp/get-subtitles-for-any-audiovideo-being-played-in-browser-fdm</guid>
      <description>&lt;h3&gt;
  
  
  Overview of My Submission
&lt;/h3&gt;

&lt;p&gt;Browser extension that streams selected tab's audio to Deepgram's transcription service and displays result on active tab.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;This extension will require a Deepgram API key for transcription. Get it from &lt;a href="https://console.deepgram.com/signup" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Submission Category:
&lt;/h3&gt;

&lt;p&gt;Accessibility Advocates&lt;/p&gt;

&lt;h3&gt;
  
  
  Link to Code on GitHub
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/gajananpp" rel="noopener noreferrer"&gt;
        gajananpp
      &lt;/a&gt; / &lt;a href="https://github.com/gajananpp/captioner" rel="noopener noreferrer"&gt;
        captioner
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Get subtitles for any audio/video being played in browser.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Captioner&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/gajananpp/captioner/actions/workflows/lint.yml/badge.svg"&gt;&lt;img src="https://github.com/gajananpp/captioner/actions/workflows/lint.yml/badge.svg" alt="lint"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/gajananpp/captioner/actions/workflows/build.yml/badge.svg"&gt;&lt;img src="https://github.com/gajananpp/captioner/actions/workflows/build.yml/badge.svg" alt="build"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Get subtiles/captions for any audio/video being played. Deepgram hackathon submission.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/gajananpp/captioner#installation" rel="noopener noreferrer"&gt;Installation&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/captioner#usage" rel="noopener noreferrer"&gt;Usage&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/captioner#build-from-source" rel="noopener noreferrer"&gt;Build From Source&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/captioner#privacy" rel="noopener noreferrer"&gt;Privacy&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/captioner#faqs" rel="noopener noreferrer"&gt;FAQs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://youtu.be/UEU82AUhW8g" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgajananpp%2Fcaptionerassets%2Fthumbnail.png" alt="Demo PNG" width="640"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This extension is published on chrome web store.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://chrome.google.com/webstore/detail/captioner/gjcdikfmiodlggkpnllcjbffjfbhfnnn" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgajananpp%2Fcaptionerassets%2Fchrome-web-store-btn.png" alt="Add from Chrome web store"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;This extension will require a Deepgram API key for transcription. Get it from &lt;a href="https://console.deepgram.com/signup" rel="nofollow noopener noreferrer"&gt;here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://youtu.be/UEU82AUhW8g" rel="nofollow noopener noreferrer"&gt;Check demo video&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Build from source:&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/gajananpp/captioner.git

&lt;span class="pl-c1"&gt;cd&lt;/span&gt; captioner

npm install

npm run build&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;This will output extension in dist folder which you can load in your browser by following this &lt;a href="https://developer.chrome.com/docs/extensions/mv3/getstarted/#:~:text=The%20directory%20holding%20the%20manifest%20file%20can%20be%20added%20as%20an%20extension%20in%20developer%20mode%20in%20its%20current%20state." rel="nofollow noopener noreferrer"&gt;steps&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Privacy&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;The only external api call this extension makes is to &lt;a href="https://developers.deepgram.com/api-reference/#transcription-streaming" rel="nofollow noopener noreferrer"&gt;&lt;code&gt;wss://api.deepgram.com/v1/listen&lt;/code&gt;&lt;/a&gt; passing it the audio blobs from selected audio source as payload.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;FAQs&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Q: With which browsers is this extension compatible ?&lt;/strong&gt;
&lt;br&gt;
This extension will work with chrome and other chromium based browsers like edge, brave etc. and can be tweaked to work with firefox and other browsers.&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;strong&gt;Q: From where can this extension be installed ?&lt;/strong&gt;
&lt;br&gt;
This…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/gajananpp/captioner" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Additional Resources / Info
&lt;/h3&gt;

&lt;h3&gt;
  
  
  FAQs :-
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q: With which browsers is this extension compatible ?&lt;/strong&gt;&lt;br&gt;
This extension will work with chrome and other chromium based browsers like edge, brave etc. and can be tweaked to work with firefox and other browsers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: From where can this extension be installed ?&lt;/strong&gt;&lt;br&gt;
This extension is published on chrome web store. Click below to view it in chrome web store or &lt;a href="https://github.com/gajananpp/captioner#build-from-source" rel="noopener noreferrer"&gt;can be built and loaded from source&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chrome.google.com/webstore/detail/captioner/gjcdikfmiodlggkpnllcjbffjfbhfnnn" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbh9kq44utrlpcyjc2yqj.png" alt="Add from Chrome web store" width="340" height="96"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Subtitles are slower than audio/video ?&lt;/strong&gt;&lt;br&gt;
Since unlike Youtube's auto-generated captions where captions are generated when video is uploaded, here it can't seek audio blobs beforehand(could be possible by checking n/w requests having &lt;code&gt;media&lt;/code&gt; type responses) so there is a lag. Lag may get reduced by adjusting the &lt;a href="https://github.com/gajananpp/captioner/blob/main/src/content-script/index.tsx#L21" rel="noopener noreferrer"&gt;&lt;code&gt;timeslice&lt;/code&gt;&lt;/a&gt; of &lt;code&gt;AudioRecorder&lt;/code&gt;. &lt;strong&gt;WIP for reducing lag.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>hackwithdg</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Word game</title>
      <dc:creator>Gajanan Patil</dc:creator>
      <pubDate>Wed, 30 Mar 2022 14:07:48 +0000</pubDate>
      <link>https://dev.to/gajananpp/word-game-2ffh</link>
      <guid>https://dev.to/gajananpp/word-game-2ffh</guid>
      <description>&lt;h3&gt;
  
  
  Overview of My Submission
&lt;/h3&gt;

&lt;p&gt;Game made using Deepgram's transcription service and Phaser game framework.&lt;/p&gt;

&lt;p&gt;Score by reading out the words you see on screen before they disappear. Try to score as high as possible before time runs out. Difficulty increases with time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Submission Category:
&lt;/h3&gt;

&lt;p&gt;Gram Gamers&lt;/p&gt;

&lt;h3&gt;
  
  
  Link to Code on GitHub
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/gajananpp" rel="noopener noreferrer"&gt;
        gajananpp
      &lt;/a&gt; / &lt;a href="https://github.com/gajananpp/word-game" rel="noopener noreferrer"&gt;
        word-game
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Try to get maximum words before time runs out.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Word Game&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;Try to get maximum words before time runs out.&lt;/p&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/gajananpp/word-gamestatic/word-game-demo.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgajananpp%2Fword-gamestatic%2Fword-game-demo.gif" alt="Demo GIF" width="640"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Play:&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a href="https://gajananpp.github.io/word-game" rel="nofollow noopener noreferrer"&gt;https://gajananpp.github.io/word-game&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Building from source:&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/gajananpp/word-game.git

&lt;span class="pl-c1"&gt;cd&lt;/span&gt; word-game

npm install

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; For development&lt;/span&gt;
npm run dev

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; For production build&lt;/span&gt;
npm run build
npm run preview&lt;/pre&gt;

&lt;/div&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/gajananpp/word-game" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h3&gt;
  
  
  Additional Resources / Info
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqyiww59huso336d65h3y.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqyiww59huso336d65h3y.gif" alt="Word game demo GIF" width="640" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Play:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://gajananpp.github.io/word-game" rel="noopener noreferrer"&gt;https://gajananpp.github.io/word-game&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Stack Used:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Deepgram STT&lt;/li&gt;
&lt;li&gt;Phaser game framework&lt;/li&gt;
&lt;li&gt;Sveltekit with static site adapter to deploy on Github pages&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>hackwithdg</category>
    </item>
    <item>
      <title>Puppeteer IDE Extension: What's new ?</title>
      <dc:creator>Gajanan Patil</dc:creator>
      <pubDate>Tue, 25 Jan 2022 17:43:44 +0000</pubDate>
      <link>https://dev.to/gajananpp/puppeteer-ide-extension-whats-new--2ae2</link>
      <guid>https://dev.to/gajananpp/puppeteer-ide-extension-whats-new--2ae2</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1280wystd05goq8q45pw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1280wystd05goq8q45pw.gif" alt="Extension demo GIF" width="1024" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Changes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Added
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi tabs and scripts support&lt;/strong&gt;. Now you can store multiple scripts and keep the ones you use often, opened in tabs. Scripts will be stored in browser's storage, &lt;strong&gt;&lt;em&gt;nothing goes outside from this extension&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Theme switch&lt;/strong&gt;. Instead of changing theme of whole devtools window, now there is a separate theme switch for panel.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dark Theme&lt;/th&gt;
&lt;th&gt;Light Theme&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmy88s41u0nz40ui4koou.png" alt="Dark Theme" width="800" height="500"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faidljxcpwmj5p2pgs706.png" alt="Light Theme" width="800" height="500"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;$0 suggestion&lt;/strong&gt;. Typing &lt;code&gt;$0&lt;/code&gt; in editor will give currently selected element's selector suggestion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffuu1ze2uslbs0mheed0p.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffuu1ze2uslbs0mheed0p.gif" alt="$0 usage GIF" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Logging unhandled errors in console tab of inspected window&lt;/strong&gt;. Unhandled errors will now also be logged in inspected window's console tab along with console tab of extension panel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard shortcuts&lt;/strong&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Fixed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Broken editor icons issue.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  More Information
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/gajananpp" rel="noopener noreferrer"&gt;
        gajananpp
      &lt;/a&gt; / &lt;a href="https://github.com/gajananpp/puppeteer-ide-extension" rel="noopener noreferrer"&gt;
        puppeteer-ide-extension
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Standalone puppeteer playground in browser's developer tools.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Puppeteer IDE Extension&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/gajananpp/puppeteer-ide-extension/actions/workflows/lint.yml/badge.svg"&gt;&lt;img src="https://github.com/gajananpp/puppeteer-ide-extension/actions/workflows/lint.yml/badge.svg" alt="lint"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/gajananpp/puppeteer-ide-extension/actions/workflows/build.yml/badge.svg"&gt;&lt;img src="https://github.com/gajananpp/puppeteer-ide-extension/actions/workflows/build.yml/badge.svg" alt="build"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A standalone extension to write and execute puppeteer scripts from browser's developer tools.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/gajananpp/puppeteer-ide-extension#installation" rel="noopener noreferrer"&gt;Installation&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/puppeteer-ide-extension#usage" rel="noopener noreferrer"&gt;Usage&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/puppeteer-ide-extension#screenshots" rel="noopener noreferrer"&gt;Screenshots&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/puppeteer-ide-extension#build-from-source" rel="noopener noreferrer"&gt;Build From Source&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/puppeteer-ide-extension#privacy" rel="noopener noreferrer"&gt;Privacy&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/puppeteer-ide-extension#todo" rel="noopener noreferrer"&gt;Todo&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/puppeteer-ide-extension#faqs" rel="noopener noreferrer"&gt;FAQs&lt;/a&gt;&lt;/p&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/gajananpp/puppeteer-ide-extensionassets/pptr-ide-extension.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgajananpp%2Fpuppeteer-ide-extensionassets%2Fpptr-ide-extension.gif" alt="Demo GIF" width="800"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This extension is published on chrome web store.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://chrome.google.com/webstore/detail/puppeteer-ide/ilehdekjacappgghkgmmlbhgbnlkgoid" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgajananpp%2Fpuppeteer-ide-extensionassets%2Fchrome-web-store-btn.png" alt="Add from Chrome web store"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This extension will add an extra tab named "Puppeteer IDE" in browser's developer tools from where you can write and execute puppeteer scripts.&lt;/p&gt;
&lt;p&gt;Use &lt;a href="https://pptr.dev/#?product=Puppeteer&amp;amp;version=v13.0.0&amp;amp;show=api-class-page" rel="nofollow noopener noreferrer"&gt;page&lt;/a&gt; instance variable directly for the tab in which developer tools is opened.&lt;/p&gt;
&lt;p&gt;On clicking &lt;code&gt;Execute&lt;/code&gt; button, the script will be executed on the inspected tab.&lt;/p&gt;
&lt;p&gt;The script will be auto saved as it is being edited.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Screenshots&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Using &lt;code&gt;$0&lt;/code&gt; :-
&lt;a rel="noopener noreferrer" href="https://github.com/gajananpp/puppeteer-ide-extensionassets/screenshots/$0-usage.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgajananpp%2Fpuppeteer-ide-extensionassets%2Fscreenshots%2F%240-usage.gif" alt="Using $0 to get selector"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dark theme :-
&lt;a rel="noopener noreferrer" href="https://github.com/gajananpp/puppeteer-ide-extensionassets/screenshots/screen-1.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgajananpp%2Fpuppeteer-ide-extensionassets%2Fscreenshots%2Fscreen-1.png" alt="Dark theme"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Light theme :-
&lt;a rel="noopener noreferrer" href="https://github.com/gajananpp/puppeteer-ide-extensionassets/screenshots/screen-2.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgajananpp%2Fpuppeteer-ide-extensionassets%2Fscreenshots%2Fscreen-2.png" alt="Light theme"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Build From Source&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;To build extension from source :-&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;git clone https://github.com/gajananpp/puppeteer-ide-extension

cd puppeteer-ide-extension

npm install

npm run dist
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will output extension in dist folder which you can load in your browser by following this &lt;a href="https://developer.chrome.com/docs/extensions/mv3/getstarted/#:~:text=The%20directory%20holding%20the%20manifest%20file%20can%20be%20added%20as%20an%20extension%20in%20developer%20mode%20in%20its%20current%20state." rel="nofollow noopener noreferrer"&gt;steps&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/gajananpp/puppeteer-ide-extension" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>⏰ Parikshan - Compiler to measure the running time of javascript functions</title>
      <dc:creator>Gajanan Patil</dc:creator>
      <pubDate>Thu, 13 Jan 2022 14:21:10 +0000</pubDate>
      <link>https://dev.to/gajananpp/parikshan-compiler-to-measure-the-running-time-of-javascript-functions-3fb8</link>
      <guid>https://dev.to/gajananpp/parikshan-compiler-to-measure-the-running-time-of-javascript-functions-3fb8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Word "parikshan" is originated from Sanskrit language meaning "examine"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://charts.mongodb.com/charts-hackathon-xezpo/public/dashboards/61ddb47a-69ec-49df-8061-145da7025f8b" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbwyzq7zgal8snpjxd47z.png" alt="Parikshan MongoDB Charts" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Overview of My Submission
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Compiles code and wraps function calls in source with &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/User_Timing_API" rel="noopener noreferrer"&gt;Performance&lt;/a&gt; hooks. &lt;/li&gt;
&lt;li&gt;Reports &lt;code&gt;duration&lt;/code&gt; along with details like &lt;code&gt;arguments&lt;/code&gt;, &lt;code&gt;calledAt&lt;/code&gt;, &lt;code&gt;returnedAt&lt;/code&gt;, &lt;code&gt;functionName&lt;/code&gt; and &lt;code&gt;location&lt;/code&gt; in source code (optional). In case the function returns a promise then finally handler will be attached to the promise and is reported once the finally handler is invoked. &lt;/li&gt;
&lt;li&gt;A &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/PerformanceObserver" rel="noopener noreferrer"&gt;PerformanceObserver&lt;/a&gt; stores the performance entries generated by &lt;code&gt;parikshan&lt;/code&gt; in &lt;a href="https://docs.mongodb.com/manual/core/timeseries-collections/" rel="noopener noreferrer"&gt;time series collection&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;Use this project's MongoDB Charts &lt;a href="https://github.com/gajananpp/parikshan/blob/main/assets/Parikshan.charts" rel="noopener noreferrer"&gt;dashboard file&lt;/a&gt; when creating a new dashboard by &lt;a href="https://www.mongodb.com/blog/post/import-export-your-charts-dashboards" rel="noopener noreferrer"&gt;importing&lt;/a&gt; it and connect it to collection created by parikshan. &lt;/li&gt;
&lt;li&gt;You can check dashboard for analysis done on &lt;a href="https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/javascript_nodejs/43.complex-dialog" rel="noopener noreferrer"&gt;botbuilder example&lt;/a&gt; repository &lt;a href="https://charts.mongodb.com/charts-hackathon-xezpo/public/dashboards/61ddb47a-69ec-49df-8061-145da7025f8b" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check project's &lt;a href="https://github.com/gajananpp/parikshan/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt; for usage, docs and more information.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Submission Category:
&lt;/h3&gt;

&lt;p&gt;Prime Time&lt;/p&gt;

&lt;h3&gt;
  
  
  Link to Code
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/gajananpp" rel="noopener noreferrer"&gt;
        gajananpp
      &lt;/a&gt; / &lt;a href="https://github.com/gajananpp/parikshan" rel="noopener noreferrer"&gt;
        parikshan
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🧐 Get insights from your code
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;⏰ Parikshan&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/gajananpp/parikshan/actions/workflows/lint.yml/badge.svg"&gt;&lt;img src="https://github.com/gajananpp/parikshan/actions/workflows/lint.yml/badge.svg" alt="lint"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/gajananpp/parikshan/actions/workflows/test.yml/badge.svg"&gt;&lt;img src="https://github.com/gajananpp/parikshan/actions/workflows/test.yml/badge.svg" alt="test"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/gajananpp/parikshan/actions/workflows/build.yml/badge.svg"&gt;&lt;img src="https://github.com/gajananpp/parikshan/actions/workflows/build.yml/badge.svg" alt="build"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/parikshan" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1d2345547f6c23a72f14366c7b1d22e813cd6d97a7e25b2ebc7397e6e92ecdb4/68747470733a2f2f62616467652e667572792e696f2f6a732f706172696b7368616e2e737667" alt="npm version"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Transpiler to measure the running time of javascript functions.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/gajananpp/parikshan#installation" rel="noopener noreferrer"&gt;Installation&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/parikshan#usage" rel="noopener noreferrer"&gt;Usage&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/parikshan#using-with-mongodb" rel="noopener noreferrer"&gt;Using with MongoDB&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/parikshan#faqs" rel="noopener noreferrer"&gt;FAQs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Converts&lt;/p&gt;
&lt;div&gt;
&lt;div class="highlight highlight-source-js notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;// index.js&lt;/span&gt;
&lt;span class="pl-en"&gt;greet&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;'John'&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To&lt;/p&gt;
&lt;div&gt;
&lt;div class="highlight highlight-source-js notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;// output/index.js&lt;/span&gt;
&lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;parikshan&lt;span class="pl-kos"&gt;}&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-en"&gt;require&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;"parikshan/build/src/parikshan"&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;

&lt;span class="pl-en"&gt;parikshan&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s1"&gt;greet&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;'John'&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;

&lt;span class="pl-c"&gt;// if compiled with -s flag then compiles to&lt;/span&gt;
&lt;span class="pl-en"&gt;parikshan&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;
  &lt;span class="pl-s1"&gt;greet&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
  &lt;span class="pl-kos"&gt;{&lt;/span&gt;&lt;span class="pl-s"&gt;"start"&lt;/span&gt;:&lt;span class="pl-kos"&gt;{&lt;/span&gt;&lt;span class="pl-s"&gt;"line"&lt;/span&gt;:&lt;span class="pl-c1"&gt;1&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;&lt;span class="pl-s"&gt;"column"&lt;/span&gt;:&lt;span class="pl-c1"&gt;0&lt;/span&gt;&lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;&lt;span class="pl-s"&gt;"end"&lt;/span&gt;:&lt;span class="pl-kos"&gt;{&lt;/span&gt;&lt;span class="pl-s"&gt;"line"&lt;/span&gt;:&lt;span class="pl-c1"&gt;1&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;&lt;span class="pl-s"&gt;"column"&lt;/span&gt;:&lt;span class="pl-c1"&gt;13&lt;/span&gt;&lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;&lt;span class="pl-s"&gt;"filename"&lt;/span&gt;:&lt;span class="pl-s"&gt;"index.js"&lt;/span&gt;&lt;span class="pl-kos"&gt;}&lt;/span&gt;
&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;'John'&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;To install this package run:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;npm i parikshan -D
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;or with yarn run:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;yarn add parikshan -D
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;CLI Usage&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;npx parikshan@latest -h
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;parikshan  &amp;lt;files..&amp;amp;gt
Compiles code to performance.measure the functions

Positional Arguments:
  files  One or more files or glob patterns to compile

Options:
  -h, --help        Show help                                          [boolean]
  -v, --version     Show version number                                [boolean]&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/gajananpp/parikshan" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Additional Resources / Info
&lt;/h3&gt;



&lt;p&gt;&lt;strong&gt;Q: How was the example project shown in &lt;a href="https://charts.mongodb.com/charts-hackathon-xezpo/public/dashboards/61ddb47a-69ec-49df-8061-145da7025f8b" rel="noopener noreferrer"&gt;dashboard&lt;/a&gt; compiled ?&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NOTE :- having Azure account is not required for this to run. So envs in &lt;code&gt;.env&lt;/code&gt; of &lt;code&gt;43.complex-dialog&lt;/code&gt; can be left undefined.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# clone botbuilder samples repo&lt;/span&gt;
git clone https://github.com/microsoft/BotBuilder-Samples.git

&lt;span class="c"&gt;# goto 43.complex-dialog example&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;BotBuilder-Samples/samples/javascript_nodejs/43.complex-dialog

&lt;span class="c"&gt;# install dependencies&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# install parikshan as dev dependency&lt;/span&gt;
npm i parikshan &lt;span class="nt"&gt;-D&lt;/span&gt;

&lt;span class="c"&gt;# at the beginning of index.js, add&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# const {initMongoPerfSubscriber} = require('parikshan')&lt;/span&gt;
&lt;span class="c"&gt;# initMongoPerfSubscriber({&lt;/span&gt;
&lt;span class="c"&gt;#   dbConnectionString: process.env.DB_CONN_STRING,&lt;/span&gt;
&lt;span class="c"&gt;#   dbName: process.env.DB_NAME,&lt;/span&gt;
&lt;span class="c"&gt;#   collectionName: process.env.DB_COLLECTION,&lt;/span&gt;
&lt;span class="c"&gt;# })&lt;/span&gt;

&lt;span class="c"&gt;# compile with parikshan&lt;/span&gt;
npx parikshan &lt;span class="s2"&gt;"{,!(node_modules)/**/}*.js"&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt;

&lt;span class="c"&gt;# run compiled code&lt;/span&gt;
node build/parikshan/index.js

&lt;span class="c"&gt;# converse with bot using botframework emulator. Check README of 43.complex-dialog for info on this.&lt;/span&gt;

&lt;span class="c"&gt;# performance entries will be stored in collection as users are using bot.&lt;/span&gt;
&lt;span class="c"&gt;# create your own MongoDB charts dashboard or import dashboard of this project to get insights of your code.&lt;/span&gt;

&lt;span class="c"&gt;# Adjust refresh time in `Auto-refresh settings` of dashboard according to your need&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dashboard for analysis done on &lt;a href="https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/javascript_nodejs/43.complex-dialog" rel="noopener noreferrer"&gt;botbuilder example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/gajananpp/embed/rNGqZLb?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>atlashackathon</category>
      <category>mongodb</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>Using Promise.race usefully</title>
      <dc:creator>Gajanan Patil</dc:creator>
      <pubDate>Wed, 22 Dec 2021 14:16:14 +0000</pubDate>
      <link>https://dev.to/gajananpp/using-promiserace-usefully-420f</link>
      <guid>https://dev.to/gajananpp/using-promiserace-usefully-420f</guid>
      <description>&lt;p&gt;When doing long running tasks like :-&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;DB query which may take long time&lt;/li&gt;
&lt;li&gt;Reading big files&lt;/li&gt;
&lt;li&gt;API which may take long time to complete&lt;/li&gt;
&lt;li&gt;Waiting for some event&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You may want to stop if the task is taking more time than usual to get completed. In that case &lt;code&gt;Promise.race&lt;/code&gt; can be useful.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/puppeteer/puppeteer/blob/main/src/common/FrameManager.ts#L239" rel="noopener noreferrer"&gt;Puppeteer&lt;/a&gt; project uses &lt;code&gt;Promise.race&lt;/code&gt; to handle page/network lifecycle events with timeouts during automation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's an 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="cm"&gt;/**
 * A utility function which throws error after timeout
 * @param timeout - timeout in seconds
 * @returns - promise which gets rejected after timeout
 */&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timeout&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="nc"&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="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&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="nf"&gt;setTimeout&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="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;❌ failed with timeout&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;timeout&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Mock db query which take 5 seconds to complete
 * @returns - query promise
 */&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;bigQuery&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="nc"&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="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&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="nf"&gt;setTimeout&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="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// race both bigQuery and timer tasks&lt;/span&gt;
&lt;span class="c1"&gt;// `Promise.race` can take multiple promises if you want to race them all&lt;/span&gt;
&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;race&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="nf"&gt;bigQuery&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="nf"&gt;timer&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="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;then&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="nf"&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;✅ Query successful within time limit&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;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// ==&amp;gt; will log '❌ failed with timeout'&lt;/span&gt;


&lt;span class="c1"&gt;// also try running above code by changing timer's timeout value to 6, you will get successful log&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Promise returned by &lt;code&gt;Promise.race&lt;/code&gt; resolve/rejects with whichever promise in array resolves/rejects first. For more info checkout &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race" rel="noopener noreferrer"&gt;MDN&lt;/a&gt; docs.&lt;/p&gt;

&lt;p&gt;You can play with the above code here :-&lt;/p&gt;


&lt;div class="runkit-element"&gt;
  &lt;code&gt;
    
  &lt;/code&gt;
  &lt;code&gt;
    
/**


A utility function which throws error after timeout
@param timeout - timeout in seconds
@returns - promise which gets rejected after timeout
*/
function timer(timeout) {
return new Promise((resolve, reject) =&amp;gt; {
    setTimeout(() =&amp;gt; {
        reject(new Error('❌ failed with timeout'))
    }, timeout * 1000)
})
}


/**


Mock db query which take 5 seconds to complete
@returns - query promise
*/
function bigQuery() {
return new Promise((resolve, reject) =&amp;gt; {
    setTimeout(resolve, 5 * 1000)
})
}


// race both bigQuery and timer tasks
// Promise.race can take multiple promises if you want to race them all
Promise.race([
    bigQuery(),
    timer(1)
]).then(() =&amp;gt; console.log('✅ Query successful within time limit'))
    .catch(console.error)

// ==&amp;gt; will log '❌ failed with timeout'

// also try running above code by changing timer's timeout value to 6, you will get successful log

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



&lt;h2&gt;
  
  
  💡 Let me know in comments other cool ideas using &lt;code&gt;Promise.race&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;See my projects on &lt;a href="https://github.com/gajananpp" rel="noopener noreferrer"&gt;Github&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to use built-in Proxy object in javascript</title>
      <dc:creator>Gajanan Patil</dc:creator>
      <pubDate>Sat, 18 Dec 2021 16:02:57 +0000</pubDate>
      <link>https://dev.to/gajananpp/how-to-use-built-in-proxy-object-in-javascript-3kh1</link>
      <guid>https://dev.to/gajananpp/how-to-use-built-in-proxy-object-in-javascript-3kh1</guid>
      <description>&lt;p&gt;&lt;code&gt;Proxy&lt;/code&gt; object allows you to add custom get, set, delete behaviour on your existing object.&lt;/p&gt;

&lt;p&gt;Here is one useful way of using &lt;code&gt;Proxy&lt;/code&gt;, which will allow us to &lt;strong&gt;query json array with value rather than index&lt;/strong&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="c1"&gt;// our array&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;items&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="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;123&lt;/span&gt;&lt;span class="dl"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;phone&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;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;789&lt;/span&gt;&lt;span class="dl"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tablet&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;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1011&lt;/span&gt;&lt;span class="dl"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;laptop&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;// define custom hooks&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handlers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prop&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;return&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;prop&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;// create proxy object&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;customItems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Proxy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handlers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// now you can access our array with name instead of index 😀&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;customItems&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;laptop&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  
&lt;span class="c1"&gt;// logs =&amp;gt; { id: '1011', name: 'laptop'}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;For more in depth information check out &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy" rel="noopener noreferrer"&gt;MDN guide&lt;/a&gt; or comment below in case of doubt. &lt;/p&gt;

&lt;p&gt;You can play with the above code here :-&lt;/p&gt;


&lt;div class="runkit-element"&gt;
  &lt;code&gt;
    
  &lt;/code&gt;
  &lt;code&gt;
    // our array
const items = [
    {
        id: '123',
        name: 'phone'
    },
    {
        id: '789',
        name: 'tablet'
    },
    {
        id: '1011',
        name: 'laptop'
    }
]

// define custom hooks
const handlers = {
    get: (target, prop) =&amp;gt; {
        return target.find(item =&amp;gt; item.name === prop)
    }
}

// create proxy object
const customItems = new Proxy(items, handlers)

// now you can access our array with name instead of index 😀
console.log(customItems['laptop'])
// logs =&amp;gt; { id: '1011', name: 'laptop'}


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



&lt;h2&gt;
  
  
  💡 Post your cool ideas with &lt;code&gt;Proxy&lt;/code&gt; in comments.
&lt;/h2&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Write, test and execute automation scripts from browser's developer tools</title>
      <dc:creator>Gajanan Patil</dc:creator>
      <pubDate>Tue, 14 Dec 2021 13:00:53 +0000</pubDate>
      <link>https://dev.to/gajananpp/write-test-and-execute-automation-scripts-from-browsers-developer-tools-epo</link>
      <guid>https://dev.to/gajananpp/write-test-and-execute-automation-scripts-from-browsers-developer-tools-epo</guid>
      <description>&lt;p&gt;&lt;a href="https://chrome.google.com/webstore/detail/puppeteer-ide/ilehdekjacappgghkgmmlbhgbnlkgoid" rel="noopener noreferrer"&gt;Puppeteer IDE extension&lt;/a&gt; is a standalone extension which allows you to write and execute puppeteer scripts from developer tools. It is &lt;strong&gt;not&lt;/strong&gt; required to start browser with remote debugging or have nodejs or any other service installed for this extension to work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;This extension is published on chrome web store. &lt;a href="https://chrome.google.com/webstore/detail/puppeteer-ide/ilehdekjacappgghkgmmlbhgbnlkgoid" rel="noopener noreferrer"&gt;Click here&lt;/a&gt; to view extension on chrome web store.&lt;/p&gt;

&lt;p&gt;On adding extension to browser, it will add &lt;code&gt;Puppeteer IDE&lt;/code&gt; tab in developer tools. On switching to this tab, it will by default have one test script which you can execute right away.&lt;/p&gt;

&lt;p&gt;This extension can be used with other chromium based browsers like edge, brave etc.&lt;/p&gt;

&lt;p&gt;Example GIF :-&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk5hvznn4mife7qzmtiv5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk5hvznn4mife7qzmtiv5.gif" alt="Example Extension GIF" width="640" height="362"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;You can access puppeteer's &lt;a href="https://pptr.dev/#?product=Puppeteer&amp;amp;version=v13.0.0&amp;amp;show=api-class-page" rel="noopener noreferrer"&gt;page&lt;/a&gt; instance variable directly for the tab in which developer tools is opened. On clicking &lt;code&gt;Execute&lt;/code&gt; button, the script will be executed on the inspected tab. &lt;/p&gt;

&lt;p&gt;The script will be auto saved as you are editing it.&lt;/p&gt;

&lt;p&gt;The editor will take the theme of developer tools. You can change developer tool's theme by &lt;a href="https://developer.chrome.com/docs/devtools/customize/dark-theme/" rel="noopener noreferrer"&gt;following this guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Light theme screenshot :-&lt;/p&gt;

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

&lt;p&gt;Dark theme screenshot :-&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;This extension is standalone, it won't make any external API calls in the background. You can inspect the network of extension/page and source code.&lt;/p&gt;

&lt;p&gt;For more information, checkout this project's &lt;a href="https://github.com/gajananpp/puppeteer-ide-extension" rel="noopener noreferrer"&gt;&lt;strong&gt;Github Repo&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/gajananpp" rel="noopener noreferrer"&gt;
        gajananpp
      &lt;/a&gt; / &lt;a href="https://github.com/gajananpp/puppeteer-ide-extension" rel="noopener noreferrer"&gt;
        puppeteer-ide-extension
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Standalone puppeteer playground in browser's developer tools.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Puppeteer IDE Extension&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/gajananpp/puppeteer-ide-extension/actions/workflows/lint.yml/badge.svg"&gt;&lt;img src="https://github.com/gajananpp/puppeteer-ide-extension/actions/workflows/lint.yml/badge.svg" alt="lint"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/gajananpp/puppeteer-ide-extension/actions/workflows/build.yml/badge.svg"&gt;&lt;img src="https://github.com/gajananpp/puppeteer-ide-extension/actions/workflows/build.yml/badge.svg" alt="build"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A standalone extension to write and execute puppeteer scripts from browser's developer tools.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/gajananpp/puppeteer-ide-extension#installation" rel="noopener noreferrer"&gt;Installation&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/puppeteer-ide-extension#usage" rel="noopener noreferrer"&gt;Usage&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/puppeteer-ide-extension#screenshots" rel="noopener noreferrer"&gt;Screenshots&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/puppeteer-ide-extension#build-from-source" rel="noopener noreferrer"&gt;Build From Source&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/puppeteer-ide-extension#privacy" rel="noopener noreferrer"&gt;Privacy&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/puppeteer-ide-extension#todo" rel="noopener noreferrer"&gt;Todo&lt;/a&gt; •
&lt;a href="https://github.com/gajananpp/puppeteer-ide-extension#faqs" rel="noopener noreferrer"&gt;FAQs&lt;/a&gt;&lt;/p&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/gajananpp/puppeteer-ide-extensionassets/pptr-ide-extension.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgajananpp%2Fpuppeteer-ide-extensionassets%2Fpptr-ide-extension.gif" alt="Demo GIF" width="800"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This extension is published on chrome web store.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://chrome.google.com/webstore/detail/puppeteer-ide/ilehdekjacappgghkgmmlbhgbnlkgoid" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgajananpp%2Fpuppeteer-ide-extensionassets%2Fchrome-web-store-btn.png" alt="Add from Chrome web store"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This extension will add an extra tab named "Puppeteer IDE" in browser's developer tools from where you can write and execute puppeteer scripts.&lt;/p&gt;
&lt;p&gt;Use &lt;a href="https://pptr.dev/#?product=Puppeteer&amp;amp;version=v13.0.0&amp;amp;show=api-class-page" rel="nofollow noopener noreferrer"&gt;page&lt;/a&gt; instance variable directly for the tab in which developer tools is opened.&lt;/p&gt;
&lt;p&gt;On clicking &lt;code&gt;Execute&lt;/code&gt; button, the script will be executed on the inspected tab.&lt;/p&gt;
&lt;p&gt;The script will be auto saved as it is being edited.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Screenshots&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Using &lt;code&gt;$0&lt;/code&gt; :-
&lt;a rel="noopener noreferrer" href="https://github.com/gajananpp/puppeteer-ide-extensionassets/screenshots/$0-usage.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgajananpp%2Fpuppeteer-ide-extensionassets%2Fscreenshots%2F%240-usage.gif" alt="Using $0 to get selector"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dark theme :-
&lt;a rel="noopener noreferrer" href="https://github.com/gajananpp/puppeteer-ide-extensionassets/screenshots/screen-1.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgajananpp%2Fpuppeteer-ide-extensionassets%2Fscreenshots%2Fscreen-1.png" alt="Dark theme"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Light theme :-
&lt;a rel="noopener noreferrer" href="https://github.com/gajananpp/puppeteer-ide-extensionassets/screenshots/screen-2.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgajananpp%2Fpuppeteer-ide-extensionassets%2Fscreenshots%2Fscreen-2.png" alt="Light theme"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Build From Source&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;To build extension from source :-&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;git clone https://github.com/gajananpp/puppeteer-ide-extension

cd puppeteer-ide-extension

npm install

npm run dist
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will output extension in dist folder which you can load in your browser by following this &lt;a href="https://developer.chrome.com/docs/extensions/mv3/getstarted/#:~:text=The%20directory%20holding%20the%20manifest%20file%20can%20be%20added%20as%20an%20extension%20in%20developer%20mode%20in%20its%20current%20state." rel="nofollow noopener noreferrer"&gt;steps&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/gajananpp/puppeteer-ide-extension" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Use Puppeteer in browser extension</title>
      <dc:creator>Gajanan Patil</dc:creator>
      <pubDate>Mon, 06 Dec 2021 19:46:08 +0000</pubDate>
      <link>https://dev.to/gajananpp/use-puppeter-in-browser-extension-1o29</link>
      <guid>https://dev.to/gajananpp/use-puppeter-in-browser-extension-1o29</guid>
      <description>&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;Recently in one of the projects, I had to do some automation on web pages through &lt;strong&gt;extension&lt;/strong&gt;. So i wanted to leverage &lt;a href="https://pptr.dev/" rel="noopener noreferrer"&gt;puppeteer&lt;/a&gt; api instead of forming and executing raw devtool commands through &lt;a href="https://developer.chrome.com/docs/extensions/reference/debugger/" rel="noopener noreferrer"&gt;chrome.debugger&lt;/a&gt; extension api directly or dispatching events on target elements through content scripts as some web pages discards the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted" rel="noopener noreferrer"&gt;untrusted events&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;To achieve this, I created a puppeteer transport package which will allow you to use puppeteer in your browser extension's background_page(v2)/service_worker(v3). This package internally uses chrome.debugger api for communicating with &lt;a href="https://chromedevtools.github.io/devtools-protocol/" rel="noopener noreferrer"&gt;Chrome Devtools Protocol&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can check repo &lt;a href="https://github.com/gajananpp/puppeteer-extension-transport" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Repo contains  &lt;a href="https://github.com/gajananpp/puppeteer-extension-transport/tree/main/examples/extension-v2" rel="noopener noreferrer"&gt;v2 extension&lt;/a&gt;/&lt;a href="https://github.com/gajananpp/puppeteer-extension-transport/tree/main/examples/extension-v3" rel="noopener noreferrer"&gt;v3 extension&lt;/a&gt; examples which you can load in your browser to test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;Since the target is attached using chrome.debugger api, browser &lt;strong&gt;doesn't&lt;/strong&gt; need to be started using remote debugging flag.&lt;/p&gt;

&lt;p&gt;Here is an example code snippet :-&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;puppeteer&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;puppeteer-core/lib/cjs/puppeteer/web&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ExtensionDebuggerTransport&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;puppeteer-extension-transport&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;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tabId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;extensionTransport&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ExtensionDebuggerTransport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tabId&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;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puppeteer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;extensionTransport&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;defaultViewport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// use first page from pages instead of using browser.newPage()&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&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://wikipedia.org&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;screenshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;encoding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;base64&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`data:image/png;base64,&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;screenshot&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;englishButton&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitForSelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#js-link-box-en &amp;gt; strong&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;englishButton&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;click&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;searchBox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitForSelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#searchInput&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;searchBox&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;telephone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Enter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;commands&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onCommand&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;test&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;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tabs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;active&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;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;https://www.google.co.in&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;tab&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;tab&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="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;Execution :-&lt;/p&gt;

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

&lt;p&gt;With this, from extension you can do :- &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;automation&lt;/li&gt;
&lt;li&gt;monitor and handle page/network lifecycle events&lt;/li&gt;
&lt;li&gt;profiling/crawling of web pages &lt;/li&gt;
&lt;li&gt;any other thing you would like to use puppeteer for&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can find reference docs for package &lt;a href="https://github.com/gajananpp/puppeteer-extension-transport/blob/main/docs/README.md" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For more information checkout :-&lt;br&gt;
&lt;a href="https://github.com/gajananpp/puppeteer-extension-transport" rel="noopener noreferrer"&gt;https://github.com/gajananpp/puppeteer-extension-transport&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
