<?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>Forem: Omar Dulaimi</title>
    <description>The latest articles on Forem by Omar Dulaimi (@omardulaimi).</description>
    <link>https://forem.com/omardulaimi</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%2F198488%2F8134e88b-e053-45c0-82a4-54190b3e1533.jpg</url>
      <title>Forem: Omar Dulaimi</title>
      <link>https://forem.com/omardulaimi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/omardulaimi"/>
    <language>en</language>
    <item>
      <title>I built FireScope: a Chrome DevTools panel for Firestore (open-source)</title>
      <dc:creator>Omar Dulaimi</dc:creator>
      <pubDate>Sat, 13 Sep 2025 13:53:15 +0000</pubDate>
      <link>https://forem.com/omardulaimi/i-built-firescope-a-chrome-devtools-panel-for-firestore-open-source-48g0</link>
      <guid>https://forem.com/omardulaimi/i-built-firescope-a-chrome-devtools-panel-for-firestore-open-source-48g0</guid>
      <description>&lt;p&gt;Hey folks 👋&lt;/p&gt;

&lt;p&gt;I’ve been using this little tool privately for about a year and finally shipped it: &lt;strong&gt;FireScope&lt;/strong&gt; — a &lt;strong&gt;Chrome DevTools panel for Firestore&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It watches your app’s Firestore traffic in real time, shows queries/params at a glance, and lets you export code (Angular/Node/Flutter/JSON). &lt;strong&gt;No setup&lt;/strong&gt; — install it and open &lt;strong&gt;DevTools → FireScope&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chrome Web Store:&lt;/strong&gt; &lt;a href="https://chromewebstore.google.com/detail/firescope/dpjiajgeckamnpncihnhldkehaghaffd" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/firescope/dpjiajgeckamnpncihnhldkehaghaffd&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub (open-source):&lt;/strong&gt; &lt;a href="https://github.com/omar-dulaimi/firescope" rel="noopener noreferrer"&gt;https://github.com/omar-dulaimi/firescope&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Live capture of Firestore requests (reads/writes/queries)
&lt;/li&gt;
&lt;li&gt;✅ Clear details: method, path, params, body
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;One-click export&lt;/strong&gt; to Angular / Node / Flutter / &lt;strong&gt;JSON&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Collections&lt;/strong&gt; view for quick navigation
&lt;/li&gt;
&lt;li&gt;✅ Lives in &lt;strong&gt;Chrome DevTools → FireScope&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🧩 Open-source — feedback &amp;amp; PRs welcome&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This fills a gap I kept hitting as a Firestore/Firebase dev: I want to &lt;strong&gt;see exactly what my app sends&lt;/strong&gt; and quickly prototype the same call in code.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Who is it for?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You debug Firestore a lot and want a focused view (not the noisy Network tab).
&lt;/li&gt;
&lt;li&gt;You share reproducible snippets with teammates.
&lt;/li&gt;
&lt;li&gt;You like pasting a ready export and tweaking it.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Screenshots
&lt;/h2&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%2Fj2kgac9y19xc167vo930.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%2Fj2kgac9y19xc167vo930.png" alt="FireScope panel with live Firestore request stream" width="800" height="312"&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%2Fhfkv7m9vjccot09rjxgj.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%2Fhfkv7m9vjccot09rjxgj.png" alt="Request details showing method, path, params, and body" width="800" height="305"&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%2Fq612sbmvkntrxozweqny.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%2Fq612sbmvkntrxozweqny.png" alt="Export menu with Angular/Node/Flutter/JSON options" width="800" height="220"&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%2F7vi30djxsco6a3clcfon.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%2F7vi30djxsco6a3clcfon.png" alt="Collections sidebar for quick navigation" width="800" height="405"&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%2Ffd0luimiy2i3waar0dfy.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%2Ffd0luimiy2i3waar0dfy.png" alt="Focused view of a Firestore query" width="800" height="231"&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%2F7aaoyhgwhzxcmx1kdr24.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%2F7aaoyhgwhzxcmx1kdr24.png" alt="Filtered list of requests while navigating the app" width="800" height="231"&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%2Fbfe4nsfel81w7msvpa1a.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%2Fbfe4nsfel81w7msvpa1a.png" alt="Parameters and payloads expanded" width="800" height="369"&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%2Fdw71guvh0mzqeibtpyo4.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%2Fdw71guvh0mzqeibtpyo4.png" alt="Exported code snippet preview" width="800" height="238"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install from the &lt;strong&gt;Chrome Web Store&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Open your app and press &lt;strong&gt;F12&lt;/strong&gt; for DevTools.
&lt;/li&gt;
&lt;li&gt;Switch to the &lt;strong&gt;“FireScope”&lt;/strong&gt; panel.
&lt;/li&gt;
&lt;li&gt;Interact with your app (reads/writes/queries).
&lt;/li&gt;
&lt;li&gt;Click any request for details or &lt;strong&gt;Export&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Not seeing anything? Trigger a Firestore action (load a page that reads data or press a button that writes).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What you can export
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Angular&lt;/strong&gt; (service-friendly snippets)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node&lt;/strong&gt; (server-side helpers)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flutter&lt;/strong&gt; (Dart snippets)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON&lt;/strong&gt; (raw shape you can keep in docs/tests)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exports are a &lt;strong&gt;starting point&lt;/strong&gt; you paste and tweak.&lt;/p&gt;




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

