<?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: shivamkapasia0</title>
    <description>The latest articles on DEV Community by shivamkapasia0 (@shivamkapasia0).</description>
    <link>https://dev.to/shivamkapasia0</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%2F647796%2F5eb5dd0c-f4fd-459e-8c16-8ba9d814790b.gif</url>
      <title>DEV Community: shivamkapasia0</title>
      <link>https://dev.to/shivamkapasia0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shivamkapasia0"/>
    <language>en</language>
    <item>
      <title>InboxHire – AI-Powered Job Application Tracker Using Emails + Postmark</title>
      <dc:creator>shivamkapasia0</dc:creator>
      <pubDate>Mon, 26 May 2025 16:58:44 +0000</pubDate>
      <link>https://dev.to/shivamkapasia0/inboxhire-ai-powered-job-application-tracker-using-emails-postmark-5cg4</link>
      <guid>https://dev.to/shivamkapasia0/inboxhire-ai-powered-job-application-tracker-using-emails-postmark-5cg4</guid>
      <description>&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/challenges/postmark"&gt;Postmark Challenge: Inbox Innovators&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;InboxHire&lt;/strong&gt;, a personal AI-powered job application assistant that helps job seekers track and manage their job applications automatically—just by forwarding their application emails.&lt;/p&gt;

&lt;p&gt;No more copy-pasting details into spreadsheets or forgetting which company emailed you what. InboxHire listens to your email (via Postmark), extracts structured data using Gemini AI, and organizes everything in a sleek dashboard.&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%2Fqqhevoov9m9ru3it3q9x.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%2Fqqhevoov9m9ru3it3q9x.png" alt="Inbox Hire HomePage"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🎯 Purpose
&lt;/h3&gt;

&lt;p&gt;Lets face it — being a job seeker these days is basically a full-time job... without the paycheck.&lt;/p&gt;