&lt;p&gt;FireScope runs fully in your browser. It inspects your tab’s Firestore network activity via DevTools — &lt;strong&gt;no servers, no tracking&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FireScope panel missing?&lt;/strong&gt; Close/reopen DevTools, then reload the page.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Empty list?&lt;/strong&gt; Perform an action that hits Firestore (read/write/query).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Still stuck?&lt;/strong&gt; Open an issue on GitHub with a short repro.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Roadmap / Ideas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;More export targets (React, Svelte, Next.js server actions, etc.)
&lt;/li&gt;
&lt;li&gt;Filters &amp;amp; search, pin a session
&lt;/li&gt;
&lt;li&gt;“Copy as test” templates
&lt;/li&gt;
&lt;li&gt;Shortcuts and better empty states&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Have an idea? Drop an issue on GitHub.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links &amp;amp; Feedback
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Install:&lt;/strong&gt; &lt;a href="https://chromewebstore.google.com/detail/firescope/dpjiajgeckamnpncihnhldkehaghaffd" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/firescope/dpjiajgeckamnpncihnhldkehaghaffd&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://github.com/omar-dulaimi/firescope" rel="noopener noreferrer"&gt;https://github.com/omar-dulaimi/firescope&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’d love your thoughts. Try it on a real project, tell me what’s missing, and if you hit any rough edges, please open an issue. PRs are super welcome 🙏&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>firestore</category>
      <category>firebase</category>
      <category>chrome</category>
      <category>opensource</category>
    </item>
    <item>
      <title>DRZL — Adapter‑based codegen for Drizzle ORM (oRPC routers, services, and validators)</title>
      <dc:creator>Omar Dulaimi</dc:creator>
      <pubDate>Sun, 07 Sep 2025 00:46:34 +0000</pubDate>
      <link>https://forem.com/omardulaimi/drzl-adapter-based-codegen-for-drizzle-orm-orpc-routers-services-and-validators-1fjp</link>
      <guid>https://forem.com/omardulaimi/drzl-adapter-based-codegen-for-drizzle-orm-orpc-routers-services-and-validators-1fjp</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: DRZL is a developer toolkit for &lt;strong&gt;Drizzle ORM&lt;/strong&gt;. It &lt;strong&gt;analyzes&lt;/strong&gt; your schema and &lt;strong&gt;generates&lt;/strong&gt; router code (adapter‑based), &lt;strong&gt;typed services&lt;/strong&gt;, and &lt;strong&gt;runtime validators&lt;/strong&gt; (Zod/Valibot/ArkType). It’s template‑driven, so you can swap adapters (currently oRPC) and grow into tRPC/Express/Nest/Next.js‑style stacks with custom templates.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is DRZL?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DRZL&lt;/strong&gt; is an adapter‑agnostic code generation toolchain for Drizzle ORM. It consists of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Analyzer&lt;/strong&gt; — normalizes your Drizzle schema into a portable &lt;strong&gt;Analysis&lt;/strong&gt; that generators can consume.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generators&lt;/strong&gt; — build reusable code from the Analysis:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Routers (adapter‑based)&lt;/strong&gt; — currently ships with &lt;strong&gt;oRPC&lt;/strong&gt;, with templates for different styles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation&lt;/strong&gt; — &lt;strong&gt;Zod&lt;/strong&gt;, &lt;strong&gt;Valibot&lt;/strong&gt;, and &lt;strong&gt;ArkType&lt;/strong&gt; schemas (insert/update/select) + index barrel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service&lt;/strong&gt; — typed services that can be Drizzle‑aware or stubbed.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Templates&lt;/strong&gt; — swap or customize router implementations (standard/minimal, oRPC + Service, or your own).&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;👉 Docs &amp;amp; examples: &lt;a href="https://use-drzl.github.io/drzl/" rel="noopener noreferrer"&gt;https://use-drzl.github.io/drzl/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Quickstart
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) Install the CLI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add &lt;span class="nt"&gt;-D&lt;/span&gt; @drzl/cli
&lt;span class="c"&gt;# npm i -D @drzl/cli&lt;/span&gt;
&lt;span class="c"&gt;# yarn add -D @drzl/cli&lt;/span&gt;
&lt;span class="c"&gt;# bun add -d @drzl/cli&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2) Add a single config (oRPC + Zod + Service)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// drzl.config.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&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;@drzl/cli/config&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="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/db/schemas/index.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;outDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;generators&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;// 1) Zod validators&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;zod&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/validators/zod&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;schemaSuffix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Schema&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="c1"&gt;// 2) Routers (oRPC adapter), reusing Zod schemas&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;orpc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@drzl/template-orpc-service&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;includeRelations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;outputHeader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;validation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;useShared&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;library&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;zod&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;importPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/validators/zod&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;schemaSuffix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Schema&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="c1"&gt;// 3) Typed services (Drizzle‑aware or stub)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;service&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/services&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;dataAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;drizzle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// or 'stub'&lt;/span&gt;
      &lt;span class="na"&gt;dbImportPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/db/connection&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;schemaImportPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/db/schemas&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3) Install the generators/template you reference
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add &lt;span class="nt"&gt;-D&lt;/span&gt; @drzl/generator-zod @drzl/generator-service @drzl/template-orpc-service
&lt;span class="c"&gt;# If you prefer Valibot or ArkType:&lt;/span&gt;
&lt;span class="c"&gt;# pnpm add -D @drzl/generator-valibot @drzl/generator-service @drzl/template-orpc-service&lt;/span&gt;
&lt;span class="c"&gt;# pnpm add -D @drzl/generator-arktype @drzl/generator-service @drzl/template-orpc-service&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;The &lt;strong&gt;oRPC generator&lt;/strong&gt; ships with the CLI. Validation + Service generators are separate packages so you install only what you use.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4) Generate
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm drzl generate &lt;span class="nt"&gt;-c&lt;/span&gt; drzl.config.ts
&lt;span class="c"&gt;# npx drzl generate -c drzl.config.ts&lt;/span&gt;
&lt;span class="c"&gt;# yarn drzl generate -c drzl.config.ts&lt;/span&gt;
&lt;span class="c"&gt;# bunx drzl generate -c drzl.config.ts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This writes validators to &lt;code&gt;src/validators/*&lt;/code&gt;, routers to &lt;code&gt;src/api&lt;/code&gt;, and services to &lt;code&gt;src/services&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  (Optional) Watch mode
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm drzl watch &lt;span class="nt"&gt;-c&lt;/span&gt; drzl.config.ts &lt;span class="nt"&gt;--pipeline&lt;/span&gt; all &lt;span class="nt"&gt;--debounce&lt;/span&gt; 200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  (Optional) No‑config oRPC quickstart
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm dlx drzl generate:orpc src/db/schemas/index.ts &lt;span class="nt"&gt;-o&lt;/span&gt; src/api &lt;span class="nt"&gt;--template&lt;/span&gt; standard &lt;span class="nt"&gt;--includeRelations&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Adapter‑based by design
&lt;/h2&gt;

&lt;p&gt;DRZL is &lt;strong&gt;adapter‑agnostic&lt;/strong&gt;: router generation is driven by small, composable &lt;strong&gt;templates&lt;/strong&gt;. Today it targets &lt;strong&gt;oRPC&lt;/strong&gt;. You can write your own templates to target other stacks (tRPC, Express, NestJS, Next.js, Prisma, etc.), or use community/premium templates as they become available.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Templates&lt;/strong&gt; define file paths, exported names, imports/prelude, and the code for each procedure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation reuse&lt;/strong&gt;: generators can wire shared Zod/Valibot/ArkType schemas into handlers (inputs/outputs).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typed outputs&lt;/strong&gt;: the generator adds &lt;code&gt;.output(...)&lt;/code&gt; typing where applicable.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Relations&lt;/strong&gt; example — relation‑aware generation patterns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation mix&lt;/strong&gt; — reuse shared validators across routers/services.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(See the site for live examples and code.)&lt;/p&gt;




&lt;h2&gt;
  
  
  Licenses &amp;amp; ownership
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You &lt;strong&gt;own the generated output&lt;/strong&gt; — use/modify/distribute under your project’s license.&lt;/li&gt;
&lt;li&gt;A short output header is added by default; you can disable (&lt;code&gt;outputHeader.enabled = false&lt;/code&gt;) or customize it.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Roadmap &amp;amp; support
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;More &lt;strong&gt;adapter templates&lt;/strong&gt; (community + premium) for deeper integrations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom templates&lt;/strong&gt; available as a paid service if you need a specific stack/pattern.&lt;/li&gt;
&lt;li&gt;DRZL is open‑core; contributions, issues, and stars are welcome.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;—&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docs: &lt;a href="https://use-drzl.github.io/drzl/" rel="noopener noreferrer"&gt;https://use-drzl.github.io/drzl/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Getting Started: &lt;a href="https://use-drzl.github.io/drzl/guide/getting-started.html" rel="noopener noreferrer"&gt;https://use-drzl.github.io/drzl/guide/getting-started.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CLI Overview: &lt;a href="https://use-drzl.github.io/drzl/cli.html" rel="noopener noreferrer"&gt;https://use-drzl.github.io/drzl/cli.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Generators: oRPC, Service, Zod, Valibot, ArkType
&lt;/li&gt;
&lt;li&gt;Templates: Standard, oRPC + Service, Custom
&lt;/li&gt;
&lt;li&gt;Adapters: Overview &amp;amp; Router Adapters
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you ship something with DRZL, I’d love to see it!&lt;/p&gt;