&lt;p&gt;You are probably juggling applications across every corner of the internet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔗 &lt;strong&gt;LinkedIn&lt;/strong&gt; – Where "Open to Work" becomes a lifestyle.&lt;/li&gt;
&lt;li&gt;🔥 &lt;strong&gt;Naukri.com&lt;/strong&gt; – Where you uploaded your resume once... and they still email you daily.&lt;/li&gt;
&lt;li&gt;✨ &lt;strong&gt;Shine.com&lt;/strong&gt; – Because job hunting needs a little sparkle.&lt;/li&gt;
&lt;li&gt;🌍 &lt;strong&gt;Turing&lt;/strong&gt; – For when you want to work remotely from your couch... in sweatpants.&lt;/li&gt;
&lt;li&gt;🏢 &lt;strong&gt;Company Career Pages&lt;/strong&gt; – Each one with its own password requirements and CAPTCHA puzzles.&lt;/li&gt;
&lt;li&gt;📋 &lt;strong&gt;Job Boards&lt;/strong&gt; – A digital forest of listings (and you're the squirrel).&lt;/li&gt;
&lt;li&gt;📬 &lt;strong&gt;Direct Applications&lt;/strong&gt; – Bold move. Respect. Hope someone actually reads it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You are everywhere. And thats exactly why &lt;strong&gt;we're building tools to help you keep your sanity&lt;/strong&gt; (and maybe even land your dream job in the process).&lt;/p&gt;

&lt;p&gt;This multi-platform approach creates several challenges:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Scattered Applications&lt;/strong&gt;: Your applications are spread across different platforms, making it difficult to maintain a centralized view&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missed Follow-ups&lt;/strong&gt;: Without a unified system, it's easy to miss important follow-ups or deadlines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inconsistent Tracking&lt;/strong&gt;: Each platform has its own way of tracking applications, leading to inconsistent data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time Management&lt;/strong&gt;: Manually tracking applications across platforms is time-consuming and error-prone&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lack of Analytics&lt;/strong&gt;: Without centralized data, it's difficult to analyze your application patterns and success rates&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;InboxHire solves these challenges by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatically capturing application confirmations from your email&lt;/li&gt;
&lt;li&gt;Centralizing all your applications in one dashboard&lt;/li&gt;
&lt;li&gt;Providing smart notifications for follow-ups&lt;/li&gt;
&lt;li&gt;Offering comprehensive analytics on your application journey&lt;/li&gt;
&lt;li&gt;Saving you time and reducing the mental load of job hunting&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🔗 Watch the full demo video here: &lt;a href="https://www.loom.com/share/ddcb17fd023d467f906ef282f722a50e?sid=30dcd3cb-07f6-46de-888d-8a38267fadc9" rel="noopener noreferrer"&gt;Loom Video&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/ddcb17fd023d467f906ef282f722a50e"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Code Repository
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📘 &lt;strong&gt;Documentation &amp;amp; Overview:&lt;/strong&gt; &lt;a href="https://github.com/shivamkapasia0/inbox-hire" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/shivamkapasia0" rel="noopener noreferrer"&gt;
        shivamkapasia0
      &lt;/a&gt; / &lt;a href="https://github.com/shivamkapasia0/inbox-hire" rel="noopener noreferrer"&gt;
        inbox-hire
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;📬 InboxHire – Effortless Job Application Tracker&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📚 Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#-overview" rel="noopener noreferrer"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#-motivation-aka-why-were-even-doing-this" rel="noopener noreferrer"&gt;Motivation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#-features-prototype-edition--built-with-sleep-deprivation--caffeine" rel="noopener noreferrer"&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#how-it-works" rel="noopener noreferrer"&gt;How It Works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#-getting-started" rel="noopener noreferrer"&gt;Getting Started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/shivamkapasia0/inbox-hire#technical-architecture" rel="noopener noreferrer"&gt;Technical Architecture&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#project-flow-overview" rel="noopener noreferrer"&gt;Project Flow Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#system-overview" rel="noopener noreferrer"&gt;System Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#-project-structure" rel="noopener noreferrer"&gt;Project Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#-api-endpoints" rel="noopener noreferrer"&gt;API Endpoints&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#email-processing-flow" rel="noopener noreferrer"&gt;Email Processing Flow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#-security" rel="noopener noreferrer"&gt;Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#-monitoring--logging" rel="noopener noreferrer"&gt;Monitoring &amp;amp; Logging&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#-deployment" rel="noopener noreferrer"&gt;Deployment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#troubleshooting" rel="noopener noreferrer"&gt;Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#contributing" rel="noopener noreferrer"&gt;Contributing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#-future-roadmap-aka-the-quest-for-world-domination-or-at-least-job-domination" rel="noopener noreferrer"&gt;Future Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/shivamkapasia0/inbox-hire#ai-integration" rel="noopener noreferrer"&gt;AI Integration&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#gemini-integration" rel="noopener noreferrer"&gt;Gemini Integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#nlp-processing" rel="noopener noreferrer"&gt;NLP Processing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#license" rel="noopener noreferrer"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/inbox-hire#credits" rel="noopener noreferrer"&gt;Credits&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨ Overview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;InboxHire is an innovative job application tracking system that leverages Postmark's inbound email parsing capabilities and Google's Gemini AI to automatically organize and manage your job applications. Never miss a follow-up or deadline again!&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎥 Demo &amp;amp; Screenshots&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Demo Video&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a href="https://www.loom.com/share/ddcb17fd023d467f906ef282f722a50e" rel="nofollow noopener noreferrer"&gt;Watch the demo on Loom&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Click the image above to watch the demo video&lt;/em&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;App Screenshots&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Home Page&lt;/h4&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/public/inboxHire-homePageSS.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%2Fpublic%2FinboxHire-homePageSS.png" alt="InboxHire Home Page"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Applications Page&lt;/h4&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/public/inboxHire-ApplicationPageSS.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%2Fpublic%2FinboxHire-ApplicationPageSS.png" alt="InboxHire Applications Page"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎯 Motivation (a.k.a. Why We're Even Doing This)&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Lets face it — being a job seeker these days is basically a full-time job... without the paycheck.&lt;/p&gt;
&lt;p&gt;You are probably juggling applications across every corner of the internet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🔗…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/shivamkapasia0/inbox-hire" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔧 Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework&lt;/strong&gt;: Next.js&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Engine&lt;/strong&gt;: Gemini 2.0 Flash via Google Generative AI API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email Provider&lt;/strong&gt;: Postmark Inbound Webhooks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI Kit&lt;/strong&gt;: Tailwind CSS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt;: Local JSON (&lt;code&gt;emails.json&lt;/code&gt;) — no database needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's how the prototype works (powered by Postmark, Gemini AI, and pure hackathon energy):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;📩 &lt;strong&gt;Email Received&lt;/strong&gt; – You apply for a job. An email lands in your inbox. The journey begins.&lt;/li&gt;
&lt;li&gt;🛠️ &lt;strong&gt;Postmark Jumps In&lt;/strong&gt; – Our loyal sidekick, Postmark's inbound email API, catches the email and hands it over like a pro.&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;Gemini AI Extracts the Good Stuff&lt;/strong&gt; – Company name, job title, application date — all pulled out faster than you can say "Dear Hiring Manager."&lt;/li&gt;
&lt;li&gt;🗂️ &lt;strong&gt;New Entry Created&lt;/strong&gt; – A shiny new application appears on your dashboard like magic.&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Analytics Updated&lt;/strong&gt; – Your charts get a new data point. You're basically an Excel wizard now.&lt;/li&gt;
&lt;li&gt;🔔 &lt;strong&gt;You Get Notified&lt;/strong&gt; – Because what's the point of automation if it doesn't humblebrag with a notification?
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────┐     ┌─────────────────────┐     ┌──────────────────┐
│                 │     │                     │     │                  │
│  Incoming Email │────▶│  Inbound Email API  │────▶│   Gemini AI      │
│  (Postmark)     │     │  (Webhook Handler)  │     │  (Gemini 2.0)    │
│                 │     │                     │     │                  │
└─────────────────┘     └─────────────────────┘     └──────────────────┘
                                                             │
                                                             ▼
┌─────────────────┐     ┌─────────────────────┐     ┌──────────────────┐
│                 │     │                     │     │                  │
│  Real-time      │◀────│  Data Storage       │◀────│  Keyword         │
│  Updates        │     │  (emails.json)      │     │  Matching        │
│  (Dashboard)    │     │                     │     │  (Fallback)      │
│                 │     │                     │     │                  │
└─────────────────┘     └─────────────────────┘     └──────────────────┘

Flow Description:
1. Email received via Postmark webhook
2. Inbound Email API processes and validates the email
3. Gemini AI extracts key information (status, company, role, etc.)
4. If AI fails, Keyword Matching provides fallback analysis
5. Processed data is stored in emails.json
6. Real-time updates are pushed to the dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Detailed Overview Please visit : &lt;a href="https://github.com/shivamkapasia0/inbox-hire" rel="noopener noreferrer"&gt;https://github.com/shivamkapasia0/inbox-hire&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Credits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Built with &lt;a href="https://nextjs.org" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Email processing by &lt;a href="https://postmarkapp.com" rel="noopener noreferrer"&gt;Postmark&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AI powered by &lt;a href="https://deepmind.google/technologies/gemini/" rel="noopener noreferrer"&gt;Google Gemini&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>postmarkchallenge</category>
      <category>webdev</category>
      <category>api</category>
    </item>
    <item>
      <title>Tired of Messy Bookmarks? Try BookMyTabs — Sleek, Smart, and in Beta! 🌟</title>
      <dc:creator>shivamkapasia0</dc:creator>
      <pubDate>Mon, 28 Apr 2025 07:21:20 +0000</pubDate>
      <link>https://dev.to/shivamkapasia0/tired-of-messy-bookmarks-try-bookmytabs-sleek-smart-and-in-beta-hph</link>
      <guid>https://dev.to/shivamkapasia0/tired-of-messy-bookmarks-try-bookmytabs-sleek-smart-and-in-beta-hph</guid>
      <description>&lt;h2&gt;
  
  
  Introducing BookMyTabs 🚀: Effortless, Beautiful Bookmark Management
&lt;/h2&gt;

&lt;p&gt;Managing browser bookmarks has always been a challenge — messy folders, hard-to-find links, and almost zero personalization.&lt;br&gt;&lt;br&gt;
That's why I built &lt;strong&gt;&lt;a href="https://chromewebstore.google.com/detail/bookmytabs/nnmgagnnlimoainaiicbmnkpokgpimco?authuser=0&amp;amp;hl=en" rel="noopener noreferrer"&gt;BookMyTabs&lt;/a&gt;&lt;/strong&gt; — a &lt;strong&gt;modern, feature-rich Chrome extension&lt;/strong&gt; designed to help you organize your bookmarks like never before.&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%2Fiu6udma1r26s95xgiscm.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%2Fiu6udma1r26s95xgiscm.png" alt="BookMyTabs Main Screen" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Why Choose BookMyTabs?
&lt;/h2&gt;

&lt;p&gt;BookMyTabs isn't just another bookmark manager.&lt;br&gt;&lt;br&gt;
It’s built with &lt;strong&gt;speed, simplicity, and a gorgeous dark theme&lt;/strong&gt; at its core.&lt;br&gt;&lt;br&gt;
Whether you're a developer, a student, or just someone who loves staying organized, &lt;strong&gt;BookMyTabs&lt;/strong&gt; will upgrade your daily browsing experience.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 Key Features
&lt;/h2&gt;

&lt;p&gt;📚 &lt;strong&gt;Effortless Bookmark Organization&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Organize your bookmarks into &lt;strong&gt;custom categories&lt;/strong&gt; that actually make sense — no more endless, confusing folders.&lt;/p&gt;

&lt;p&gt;🏷️ &lt;strong&gt;Color-Coded Tagging System&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Easily tag your bookmarks with &lt;strong&gt;custom color labels&lt;/strong&gt; to filter and find them faster.&lt;/p&gt;

&lt;p&gt;🔍 &lt;strong&gt;Lightning-Fast Search&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Instantly find any saved page with a powerful, built-in search feature.&lt;/p&gt;

&lt;p&gt;⭐ &lt;strong&gt;Favorite Your Important Bookmarks&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Star your most valuable bookmarks for &lt;strong&gt;one-tap access&lt;/strong&gt; when you need them the most.&lt;/p&gt;

&lt;p&gt;🎨 &lt;strong&gt;Sleek, Dark-Themed Interface&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Enjoy a &lt;strong&gt;modern and eye-friendly UI&lt;/strong&gt;, perfect for day or night browsing.&lt;/p&gt;

&lt;p&gt;💾 &lt;strong&gt;Private, Local Storage Using IndexedDB&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Your data stays &lt;strong&gt;safe, private, and local&lt;/strong&gt; — no cloud uploads or data leaks.&lt;/p&gt;

&lt;p&gt;📱 &lt;strong&gt;Fully Responsive Design&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
BookMyTabs works beautifully across &lt;strong&gt;desktops, tablets, and mobile devices&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;🔄 &lt;strong&gt;Real-Time Updates&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Experience a smooth and instant UI — your bookmarks update the moment you add, edit, or organize them.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Getting Started is Easy!
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;strong&gt;&lt;a href="https://chromewebstore.google.com/detail/bookmytabs/nnmgagnnlimoainaiicbmnkpokgpimco?authuser=0&amp;amp;hl=en" rel="noopener noreferrer"&gt;BookMyTabs from the Chrome Web Store&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Start organizing your bookmarks in style.&lt;/li&gt;
&lt;li&gt;Enjoy a faster, cleaner, and more organized browsing experience!&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🧪 Beta Notice
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;BookMyTabs is currently in Beta!&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
While I’ve worked hard to build a stable experience, there may still be minor bugs or quirks.&lt;br&gt;&lt;br&gt;
Your feedback is incredibly valuable in helping shape future updates! 🚀&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  💬 I'd Love Your Feedback!
&lt;/h2&gt;

&lt;p&gt;I'm actively looking for ways to improve BookMyTabs.&lt;br&gt;&lt;br&gt;
Please feel free to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leave a review 🌟&lt;/li&gt;
&lt;li&gt;Share feature suggestions 💡&lt;/li&gt;
&lt;li&gt;Report any bugs 🐛 you encounter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your support and ideas mean the world!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Stay organized. Stay efficient. Stay awesome.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Go ahead and try &lt;a href="https://chromewebstore.google.com/detail/bookmytabs/nnmgagnnlimoainaiicbmnkpokgpimco?authuser=0&amp;amp;hl=en" rel="noopener noreferrer"&gt;BookMyTabs&lt;/a&gt; today! 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>PermiForce: Permit.io X azureDevops</title>
      <dc:creator>shivamkapasia0</dc:creator>
      <pubDate>Sun, 27 Apr 2025 12:48:10 +0000</pubDate>
      <link>https://dev.to/shivamkapasia0/permiforce-permitio-x-azuredevops-4ili</link>
      <guid>https://dev.to/shivamkapasia0/permiforce-permitio-x-azuredevops-4ili</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/permit_io"&gt;Permit.io Authorization Challenge&lt;/a&gt;: Permissions Redefined&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 PermiForce: The Missing Security Layer for Azure DevOps PRs 🔐
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sick of unwanted PRs and unauthorized code slipping into your critical branches? Take back control!&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Meet &lt;strong&gt;PermiForce&lt;/strong&gt; — your bulletproof PR gatekeeper! 🔥&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Built for the &lt;a href="https://dev.to/challenges/permit_io"&gt;Permit.io Authorization Challenge&lt;/a&gt;, &lt;strong&gt;PermiForce&lt;/strong&gt; brings &lt;strong&gt;fine-grained, role-based PR approvals&lt;/strong&gt; directly into your Azure DevOps pipelines.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Dynamic Permission Checks&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Real-Time Policy Enforcement&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Environment-Specific Controls (QA, UAT, Prod)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Audit Trail for Full Compliance&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Low-Code Dynamic Integration with Azure Pipelines&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔐 Powered by &lt;strong&gt;Permit.io&lt;/strong&gt;, PermiForce locks down your CI/CD like never before.&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠️ What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PermiForce&lt;/strong&gt; transforms static pipeline permissions into &lt;strong&gt;dynamic, intelligent access control&lt;/strong&gt; — enforcing &lt;strong&gt;"who can approve"&lt;/strong&gt;, &lt;strong&gt;"where they can deploy"&lt;/strong&gt;, and &lt;strong&gt;"when"&lt;/strong&gt; based on real-time roles and policies.&lt;/p&gt;

&lt;p&gt;Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Role-Based Access Control (RBAC):&lt;/strong&gt; Enforces permissions based on user roles, preventing unauthorized deployments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Policy Enforcement:&lt;/strong&gt; Utilizes Permit.io's policy engine to evaluate permissions in real-time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment-Specific Controls:&lt;/strong&gt; Differentiates access rights across environments (e.g., QA, UAT, Prod).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration with Azure DevOps:&lt;/strong&gt; Seamlessly integrates with Azure DevOps pipelines for automated enforcement.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  📝 &lt;strong&gt;Comparison: Azure DevOps vs. Permit.io&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Azure DevOps&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Permit.io&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Granular Access Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Limited&lt;/td&gt;
&lt;td&gt;✅ Fine-grained PR-level control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Role-Based Access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Basic&lt;/td&gt;
&lt;td&gt;✅ Advanced (Custom Roles)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Audit Trails for Approvals&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Limited&lt;/td&gt;
&lt;td&gt;✅ Full audit trail &amp;amp; visibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Real-Time Permission Validation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Delayed&lt;/td&gt;
&lt;td&gt;✅ Instant validation via API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compliance Reporting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Complex&lt;/td&gt;
&lt;td&gt;✅ Simple &amp;amp; automated reports&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Why Permit.io?&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Azure DevOps&lt;/strong&gt; lacks precise, dynamic PR-level access control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permit.io&lt;/strong&gt; fills the gap by providing granular role-based permissions, streamlined compliance tracking, and enhanced security for DevOps workflows.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  👥 User Roles and Permissions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Role&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Permissions&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Users&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Branch Access&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;👨‍💻 Developer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- &lt;code&gt;CREATE_QA_PR&lt;/code&gt;&lt;br&gt;- Cannot approve any PRs&lt;/td&gt;
&lt;td&gt;- &lt;a href="mailto:alice@permiforce.com"&gt;alice@permiforce.com&lt;/a&gt;&lt;br&gt;- &lt;a href="mailto:bob@permiforce.com"&gt;bob@permiforce.com&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;✅ Can create PRs to QA&lt;br&gt;❌ Cannot create PRs to UAT&lt;br&gt;❌ Cannot create PRs to PROD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;👨‍💼 Team Lead&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- &lt;code&gt;CREATE_UAT_PR&lt;/code&gt;&lt;br&gt;- &lt;code&gt;APPROVE_QA_PR&lt;/code&gt;&lt;br&gt;- &lt;code&gt;APPROVE_UAT_PR&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;- &lt;a href="mailto:carol@permiforce.com"&gt;carol@permiforce.com&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;✅ Can create PRs to UAT&lt;br&gt;✅ Can approve QA/UAT PRs&lt;br&gt;❌ Cannot create/approve PROD PRs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;👨‍💼 Release Manager&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- &lt;code&gt;APPROVE_PROD_PR&lt;/code&gt;&lt;br&gt;- &lt;code&gt;APPROVE_QA_PR&lt;/code&gt;&lt;br&gt;- &lt;code&gt;APPROVE_UAT_PR&lt;/code&gt;&lt;br&gt;- &lt;code&gt;CREATE_PROD_PR&lt;/code&gt;&lt;br&gt;- &lt;code&gt;CREATE_QA_PR&lt;/code&gt;&lt;br&gt;- &lt;code&gt;CREATE_UAT_PR&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;- &lt;a href="mailto:shivamsfdc.work@gmail.com"&gt;shivamsfdc.work@gmail.com&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;✅ Full access to all branches&lt;br&gt;✅ Can create PRs to any branch&lt;br&gt;✅ Can approve any PR&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  🧾 Detailed Permission Matrix
&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%2Fzmsankdq6u3uffwy2y45.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%2Fzmsankdq6u3uffwy2y45.png" alt="Permissions Image"&gt;&lt;/a&gt;&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%2Fjkgevvhrbqcnj9ctwqvj.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%2Fjkgevvhrbqcnj9ctwqvj.png" alt="User Roles Image"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🧪 Testing the System
&lt;/h2&gt;

&lt;p&gt;To test, I created USER_NAME variable to simulate different users but these can be dynamic through azure pipelines as well.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Test as Developer&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Set pipeline variable&lt;/span&gt;
   user_name: alice@permiforce.com
   &lt;span class="c"&gt;# Expected Results:&lt;/span&gt;
   - Can create PR to QA ✅
   - Cannot create PR to UAT ❌
   - Cannot create PR to PROD ❌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fna312v59on3yut9lw2ld.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%2Fna312v59on3yut9lw2ld.png" alt="Success Create QA PR"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Test as Team Lead&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Set pipeline variable&lt;/span&gt;
   user_name: carol@permiforce.com
   &lt;span class="c"&gt;# Expected Results:&lt;/span&gt;
   - Can approve QA/UAT PRs ✅
   - Cannot approve PROD PRs ❌
   - Cannot create QA PRs ❌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fbzt6e6gw3ofve25devk1.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%2Fbzt6e6gw3ofve25devk1.png" alt="Error Create QA PR"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Test as Release Manager&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Set pipeline variable&lt;/span&gt;
   user_name: shivamsfdc.work@gmail.com
   &lt;span class="c"&gt;# Expected Results:&lt;/span&gt;
   - Can approve all PRs ✅
   - Can create PRs to any branch ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9zk06wl36b77l7pvg9ud.png" alt="Success PR Approval Process"&gt;
&lt;/h2&gt;
&lt;h2&gt;
  
  
  🎥 Demo
&lt;/h2&gt;

&lt;p&gt;🔗 Watch the full demo video here: &lt;a href="https://www.loom.com/share/f6693c061eca49619b3c566549597a45?sid=681aaece-0900-451d-b30a-f9c948d71d2b" rel="noopener noreferrer"&gt;Loom Video&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/f6693c061eca49619b3c566549597a45"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;The demo showcases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting up the &lt;strong&gt;Variable Group&lt;/strong&gt; to securely store the Permit.io API key.&lt;/li&gt;
&lt;li&gt;Creating a &lt;strong&gt;PR&lt;/strong&gt; and triggering the pipeline.&lt;/li&gt;
&lt;li&gt;A quick walkthrough of &lt;strong&gt;Permit.io policies&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Simulating PR access checks using different users (e.g., &lt;code&gt;alice-dev&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Observing how &lt;strong&gt;PR approvals&lt;/strong&gt; are enforced based on user roles.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This project is for demonstration purposes only. The Permit.io policy server is locally hosted; therefore, the pipeline won't function as intended without the local server setup.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📂 Project Repository
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📘 &lt;strong&gt;Documentation &amp;amp; Overview:&lt;/strong&gt; &lt;a href="https://github.com/shivamkapasia0/PermiForce" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/shivamkapasia0" rel="noopener noreferrer"&gt;
        shivamkapasia0
      &lt;/a&gt; / &lt;a href="https://github.com/shivamkapasia0/PermiForce" rel="noopener noreferrer"&gt;
        PermiForce
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      PermiForce is a sophisticated Pull Request approval system that integrates Azure DevOps with Permit.io's fine-grained permission control. It ensures that only authorized personnel can approve and merge code changes into protected branches, maintaining code quality and security.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;PermiForce: Azure DevOps PR Approval System with Permit.io&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This project is a submission to the &lt;a href="https://dev.to/challenges/permit_io" rel="nofollow"&gt;Permit.io Authorization Challenge&lt;/a&gt; on dev.to. It demonstrates the implementation of fine-grained authorization using Permit.io in a real-world DevOps scenario.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🏆 Winner - Permit.io Authorization Challenge&lt;/h2&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;We are proud to share that this project is &lt;strong&gt;one of the winners&lt;/strong&gt; of the &lt;a href="https://dev.to/devteam/congrats-to-the-permitio-authorization-challenge-winners-35f" rel="nofollow"&gt;Permit.io Authorization Challenge&lt;/a&gt; hosted on DEV!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;📰 &lt;strong&gt;Official Announcement:&lt;/strong&gt; &lt;a href="https://dev.to/devteam/congrats-to-the-permitio-authorization-challenge-winners-35f" rel="nofollow"&gt;DEV.to Winners Post&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thank you to &lt;a href="https://www.permit.io/" rel="nofollow noopener noreferrer"&gt;Permit.io&lt;/a&gt; and the DEV community for organizing the hackathon and recognizing our work!&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#overview" rel="noopener noreferrer"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#motive" rel="noopener noreferrer"&gt;Motive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#core-concepts" rel="noopener noreferrer"&gt;Core Concepts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#user-roles-and-permissions" rel="noopener noreferrer"&gt;User Roles and Permissions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/shivamkapasia0/PermiForce#setup-instructions" rel="noopener noreferrer"&gt;Setup Instructions&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#prerequisites" rel="noopener noreferrer"&gt;Prerequisites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#azure-devops-setup" rel="noopener noreferrer"&gt;Azure DevOps Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#permitio-setup" rel="noopener noreferrer"&gt;Permit.io Setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/shivamkapasia0/PermiForce#permission-structure" rel="noopener noreferrer"&gt;Permission Structure&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#permission-hierarchy" rel="noopener noreferrer"&gt;Permission Hierarchy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#security-controls" rel="noopener noreferrer"&gt;Security Controls&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#permission-flow" rel="noopener noreferrer"&gt;Permission Flow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#critical-permissions" rel="noopener noreferrer"&gt;Critical Permissions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#permission-validation-process" rel="noopener noreferrer"&gt;Permission Validation Process&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#permission-matrix" rel="noopener noreferrer"&gt;Permission Matrix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#testing-the-system" rel="noopener noreferrer"&gt;Testing the System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#troubleshooting" rel="noopener noreferrer"&gt;Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/shivamkapasia0/PermiForce#technical-details" rel="noopener noreferrer"&gt;Technical Details&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#system-architecture" rel="noopener noreferrer"&gt;System Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#pipeline-components" rel="noopener noreferrer"&gt;Pipeline Components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#pipeline-flow" rel="noopener noreferrer"&gt;Pipeline Flow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#environment-configuration" rel="noopener noreferrer"&gt;Environment Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#server-endpoints" rel="noopener noreferrer"&gt;Server Endpoints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#error-handling" rel="noopener noreferrer"&gt;Error Handling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#monitoring-and-logging" rel="noopener noreferrer"&gt;Monitoring and Logging&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#best-practices" rel="noopener noreferrer"&gt;Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#troubleshooting-guide" rel="noopener noreferrer"&gt;Troubleshooting Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/shivamkapasia0/PermiForce#use-cases" rel="noopener noreferrer"&gt;Use Cases&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/shivamkapasia0/PermiForce#core-use-cases" rel="noopener noreferrer"&gt;Core Use Cases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/shivamkapasia0/PermiForce#advanced-integration-scenarios" rel="noopener noreferrer"&gt;Advanced&lt;/a&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/shivamkapasia0/PermiForce" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;🛠️ &lt;strong&gt;Pipeline YAML Files:&lt;/strong&gt; &lt;a href="https://dev.azure.com/shivamsfdcwork/PermiForce/_git/PermiForce?path=/main-pipeline.yml&amp;amp;version=GBprod" rel="noopener noreferrer"&gt;Azure DevOps Repo&lt;/a&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://dev.azure.com/shivamsfdcwork/PermiForce/_git/PermiForce?version=GBprod" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;dev.azure.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; The GitHub repository contains comprehensive documentation and architectural details. The actual pipeline YAML configurations are maintained in the Azure DevOps repository.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🛤️ My Journey
&lt;/h2&gt;

&lt;p&gt;As a Salesforce developer, I've often encountered challenges where CI/CD pipelines lack granular permission controls. Traditional setups allow any developer to push changes to critical environments, posing significant risks.&lt;/p&gt;

&lt;p&gt;Through this project, I aimed to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enhance Security:&lt;/strong&gt; Implement a system where only authorized roles can approve and deploy changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leverage Policy-as-Code:&lt;/strong&gt; Utilize Permit.io to define and enforce access policies dynamically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improve Workflow:&lt;/strong&gt; Streamline the deployment process while maintaining strict access controls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Challenges Faced:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integrating Permit.io with Azure DevOps pipelines.&lt;/li&gt;
&lt;li&gt;Simulating different user roles within the pipeline.&lt;/li&gt;
&lt;li&gt;Handling API call failures gracefully within YAML scripts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Learnings:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The power of combining policy-as-code with CI/CD pipelines.&lt;/li&gt;
&lt;li&gt;Advanced YAML scripting techniques in Azure DevOps.&lt;/li&gt;
&lt;li&gt;The importance of dynamic access control in modern DevOps practices.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔐 Using Permit.io for Authorization
&lt;/h2&gt;

&lt;p&gt;To implement dynamic, fine-grained access control in our Azure DevOps pipelines, we integrated the &lt;strong&gt;Permit.io Node.js SDK&lt;/strong&gt;. This approach allowed us to perform real-time permission checks based on user roles and actions, ensuring that only authorized personnel can create or approve pull requests (PRs) to specific environments.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Integration Steps:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;SDK Installation&lt;/strong&gt;:
We began by installing the Permit.io SDK in our project:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npm &lt;span class="nb"&gt;install &lt;/span&gt;permitio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;SDK Initialization&lt;/strong&gt;:
In our pipeline scripts, we initialized the SDK using our Permit.io API token:
&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Permit&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;permitio&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;permit&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;Permit&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
     &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PERMIT_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="na"&gt;pdp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:7000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// URL of the local PDP (Policy Decision Point)&lt;/span&gt;
   &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: The &lt;code&gt;PERMIT_API_KEY&lt;/code&gt; is securely stored in Azure DevOps variable groups.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;User Context Capture&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
The pipeline captures the &lt;code&gt;user_name&lt;/code&gt; of the individual initiating the PR. This information is crucial for evaluating permissions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Permission Check&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Before proceeding with PR creation or approval, the pipeline invokes the &lt;code&gt;check&lt;/code&gt; method:&lt;br&gt;
&lt;/p&gt;&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;decision&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;permit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;resource&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;
&lt;code&gt;user_name&lt;/code&gt;: Email of the user initiating the action.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;action&lt;/code&gt;: The action being attempted (e.g., &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;approve&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resource&lt;/code&gt;: The target environment (e.g., &lt;code&gt;qa&lt;/code&gt;, &lt;code&gt;uat&lt;/code&gt;, &lt;code&gt;prod&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Decision Enforcement&lt;/strong&gt;:
Based on the response:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;If &lt;code&gt;decision.allow&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt;, the pipeline proceeds.&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;decision.allow&lt;/code&gt; is &lt;code&gt;false&lt;/code&gt;, the pipeline halts, and an error message is displayed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This integration ensures that PR operations are strictly governed by the defined policies in Permit.io, enhancing security and compliance in our CI/CD workflows.&lt;/p&gt;

&lt;h4&gt;
  
  
  Here is the link to our &lt;a href="https://dev.azure.com/shivamsfdcwork/PermiForce/_git/PermiForce?version=GBprod&amp;amp;path=/scripts/permit-server.js" rel="noopener noreferrer"&gt;permit-server.js&lt;/a&gt;
&lt;/h4&gt;




&lt;p&gt;Thank you for exploring &lt;strong&gt;PermiForce&lt;/strong&gt;! 🚀&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I had accidentally submitted this post from another account "shivamkapasia" earlier. It’s now correctly published here from my main Dev.to account "shivamkapasia0". Thanks for understanding!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Please do visit for &lt;strong&gt;Documentation &amp;amp; Overview:&lt;/strong&gt; &lt;a href="https://github.com/shivamkapasia0/PermiForce" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A special thanks to the Permit.io and dev.to teams for organizing this challenge and providing a platform to innovate in the realm of CI/CD security.&lt;/p&gt;

</description>
      <category>permitchallenge</category>
      <category>webdev</category>
      <category>programming</category>
      <category>azure</category>
    </item>
    <item>
      <title>🚀 Why I Switched from VSCode to CursorAI for Salesforce Development &amp; Personal Projects</title>
      <dc:creator>shivamkapasia0</dc:creator>
      <pubDate>Sun, 05 Jan 2025 06:04:41 +0000</pubDate>
      <link>https://dev.to/shivamkapasia0/why-i-switched-from-vscode-to-cursorai-for-salesforce-development-personal-projects-1j8n</link>
      <guid>https://dev.to/shivamkapasia0/why-i-switched-from-vscode-to-cursorai-for-salesforce-development-personal-projects-1j8n</guid>
      <description>&lt;p&gt;A s developers, we’re always striving for ways to code smarter, faster, and more efficiently. After using VSCode for years, I recently made the switch to CursorAI—and wow, what a difference it’s made! Whether it’s Salesforce development or my personal projects, CursorAI has been a game-changer. Let me explain why this tool is miles ahead of the competition and how it’s saving me HOURS every day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚡ AI-Driven Code Suggestions That Actually Make Sense&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Salesforce development can be complex—Apex classes, Lightning Web Components, and custom integrations require thoughtful coding and precision. CursorAI understands the context of your project and gives smart, intuitive code suggestions. It doesn’t just autocomplete—it knows what you need, based on the problem you’re solving.&lt;/p&gt;

&lt;p&gt;In Salesforce, where precision is key, CursorAI’s contextual AI helps me avoid the time spent hunting for the right syntax or solution. It learns from my coding patterns and grows smarter as I work, making suggestions that feel natural and spot-on. This level of personalized assistance? Unmatched by any other tool, including ChatGPT.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔥 Save Hours on Debugging and Fixing Errors&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s be real—debugging is a pain. CursorAI makes it easy by instantly identifying issues and offering potential fixes. With Salesforce, I deal with complex Apex logic that can be a headache to debug, but now I can fix problems in minutes instead of hours.&lt;/p&gt;

&lt;p&gt;Before switching to CursorAI, tasks like debugging Apex classes and troubleshooting LWCs often took me 4-5 hours. Now, I can do the same work in just 1 hour, thanks to CursorAI’s instant error handling and suggestions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⏱️ One Hour for What Used to Take 8&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On my personal projects outside Salesforce, CursorAI has been equally transformative. Writing complex algorithms or setting up large applications used to take 8 hours of my day. Now, with CursorAI’s fast AI assistance, I can complete those same tasks in under 1 hour. It’s like having a personal coding assistant that doesn’t tire out.&lt;/p&gt;

&lt;p&gt;The AI’s ability to understand your code and offer tailored solutions is what speeds up my workflow. It’s not just code completion—it’s code evolution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👥 Effortless Code Reviews and Collaboration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you’re collaborating with a team or working in an open-source environment, CursorAI shines with its auto code reviews. It provides actionable feedback, suggests refactors, and ensures your code is clean and follows best practices.&lt;/p&gt;

&lt;p&gt;What I love most is how seamless it is for collaboration—whether you’re reviewing a teammate’s code or working on your own, CursorAI brings intelligent insights right to your editor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚀 Final Thoughts: Why CursorAI is the Future of Coding&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Switching from VSCode to CursorAI has been one of the best decisions I’ve made for both my Salesforce projects and personal work. The speed, intelligence, and contextual understanding that CursorAI brings to the table is unmatched. Tasks that would have taken me 8 hours can now be done in just 1 hour, and the quality of my work has improved.&lt;/p&gt;

&lt;p&gt;If you’re still on the fence, I highly recommend giving CursorAI a try. It’s more than just an IDE—it’s an AI-powered coding assistant that’s making development faster and more efficient for thousands of developers. Trust me, once you try it, you’ll wonder how you ever lived without it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💬 Let’s Talk!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Have you tried CursorAI yet? How has it changed your coding workflow? Drop a comment below and let’s discuss how AI is shaping the future of software development! 👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>development</category>
    </item>
    <item>
      <title>🚀 My First Chrome Extension: Export &amp; Import Salesforce Dependent Picklist Values with Ease! 🎉</title>
      <dc:creator>shivamkapasia0</dc:creator>
      <pubDate>Sat, 28 Dec 2024 12:07:23 +0000</pubDate>
      <link>https://dev.to/shivamkapasia0/my-first-chrome-extension-export-import-salesforce-dependent-picklist-values-with-ease-2cb</link>
      <guid>https://dev.to/shivamkapasia0/my-first-chrome-extension-export-import-salesforce-dependent-picklist-values-with-ease-2cb</guid>
      <description>&lt;p&gt;Hey, Dev Community! 🙌&lt;/p&gt;

&lt;p&gt;I’m thrilled to share my very first Chrome extension that aims to simplify working with Salesforce dependent picklists. Introducing Salesforce Dependent Picklist Exporter &amp;amp; Importer! 🛠️&lt;/p&gt;

&lt;p&gt;Why I Built It:&lt;br&gt;
As a Salesforce user, I know how tricky it can be to manage dependent picklist values—whether exporting them for analysis or importing them into Salesforce. To make life easier, I built a tool that does both!&lt;/p&gt;

&lt;p&gt;What it Does:&lt;br&gt;
    • Export dependent picklist values from Salesforce directly into a CSV file.&lt;br&gt;
    • Import CSV values back into Salesforce, saving you time and hassle when dealing with large data sets.&lt;br&gt;
    • Streamlines your workflow with easy-to-use functionality.&lt;/p&gt;

&lt;p&gt;How It Works:&lt;br&gt;
    1.  Export: Log in to Salesforce, click the extension icon, and export the picklist values to a CSV file.&lt;br&gt;
    2.  Import: If you have a CSV file with new picklist values, simply import them back into Salesforce through the extension.&lt;/p&gt;

&lt;p&gt;No more manual copy-pasting or headaches managing picklist values! 🚀&lt;/p&gt;

&lt;p&gt;👉 Check out the extension here: &lt;a href="https://chromewebstore.google.com/detail/salesforce-dependent-pick/cjfgpeakgpojmkogpkhpnkkneffcoobh?hl=en&amp;amp;authuser=0" rel="noopener noreferrer"&gt;Salesforce Dependent Picklist Import/Export&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why You’ll Love It:&lt;br&gt;
    • Simplicity: Just install the extension and start exporting/importing values with a click.&lt;br&gt;
    • Efficiency: No more tedious manual entry or handling—automate the process.&lt;br&gt;
    • Free to Use: A straightforward tool to make Salesforce management a breeze, without any hidden charges.&lt;/p&gt;

&lt;p&gt;I’m excited to hear your feedback and any suggestions for improvements. Let’s make it even better together! 🚀&lt;/p&gt;

&lt;h1&gt;
  
  
  salesforce #chrome #development
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>salesforce</category>
    </item>
    <item>
      <title>Var, Let, and Const</title>
      <dc:creator>shivamkapasia0</dc:creator>
      <pubDate>Sun, 16 Jan 2022 09:28:01 +0000</pubDate>
      <link>https://dev.to/shivamkapasia0/var-let-and-const-1h5g</link>
      <guid>https://dev.to/shivamkapasia0/var-let-and-const-1h5g</guid>
      <description>&lt;h1&gt;
  
  
  var vs let vs const
&lt;/h1&gt;

&lt;p&gt;In this article, we'll discuss &lt;code&gt;var&lt;/code&gt;, &lt;code&gt;let&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt; with respect to their scope, use, and hoisting.&lt;br&gt;
In javascript, you can create/declare variables using keywords var, let and const.&lt;/p&gt;

&lt;p&gt;Lets see the differences between these keywords to have a better understanding of what to use when.&lt;/p&gt;
&lt;h1&gt;
  
  
  &lt;strong&gt;Scope&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Scope essentially means where these variables are available for use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There are two types of scopes in JS:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Function Scope:&lt;/strong&gt; Visibility is limited to the function.
&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="nf"&gt;scopeFn&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;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&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="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//prints 10  &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="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ReferenceError: num is not defined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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="nf"&gt;scopeFn&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;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&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="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="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&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="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//prints 100  &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="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//prints 100  &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="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// ReferenceError: num is not defined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Block Scope:&lt;/strong&gt; Visibility is limited to the block of code.
&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;let&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&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="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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&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="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//prints 10  &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="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// prints 20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now, that we have idea of scope. We can discuss the scope of var, let and const.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  var declarations are function scoped.&lt;/li&gt;
&lt;li&gt;  let declarations are block scoped.&lt;/li&gt;
&lt;li&gt;  const declarations are block scoped.
## &lt;strong&gt;Redefining and Redeclaring feature&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A variable declared using ‘var’ can be redefined and even redeclared    anywhere throughout its scope.&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="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&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="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//prints 30  &lt;/span&gt;
 &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//redefining or re-assigning (works without any error)  &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;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//prints "Hi"  &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&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="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//prints 10  &lt;/span&gt;
 &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//Redeclaring (works without any error)  &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;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;//Prints "Hello"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;A variable declared using ‘let’ can be redefined within its scope but cannot be re-declared within its scope.&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;11&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="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//prints 11  &lt;/span&gt;
&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IB&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//works without any error  &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;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//prints "IB"  &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&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="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//prints 12  &lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Scaler&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// error: Identifier y has already been declared  &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&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="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;  
 &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Fun&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//works without any error as scope is different.  &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;z&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;//prints "Fun"  &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="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;//prints 13&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;A variable declared using ‘const’ cannot be redefined or re-declared within its scope.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&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="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//prints 10  &lt;/span&gt;
&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// error: Assignment to constant variable.  &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="nx"&gt;y&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;span class="c1"&gt;//error  &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&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="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;//prints 12  &lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// error: Identifier 'y' has already been declared&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; : Every const declaration must be initialized at the time of declaration.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Hoisting&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Hoisting is a mechanism where variables and function declarations are moved to the top of their scope before code execution.&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;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;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// prints undefined  &lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&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="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//prints 100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;  Variables declared using var are hoisted to the top of their scope and initialized with a value of undefined(special type).&lt;/li&gt;
&lt;li&gt;  Variables declared using let are hoisted to the top of their scope but are not initialized with any value.&lt;/li&gt;
&lt;li&gt;  Variables declared using const are hoisted to the top of their scope but are not initialized with any value.
&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="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;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// prints undefined  &lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&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="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//prints 100  &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//Reference error  &lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&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="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//prints 200  &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//Reference error  &lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300&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="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//prints 300&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Summary:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;var&lt;/code&gt;  declarations are globally scoped or function scoped while  &lt;code&gt;let&lt;/code&gt;  and  &lt;code&gt;const&lt;/code&gt;  are block scoped.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;var&lt;/code&gt;  variables can be updated and re-declared within its scope;  &lt;code&gt;let&lt;/code&gt;  variables can be updated but not re-declared;  &lt;code&gt;const&lt;/code&gt;  variables can neither be updated nor re-declared.&lt;/li&gt;
&lt;li&gt;  They are all hoisted to the top of their scope. But while  &lt;code&gt;var&lt;/code&gt;  variables are initialized with  &lt;code&gt;undefined&lt;/code&gt;,  &lt;code&gt;let&lt;/code&gt;  and  &lt;code&gt;const&lt;/code&gt;  variables are not initialized.&lt;/li&gt;
&lt;li&gt;  While  &lt;code&gt;var&lt;/code&gt;  and  &lt;code&gt;let&lt;/code&gt;  can be declared without being initialized,  &lt;code&gt;const&lt;/code&gt;  must be initialized during declaration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now we have understood the main difference between &lt;code&gt;let&lt;/code&gt;, &lt;code&gt;var&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's predict the output for the following code in the comments:&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="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&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;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&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="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Got any question or additions? Please let me know.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thank you for reading :)&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Generate Badges for your awesome Markdown</title>
      <dc:creator>shivamkapasia0</dc:creator>
      <pubDate>Sun, 31 Oct 2021 11:25:01 +0000</pubDate>
      <link>https://dev.to/shivamkapasia0/generate-badges-for-your-awesome-markdown-4kh0</link>
      <guid>https://dev.to/shivamkapasia0/generate-badges-for-your-awesome-markdown-4kh0</guid>
      <description>&lt;p&gt;Generating badges for your markdown is pretty simple, i've made a tool that can generate badges for your markdown.&lt;/p&gt;

&lt;p&gt;Simply visit : &lt;a href="https://shivamkapasia-developer-edition.ap16.force.com/Badges4Me/s/" rel="noopener noreferrer"&gt;https://shivamkapasia-developer-edition.ap16.force.com/Badges4Me/s/&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Use
&lt;/h1&gt;

&lt;p&gt;Just write select logo name and color and your badge will be instantly ready and just copy the code by pressing the icon right to the badge and paste into your markdown.&lt;br&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%2F7bosfwfpsl0np2hc91co.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%2F7bosfwfpsl0np2hc91co.png" alt="Image description" width="800" height="263"&gt;&lt;/a&gt;&lt;br&gt;
 you can simple tap &lt;code&gt;copy to clipboard&lt;/code&gt; icon under the icon and simply paste it in your markdown.&lt;br&gt;
 just like below badge.&lt;/p&gt;

&lt;p&gt;You can also visit the repo : &lt;a href="https://github.com/shivamkapasia0/Github-Badge-Generator" rel="noopener noreferrer"&gt;https://github.com/shivamkapasia0/Github-Badge-Generator&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/shivamkapasia0" rel="noopener noreferrer"&gt;&lt;img alt="github" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fgithub-100000%3Fstyle%3Dfor-the-badge%26logo%3Dgithub%26logoColor%3Dwhite%26labelColor%3Dblack%26color%3Dblack" width="107" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>badges</category>
      <category>github</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Run JS directly from the browser</title>
      <dc:creator>shivamkapasia0</dc:creator>
      <pubDate>Sun, 31 Oct 2021 08:35:52 +0000</pubDate>
      <link>https://dev.to/shivamkapasia0/run-js-directly-from-browser-4omg</link>
      <guid>https://dev.to/shivamkapasia0/run-js-directly-from-browser-4omg</guid>
      <description>&lt;p&gt;&lt;strong&gt;Hey folks!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes when working on large project we need to check if this piece of code will work what it says or not and we can't debug in our project as it will take time to debug, In this case some dev use online js compiler or other editors/IDE but you can run &lt;code&gt;javascript&lt;/code&gt; directly from your browser and also save code for your future use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 :&lt;/strong&gt; Right click in browser and click on inspect.&lt;br&gt;
&lt;strong&gt;Step 2 :&lt;/strong&gt; Click the &lt;strong&gt;Sources&lt;/strong&gt; tab to open the &lt;strong&gt;Sources&lt;/strong&gt; panel. The &lt;strong&gt;Page&lt;/strong&gt; pane usually opens by default.&lt;br&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%2Fof5yj0c8gy7pfvbmjphj.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%2Fof5yj0c8gy7pfvbmjphj.png" alt="Image description" width="800" height="273"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Step 3 :&lt;/strong&gt; Click the  &lt;strong&gt;Snippets&lt;/strong&gt;  tab to open the  &lt;strong&gt;Snippets&lt;/strong&gt;  pane. You might need to click  &lt;strong&gt;More Tabs&lt;/strong&gt;  &amp;gt;&amp;gt; in order to access the  &lt;strong&gt;Snippets&lt;/strong&gt;  option.&lt;br&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%2F9u7lb1elz3p45e1aesxg.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%2F9u7lb1elz3p45e1aesxg.png" alt="Image description" width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Open the Snippets pane
&lt;/h2&gt;

&lt;p&gt;The  &lt;strong&gt;Snippets&lt;/strong&gt;  pane lists your Snippets. When you want to edit a Snippet, you need to open it from the  &lt;strong&gt;Snippets&lt;/strong&gt;  pane.&lt;br&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%2Fcw9nl056abssicpdhbby.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%2Fcw9nl056abssicpdhbby.png" alt="Image description" width="800" height="238"&gt;&lt;/a&gt;&lt;br&gt;
press &lt;strong&gt;Control+Enter&lt;/strong&gt; or Command+Enter (Mac).&lt;/p&gt;

&lt;h2&gt;
  
  
  Rename Snippets
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; &lt;a href="https://developer.chrome.com/docs/devtools/javascript/snippets/#open" rel="noopener noreferrer"&gt;Open the  &lt;strong&gt;Snippets&lt;/strong&gt;  pane&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt; Right-click the Snippet name and select  &lt;strong&gt;Rename&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Delete Snippets
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; &lt;a href="https://developer.chrome.com/docs/devtools/javascript/snippets/#open" rel="noopener noreferrer"&gt;Open the  &lt;strong&gt;Snippets&lt;/strong&gt;  pane&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt; Right-click the Snippet name and select  &lt;strong&gt;Remove&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://developer.chrome.com/docs/devtools/javascript/snippets/#open" rel="noopener noreferrer"&gt;More details on snippets here.&lt;/a&gt;&lt;/p&gt;



&lt;center&gt;
&lt;br&gt;
&lt;em&gt;What's your thought on this ?&lt;/em&gt;&lt;br&gt;
&lt;/center&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>View Github Repo Without Downloading in a Structured Manner!</title>
      <dc:creator>shivamkapasia0</dc:creator>
      <pubDate>Sun, 31 Oct 2021 06:24:52 +0000</pubDate>
      <link>https://dev.to/shivamkapasia0/view-github-repo-without-downloading-in-a-structured-manner-2745</link>
      <guid>https://dev.to/shivamkapasia0/view-github-repo-without-downloading-in-a-structured-manner-2745</guid>
      <description>&lt;p&gt;&lt;strong&gt;Hey folks!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm back with a time-saving tip, We all know that we can view our Github Repo code on GitHub but it is not convenient at all we have to move back and forth to view the code properly. So here is a simple trick to simply view your code in a structured manner without having to download the entire repo.&lt;br&gt;
Go to any github repo like: &lt;br&gt;
&lt;code&gt;https://github.com/shivamkapasia0/Github-Badge-Generator&lt;/code&gt;&lt;br&gt;
and  &lt;strong&gt;add &lt;code&gt;1s&lt;/code&gt; in between github and .com&lt;/strong&gt; and your link would become like &lt;code&gt;https://github1s.com/shivamkapasia0/Github-Badge-Generator&lt;/code&gt; &lt;br&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%2F9tjdn7tce6q2ouhgdyl4.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%2F9tjdn7tce6q2ouhgdyl4.png" alt="Image description" width="800" height="277"&gt;&lt;/a&gt;&lt;br&gt;
and &lt;strong&gt;hit enter to see the magic.&lt;/strong&gt;&lt;br&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%2F3aunl6srtcudo0ztnh8g.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%2F3aunl6srtcudo0ztnh8g.png" alt="Image description" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: This is not officialy supported by github. so it would be recommended to use this only on public repos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;what's your thought on this ?&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>String To Array In One Line : JavaScript</title>
      <dc:creator>shivamkapasia0</dc:creator>
      <pubDate>Sun, 31 Oct 2021 05:43:31 +0000</pubDate>
      <link>https://dev.to/shivamkapasia0/string-to-array-in-one-line-javascript-51ek</link>
      <guid>https://dev.to/shivamkapasia0/string-to-array-in-one-line-javascript-51ek</guid>
      <description>&lt;p&gt;Hey folks!&lt;br&gt;
we can easily convert String into an array by using &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax" rel="noopener noreferrer"&gt;spread operator&lt;/a&gt; &lt;code&gt;(...)&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;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Shivam Kapasia&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;array&lt;/span&gt; &lt;span class="o"&gt;=&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="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;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;array&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="c1"&gt;// S,h,i,v,a,m, ,K,a,p,a,s,i,a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note : The array will also include space, but if you don't want to store space in array first remove space from string then use spread operator.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;What’s your preferred way to convert string into an array ?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Swap two variables without a 3rd : JavaScript</title>
      <dc:creator>shivamkapasia0</dc:creator>
      <pubDate>Sun, 31 Oct 2021 04:50:39 +0000</pubDate>
      <link>https://dev.to/shivamkapasia0/lwc-apex-salesforcee-47di</link>
      <guid>https://dev.to/shivamkapasia0/lwc-apex-salesforcee-47di</guid>
      <description>&lt;h2&gt;
  
  
  Destructuring assignment
&lt;/h2&gt;

&lt;p&gt;Destructuring assignment (a feature of &lt;a href="https://en.wikipedia.org/wiki/ECMAScript#6th_Edition_-_ECMAScript_2015" rel="noopener noreferrer"&gt;ES2015&lt;/a&gt;) lets you extract items of an array into variables.&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;let&lt;/span&gt; &lt;span class="nx"&gt;firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Shivam&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secondName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Kapasia&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;firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secondName&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;secondName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;firstName&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;firstName: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Kapasia&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;secondName: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;secondName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Shivam&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you can also swap two arrays like :&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;let&lt;/span&gt; &lt;span class="nx"&gt;array1&lt;/span&gt; &lt;span class="o"&gt;=&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="mi"&gt;2&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="nx"&gt;array2&lt;/span&gt; &lt;span class="o"&gt;=&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="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;array1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;array2&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;array2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;array1&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;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;array1&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="c1"&gt;// 3,4,5&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;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;array2&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="c1"&gt;// 1,2,3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I like the destructuring approach because it’s short and expressive: swapping is performed in just one statement. It works with any data type: numbers, strings, booleans, objects,arryas etc.&lt;/p&gt;

&lt;p&gt;I recommend swapping variables using a destructuring assignment for most of the cases.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What’s your preferred way to swap variables?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>100daysofcode</category>
      <category>coding</category>
    </item>
    <item>
      <title>Lwc -&gt; Apex : Salesforce</title>
      <dc:creator>shivamkapasia0</dc:creator>
      <pubDate>Sun, 24 Oct 2021 12:48:37 +0000</pubDate>
      <link>https://dev.to/shivamkapasia0/lwc-apex-salesforce-462j</link>
      <guid>https://dev.to/shivamkapasia0/lwc-apex-salesforce-462j</guid>
      <description>&lt;h3&gt;
  
  
  # Call Apex Methods Imperatively
&lt;/h3&gt;

&lt;p&gt;Call Apex Methods Imperatively is very simple :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Import Apex Method in js file like below format :&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;apexMethodName&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;@salesforce/apex/Namespace.ApexClassName.MethodName&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;&lt;strong&gt;example&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;getAccountList&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;@salesforce/apex/AccountHelperClass.getAccountList&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;&lt;strong&gt;2.&lt;/strong&gt; &lt;strong&gt;Call Apex Method as per your choice like below:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Here we are not passing any param to apex:&lt;/em&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;LightningElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;track&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;lwc&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="nx"&gt;getAccountList&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;@salesforce/apex/AccountHelperClass.getAccountList&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;  &lt;span class="k"&gt;default&lt;/span&gt;  &lt;span class="kd"&gt;class&lt;/span&gt;  &lt;span class="nc"&gt;IterationComp&lt;/span&gt;  &lt;span class="kd"&gt;extends&lt;/span&gt;  &lt;span class="nc"&gt;LightningElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;track&lt;/span&gt; &lt;span class="nx"&gt;accountList&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="nd"&gt;track&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="nf"&gt;loadAccountListData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="c1"&gt;// here we are not sending any params to apex.&lt;/span&gt;
 &lt;span class="c1"&gt;// but if apex method requires params then,&lt;/span&gt;
 &lt;span class="c1"&gt;// we can pass like getAccountList({paramName : valueToPass})&lt;/span&gt;
 &lt;span class="c1"&gt;// instead of  getAccountList()&lt;/span&gt;
        &lt;span class="nf"&gt;getAccountList&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="nx"&gt;result&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;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accountList&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;result&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="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&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;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;error&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;blockquote&gt;
&lt;p&gt;In above js code we have made a function &lt;code&gt;loadAccountListData()&lt;/code&gt; inside this we are calling our apex method &lt;code&gt;getAccountList&lt;/code&gt; from our Apex class &lt;code&gt;AccountHelperClass&lt;/code&gt; and storing result in our &lt;code&gt;accountList&lt;/code&gt; variable.&lt;/p&gt;

&lt;p&gt;Imperative way basically uses promise to return the data and if any error occurs, it will be catch by our &lt;code&gt;catch&lt;/code&gt; block.&lt;/p&gt;

&lt;p&gt;We are calling our apex method in js function, so that we can reuse it by calling the &lt;code&gt;this.loadAccountListData()&lt;/code&gt; function in any other js function. so we need to just call &lt;code&gt;this.loadAccountListData&lt;/code&gt; to call the apex if we want to, or you can simple use &lt;code&gt;getAccountList()&lt;/code&gt; function in other function.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Apex Class :&lt;/strong&gt;
In Imperative way, the &lt;code&gt;cacheable=true&lt;/code&gt; is not required and thus it gives the ability to mutate the data inside apex method. But we can use it.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AccountHelperClass&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@AuraEnabled&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Account&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getAccountList&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="no"&gt;SELECT&lt;/span&gt; &lt;span class="nc"&gt;Id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Name&lt;/span&gt; &lt;span class="no"&gt;FROM&lt;/span&gt; &lt;span class="nc"&gt;Account&lt;/span&gt; &lt;span class="o"&gt;];&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Passing params to apex :&lt;/strong&gt;
Suppose if apex require params to be passed like below apex method:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AccountHelperClass&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@AuraEnabled&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Account&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getAccountList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;searchKey&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;'%'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;searchKey&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sc"&gt;'%'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
            &lt;span class="no"&gt;SELECT&lt;/span&gt; &lt;span class="nc"&gt;Id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Name&lt;/span&gt; &lt;span class="no"&gt;FROM&lt;/span&gt; &lt;span class="nc"&gt;Account&lt;/span&gt; &lt;span class="no"&gt;WHERE&lt;/span&gt; &lt;span class="nc"&gt;Name&lt;/span&gt; &lt;span class="no"&gt;LIKE&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="no"&gt;WITH&lt;/span&gt; &lt;span class="no"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
        &lt;span class="o"&gt;];&lt;/span&gt;
    &lt;span class="o"&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 our js code would become 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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;LightningElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;track&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;lwc&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="nx"&gt;getAccountList&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;@salesforce/apex/AccountHelperClass.getAccountList&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;  &lt;span class="k"&gt;default&lt;/span&gt;  &lt;span class="kd"&gt;class&lt;/span&gt;  &lt;span class="nc"&gt;IterationComp&lt;/span&gt;  &lt;span class="kd"&gt;extends&lt;/span&gt;  &lt;span class="nc"&gt;LightningElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;track&lt;/span&gt; &lt;span class="nx"&gt;accountList&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="nd"&gt;track&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="nf"&gt;loadAccountListData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shivam&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nf"&gt;getAccountList&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;searchKey&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;key&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="nx"&gt;result&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;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accountList&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;result&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="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&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;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;error&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;blockquote&gt;
&lt;p&gt;we can call &lt;code&gt;loadAccountListData()&lt;/code&gt; function on &lt;code&gt;onclick()&lt;/code&gt;in html or if you want to call apex when the components load you can simply call in &lt;code&gt;connectedCallBack()&lt;/code&gt; function.&lt;/p&gt;
&lt;h3&gt;
  
  
  Calling Apex on Loading of Component :
&lt;/h3&gt;

&lt;p&gt;To get data from apex whenever components load we can simply use &lt;code&gt;connectedCallback()&lt;/code&gt; like below :&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;LightningElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;track&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;lwc&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="nx"&gt;getAccountList&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;@salesforce/apex/AccountHelperClass.getAccountList&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;  &lt;span class="k"&gt;default&lt;/span&gt;  &lt;span class="kd"&gt;class&lt;/span&gt;  &lt;span class="nc"&gt;IterationComp&lt;/span&gt;  &lt;span class="kd"&gt;extends&lt;/span&gt;  &lt;span class="nc"&gt;LightningElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;track&lt;/span&gt; &lt;span class="nx"&gt;accountList&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="nd"&gt;track&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;// it runs whenever components loaded into DOM&lt;/span&gt;
&lt;span class="nf"&gt;connectedCallback&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadAccountListData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

 &lt;span class="nf"&gt;loadAccountListData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shivam&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nf"&gt;getAccountList&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;searchKey&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;key&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="nx"&gt;result&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;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accountList&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;result&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="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&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;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;error&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;&lt;a href="https://dev.to/shivamkapasia0/series/15139"&gt;Keep following lwc series for upcoming blogs on lwc components,&lt;/a&gt;&lt;/p&gt;

</description>
      <category>salesforce</category>
      <category>apex</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