</description>
      <category>drizzle</category>
      <category>typescript</category>
      <category>node</category>
      <category>codegeneration</category>
    </item>
    <item>
      <title>Stop losing your breakpoints: Meet Breakpoint Bookmarks for VS Code</title>
      <dc:creator>Omar Dulaimi</dc:creator>
      <pubDate>Fri, 22 Aug 2025 11:20:25 +0000</pubDate>
      <link>https://forem.com/omardulaimi/stop-losing-your-breakpoints-meet-breakpoint-bookmarks-for-vs-code-3c4b</link>
      <guid>https://forem.com/omardulaimi/stop-losing-your-breakpoints-meet-breakpoint-bookmarks-for-vs-code-3c4b</guid>
      <description>&lt;p&gt;If you've ever stopped mid‑debug to chase a different bug, you know the pain: you come back and all your carefully placed breakpoints are gone. You try to remember where they were, what conditions you had, which logs you set… and momentum dies.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Breakpoint Bookmarks&lt;/strong&gt; to fix that. It lets you &lt;strong&gt;save&lt;/strong&gt; your current breakpoints to a named “flow”, &lt;strong&gt;switch&lt;/strong&gt; between flows instantly, and &lt;strong&gt;restore&lt;/strong&gt; everything exactly where it was—conditions, logpoints, function breakpoints and all.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;TL;DR — Install it, hit &lt;strong&gt;Save&lt;/strong&gt;, and stop babysitting your breakpoints.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Quick demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Save your current session&lt;/strong&gt;&lt;br&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%2Fx4juwskhd23cyu4jq55t.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4juwskhd23cyu4jq55t.gif" alt="Saving current breakpoints" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Load a saved flow&lt;/strong&gt;&lt;br&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%2Fxl4l6c734mdw8k2eisvg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxl4l6c734mdw8k2eisvg.gif" alt="Loading a saved flow" width="1296" height="682"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One‑click save &amp;amp; restore&lt;/strong&gt; of all your active breakpoints (source &amp;amp; function)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unlimited flows&lt;/strong&gt; — create one per bug, feature, or customer issue&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works with anything VS Code can debug&lt;/strong&gt; (JS/TS, Python, Java, C#, Go, Rust, PHP, Ruby…)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Friendly UI&lt;/strong&gt;: a dedicated sidebar with inline actions (Save, Load, Edit, Delete)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type‑safe &amp;amp; reliable&lt;/strong&gt;: built in TypeScript, tested, and cross‑platform&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Install (10 seconds)
&lt;/h2&gt;

&lt;p&gt;From the Command Palette (&lt;strong&gt;Ctrl/Cmd+P&lt;/strong&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ext install OmarDulaimi.breakpoint-bookmarks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or via CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;code &lt;span class="nt"&gt;--install-extension&lt;/span&gt; OmarDulaimi.breakpoint-bookmarks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Marketplace page: &lt;a href="https://marketplace.visualstudio.com/items?itemName=OmarDulaimi.breakpoint-bookmarks" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=OmarDulaimi.breakpoint-bookmarks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/omar-dulaimi/breakpoint-bookmarks" rel="noopener noreferrer"&gt;https://github.com/omar-dulaimi/breakpoint-bookmarks&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;

&lt;p&gt;1) &lt;strong&gt;Set up&lt;/strong&gt; your breakpoints as usual (conditions, hit counts, logpoints, function breakpoints—go wild).&lt;br&gt;&lt;br&gt;
2) Open the &lt;strong&gt;Breakpoint Bookmarks&lt;/strong&gt; view (Activity Bar → “Breakpoint Bookmarks”).&lt;br&gt;&lt;br&gt;
3) Click &lt;strong&gt;Save&lt;/strong&gt; to snapshot your current session to a named flow.&lt;br&gt;&lt;br&gt;
4) Later, click &lt;strong&gt;Load&lt;/strong&gt; on any flow to restore the entire session—exact lines, conditions, and messages.&lt;br&gt;&lt;br&gt;
5) Use &lt;strong&gt;Edit&lt;/strong&gt; to tweak the JSON by hand (power users, this is for you).&lt;br&gt;&lt;br&gt;
6) &lt;strong&gt;Delete&lt;/strong&gt; a flow when it’s no longer useful.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pro tip: Keep a “Happy‑path” flow you can load anytime you need a clean baseline.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Settings you might care about
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Settings → search for “breakpoint bookmark”&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="c1"&gt;// Use relative paths so flows work across machines &amp;amp; teammates&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"breakpointBookmark.useRelativePaths"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="c1"&gt;// When loading a flow, clear any pre‑existing breakpoints first&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"breakpointBookmark.clearPreviousBreakpoints"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="c1"&gt;// Pick a custom folder for the saved JSON files&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"breakpointBookmark.saveLocation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".vscode/breakpoint-flows"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Real‑world uses
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multiple parallel bugs&lt;/strong&gt; — keep one flow per issue, jump between them in seconds.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature flags &amp;amp; envs&lt;/strong&gt; — flows for “staging”, “canary”, “prod‑sim”.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding&lt;/strong&gt; — hand new folks a “Debug 101” flow for the codebase.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer escalations&lt;/strong&gt; — save the exact breakpoints used to reproduce a ticket.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pairing &amp;amp; reviews&lt;/strong&gt; — share a flow in the repo so everyone can follow the same trail.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What’s new lately
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Function breakpoints are fully supported (alongside file/line breakpoints)&lt;/li&gt;
&lt;li&gt;Cleaner sidebar UI with hover actions and a top‑bar &lt;strong&gt;Save&lt;/strong&gt; button&lt;/li&gt;
&lt;li&gt;Better Windows path handling and cross‑platform behavior&lt;/li&gt;
&lt;li&gt;Backward‑compatible with older bookmark files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(Changelog lives in the repo if you like the gory details.)&lt;/p&gt;




&lt;h2&gt;
  
  
  Roadmap — tell me what to ship next
&lt;/h2&gt;

&lt;p&gt;I have a few ideas cooking, but I’d rather build what &lt;em&gt;you&lt;/em&gt; need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shared/team flows out of the box (auto‑discover in workspace)&lt;/li&gt;
&lt;li&gt;Branch‑aware flows (auto‑switch based on current git branch)&lt;/li&gt;
&lt;li&gt;“Save only changes since last load”&lt;/li&gt;
&lt;li&gt;Diff/merge flows, and search across flows&lt;/li&gt;
&lt;li&gt;CLI to automate flows in CI/repros&lt;/li&gt;
&lt;li&gt;API for other extensions to read/write flows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Have a better idea? Open an issue or drop a comment — I read everything.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Issues &amp;amp; feature requests: &lt;a href="https://github.com/omar-dulaimi/breakpoint-bookmarks/issues" rel="noopener noreferrer"&gt;https://github.com/omar-dulaimi/breakpoint-bookmarks/issues&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pull requests welcome: &lt;a href="https://github.com/omar-dulaimi/breakpoint-bookmarks/pulls" rel="noopener noreferrer"&gt;https://github.com/omar-dulaimi/breakpoint-bookmarks/pulls&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  If this saves you time ❤️
&lt;/h2&gt;

&lt;p&gt;A star or review goes a long way. If it’s really helping your day‑to‑day, you can also sponsor development — even a tiny amount helps me ship faster and keep docs &amp;amp; fixes flowing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Sponsors: &lt;a href="https://github.com/sponsors/omar-dulaimi" rel="noopener noreferrer"&gt;https://github.com/sponsors/omar-dulaimi&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading — and happy debugging. If you write about how you’re using flows in your team, I’ll gladly link it from the repo.&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>python</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Full JavaScript Internationalization CheatSheet!</title>
      <dc:creator>Omar Dulaimi</dc:creator>
      <pubDate>Sun, 21 Aug 2022 19:33:00 +0000</pubDate>
      <link>https://forem.com/omardulaimi/full-javascript-internationalization-cheatsheet-3fo</link>
      <guid>https://forem.com/omardulaimi/full-javascript-internationalization-cheatsheet-3fo</guid>
      <description>&lt;p&gt;Did you know that 𝗝𝗮𝘃𝗮𝗦𝗰𝗿𝗶𝗽𝘁 can do 𝗶𝗻𝘁𝗲𝗿𝗻𝗮𝘁𝗶𝗼𝗻𝗮𝗹𝗶𝘇𝗮𝘁𝗶𝗼𝗻 𝗻𝗮𝘁𝗶𝘃𝗲𝗹𝘆 ?&lt;/p&gt;

&lt;p&gt;Well, this cheatsheet will help you discover and learn all about the different objects and constructors this global object(𝗜𝗻𝘁𝗹) provides.&lt;/p&gt;

&lt;p&gt;A lot of details can be found on the official docs, so be sure to check them out.&lt;/p&gt;

&lt;p&gt;Make sure to follow me for more, as I'm positive you liked my 𝗘𝗦𝟮𝟬𝟮𝟮 cheatsheet before.&lt;/p&gt;

&lt;p&gt;PDF Version Here: &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:6966873641892347904" rel="noopener noreferrer"&gt;https://www.linkedin.com/feed/update/urn:li:activity:6966873641892347904&lt;/a&gt;&lt;/p&gt;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>node</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to change access and modification times in Nodejs?</title>
      <dc:creator>Omar Dulaimi</dc:creator>
      <pubDate>Thu, 18 Aug 2022 13:05:17 +0000</pubDate>
      <link>https://forem.com/omardulaimi/how-to-change-access-and-modification-times-in-nodejs-4mm3</link>
      <guid>https://forem.com/omardulaimi/how-to-change-access-and-modification-times-in-nodejs-4mm3</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NEAMppL0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gz3pf4r34icazd3ehobz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NEAMppL0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gz3pf4r34icazd3ehobz.png" alt="utimes" width="880" height="1100"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to create symbolic links in Nodejs?</title>
      <dc:creator>Omar Dulaimi</dc:creator>
      <pubDate>Wed, 17 Aug 2022 19:31:35 +0000</pubDate>
      <link>https://forem.com/omardulaimi/how-to-create-symbolic-links-in-nodejs-3i3i</link>
      <guid>https://forem.com/omardulaimi/how-to-create-symbolic-links-in-nodejs-3i3i</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KEehLo94--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qj13xqc2z3v8d8240m5r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KEehLo94--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qj13xqc2z3v8d8240m5r.png" alt="symlinks in nodejs" width="880" height="1100"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to copy a file in Nodejs?</title>
      <dc:creator>Omar Dulaimi</dc:creator>
      <pubDate>Tue, 16 Aug 2022 13:26:26 +0000</pubDate>
      <link>https://forem.com/omardulaimi/how-to-copy-a-file-in-nodejs-52pl</link>
      <guid>https://forem.com/omardulaimi/how-to-copy-a-file-in-nodejs-52pl</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nBVdT-Zm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/28m6ss5vlkanhx6rttn8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nBVdT-Zm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/28m6ss5vlkanhx6rttn8.png" alt="copy a file in nodejs" width="880" height="1100"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>nodejstip</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How to append contents to a file in Nodejs?</title>
      <dc:creator>Omar Dulaimi</dc:creator>
      <pubDate>Mon, 15 Aug 2022 15:43:38 +0000</pubDate>
      <link>https://forem.com/omardulaimi/how-to-append-contents-to-a-file-in-nodejs-2fk6</link>
      <guid>https://forem.com/omardulaimi/how-to-append-contents-to-a-file-in-nodejs-2fk6</guid>
      <description>&lt;p&gt;How to append contents to a file in Nodejs?&lt;/p&gt;

&lt;p&gt;I hope you like the new format, it's so much more readable!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FxJz7rGP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uv3cvfjdsiqb1bwnmqup.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FxJz7rGP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uv3cvfjdsiqb1bwnmqup.png" alt="appendFile" width="880" height="1100"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>nodejstip</category>
      <category>javascript</category>
    </item>
    <item>
      <title>What is the best way to read directories in Nodejs?</title>
      <dc:creator>Omar Dulaimi</dc:creator>
      <pubDate>Sun, 14 Aug 2022 19:04:00 +0000</pubDate>
      <link>https://forem.com/omardulaimi/what-is-the-best-way-to-read-directories-in-nodejs-3le2</link>
      <guid>https://forem.com/omardulaimi/what-is-the-best-way-to-read-directories-in-nodejs-3le2</guid>
      <description>&lt;p&gt;Different ways to read directories in Nodejs!&lt;br&gt;
Which way do you use? Why?&lt;/p&gt;

&lt;p&gt;Let me know what you think in the comments&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a9Vri3H---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hnkak7kq73l1jtk95mwn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a9Vri3H---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hnkak7kq73l1jtk95mwn.png" alt="readdir vs opendir" width="880" height="1100"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Make sure to check my profile for more tips from the Nodejs world&lt;/p&gt;

</description>
      <category>node</category>
      <category>nodejstip</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to create unique temporary directories in Nodejs?</title>
      <dc:creator>Omar Dulaimi</dc:creator>
      <pubDate>Sat, 13 Aug 2022 21:48:21 +0000</pubDate>
      <link>https://forem.com/omardulaimi/how-to-create-unique-temporary-directories-in-nodejs-1n69</link>
      <guid>https://forem.com/omardulaimi/how-to-create-unique-temporary-directories-in-nodejs-1n69</guid>
      <description>&lt;p&gt;𝗡𝗼𝗱𝗲𝗷𝘀 provides an awesome method that lets you create unique temporary directories.&lt;/p&gt;

&lt;p&gt;This is really useful when you need to store some data temporarily then delete them later.&lt;/p&gt;

&lt;p&gt;𝗡𝗼𝗱𝗲𝗷𝘀 helps you further, by concatenating 6 unique characters to the 𝗽𝗿𝗲𝗳𝗶𝘅 you pick. This results in creating unique directories every single time without worrying about collisions.&lt;/p&gt;

&lt;p&gt;Library authors will benefit of this tip as well of course.&lt;/p&gt;

&lt;p&gt;Just make sure to avoid trailing 𝗫 characters in the 𝗽𝗿𝗲𝗳𝗶𝘅, due to some platform inconsistencies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fDUKJu3G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mczrpl6rh4rxc83ezcbf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fDUKJu3G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mczrpl6rh4rxc83ezcbf.png" alt="mkdtemp" width="880" height="652"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Did you learn something new today?&lt;/p&gt;

&lt;p&gt;Like and share this post, and follow me for more!&lt;/p&gt;

</description>
      <category>node</category>
      <category>nodejstip</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Full ES2022 Cheatsheet!</title>
      <dc:creator>Omar Dulaimi</dc:creator>
      <pubDate>Sat, 13 Aug 2022 00:46:00 +0000</pubDate>
      <link>https://forem.com/omardulaimi/full-es2022-cheatsheet-4m9l</link>
      <guid>https://forem.com/omardulaimi/full-es2022-cheatsheet-4m9l</guid>
      <description>&lt;p&gt;PDF version here(High Quality): &lt;a href="https://www.linkedin.com/posts/activity-6942202973657702401-ZX6Y" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/activity-6942202973657702401-ZX6Y&lt;/a&gt;&lt;/p&gt;

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

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

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

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

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7dxwg02hni2tlhx7kx7h.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7dxwg02hni2tlhx7kx7h.jpg" alt="top level await"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4uj8zy5ccof085ekxr7g.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4uj8zy5ccof085ekxr7g.jpg" alt="error cause example output"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6a2snhmp93507kmboan.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6a2snhmp93507kmboan.jpg" alt="regex match indices"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjtrcb8sit7dt5vh01vd3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjtrcb8sit7dt5vh01vd3.jpg" alt="static fields and methods"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faaloqbqq50055i9wq4a6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faaloqbqq50055i9wq4a6.jpg" alt="class static init blocks"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjmiptyoxa2nde06d23cp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjmiptyoxa2nde06d23cp.jpg" alt="brand checks for private fields"&gt;&lt;/a&gt;&lt;/p&gt;

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

</description>
      <category>javascript</category>
      <category>node</category>
      <category>webdev</category>
      <category>es2022</category>
    </item>
    <item>
      <title>How to change ownership of a file in Nodejs?</title>
      <dc:creator>Omar Dulaimi</dc:creator>
      <pubDate>Fri, 12 Aug 2022 23:36:00 +0000</pubDate>
      <link>https://forem.com/omardulaimi/how-to-change-ownership-of-a-file-in-nodejs-1fke</link>
      <guid>https://forem.com/omardulaimi/how-to-change-ownership-of-a-file-in-nodejs-1fke</guid>
      <description>&lt;p&gt;As for our last permissions and access related methods, today we talk about the 𝗰𝗵𝗼𝘄𝗻 method.&lt;/p&gt;

&lt;p&gt;It lets you change the ownership of a file. Just like you're used to on your terminal:&lt;/p&gt;

&lt;p&gt;𝗰𝗵𝗼𝘄𝗻 &amp;lt;𝗨𝘀𝗲𝗿&amp;gt;&amp;lt;:&amp;gt;&amp;lt;𝗚𝗿𝗼𝘂𝗽&amp;gt; &amp;lt;𝗙𝗶𝗹𝗲&amp;gt;&lt;/p&gt;

&lt;p&gt;𝗡𝗼𝗱𝗲𝗷𝘀 provides support for it natively; so you won't have to spawn a process to access this API.&lt;/p&gt;

&lt;p&gt;You can check the updated values with this basic list command:&lt;/p&gt;

&lt;p&gt;𝗹𝘀 -𝗹 &amp;lt;𝗙𝗜𝗟𝗘&amp;gt;&lt;/p&gt;

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




&lt;p&gt;Did you learn something new today?&lt;/p&gt;

&lt;p&gt;Like and share this post, and follow me for more!&lt;/p&gt;

</description>
      <category>node</category>
      <category>nodejstip</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
