{"@attributes":{"version":"2.0"},"channel":{"title":"DEV Community: Omar Dulaimi","description":"The latest articles on DEV Community by Omar Dulaimi (@omardulaimi).","link":"https:\/\/dev.to\/omardulaimi","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","title":"DEV Community: Omar Dulaimi","link":"https:\/\/dev.to\/omardulaimi"},"language":"en","item":[{"title":"I built FireScope: a Chrome DevTools panel for Firestore (open-source)","pubDate":"Sat, 13 Sep 2025 13:53:15 +0000","link":"https:\/\/dev.to\/omardulaimi\/i-built-firescope-a-chrome-devtools-panel-for-firestore-open-source-48g0","guid":"https:\/\/dev.to\/omardulaimi\/i-built-firescope-a-chrome-devtools-panel-for-firestore-open-source-48g0","description":"<p>Hey folks \ud83d\udc4b<\/p>\n\n<p>I\u2019ve been using this little tool privately for about a year and finally shipped it: <strong>FireScope<\/strong> \u2014 a <strong>Chrome DevTools panel for Firestore<\/strong>.<\/p>\n\n<p>It watches your app\u2019s Firestore traffic in real time, shows queries\/params at a glance, and lets you export code (Angular\/Node\/Flutter\/JSON). <strong>No setup<\/strong> \u2014 install it and open <strong>DevTools \u2192 FireScope<\/strong>.<\/p>\n\n<ul>\n<li>\n<strong>Chrome Web Store:<\/strong> <a href=\"https:\/\/chromewebstore.google.com\/detail\/firescope\/dpjiajgeckamnpncihnhldkehaghaffd\" rel=\"noopener noreferrer\">https:\/\/chromewebstore.google.com\/detail\/firescope\/dpjiajgeckamnpncihnhldkehaghaffd<\/a>\n<\/li>\n<li>\n<strong>GitHub (open-source):<\/strong> <a href=\"https:\/\/github.com\/omar-dulaimi\/firescope\" rel=\"noopener noreferrer\">https:\/\/github.com\/omar-dulaimi\/firescope<\/a>\n<\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  TL;DR\n<\/h2>\n\n<ul>\n<li>\u2705 Live capture of Firestore requests (reads\/writes\/queries)\n<\/li>\n<li>\u2705 Clear details: method, path, params, body\n<\/li>\n<li>\u2705 <strong>One-click export<\/strong> to Angular \/ Node \/ Flutter \/ <strong>JSON<\/strong>\n<\/li>\n<li>\u2705 <strong>Collections<\/strong> view for quick navigation\n<\/li>\n<li>\u2705 Lives in <strong>Chrome DevTools \u2192 FireScope<\/strong>\n<\/li>\n<li>\ud83e\udde9 Open-source \u2014 feedback &amp; PRs welcome<\/li>\n<\/ul>\n\n<blockquote>\n<p>This fills a gap I kept hitting as a Firestore\/Firebase dev: I want to <strong>see exactly what my app sends<\/strong> and quickly prototype the same call in code.<\/p>\n<\/blockquote>\n\n\n\n\n<h2>\n  \n  \n  Who is it for?\n<\/h2>\n\n<ul>\n<li>You debug Firestore a lot and want a focused view (not the noisy Network tab).\n<\/li>\n<li>You share reproducible snippets with teammates.\n<\/li>\n<li>You like pasting a ready export and tweaking it.<\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  Screenshots\n<\/h2>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n\n\n\n<h2>\n  \n  \n  Quick Start\n<\/h2>\n\n<ol>\n<li>Install from the <strong>Chrome Web Store<\/strong>.\n<\/li>\n<li>Open your app and press <strong>F12<\/strong> for DevTools.\n<\/li>\n<li>Switch to the <strong>\u201cFireScope\u201d<\/strong> panel.\n<\/li>\n<li>Interact with your app (reads\/writes\/queries).\n<\/li>\n<li>Click any request for details or <strong>Export<\/strong>.<\/li>\n<\/ol>\n\n<blockquote>\n<p>Not seeing anything? Trigger a Firestore action (load a page that reads data or press a button that writes).<\/p>\n<\/blockquote>\n\n\n\n\n<h2>\n  \n  \n  What you can export\n<\/h2>\n\n<ul>\n<li>\n<strong>Angular<\/strong> (service-friendly snippets)\n<\/li>\n<li>\n<strong>Node<\/strong> (server-side helpers)\n<\/li>\n<li>\n<strong>Flutter<\/strong> (Dart snippets)\n<\/li>\n<li>\n<strong>JSON<\/strong> (raw shape you can keep in docs\/tests)<\/li>\n<\/ul>\n\n<p>Exports are a <strong>starting point<\/strong> you paste and tweak.<\/p>\n\n\n\n\n<h2>\n  \n  \n  Privacy\n<\/h2>\n\n<p>FireScope runs fully in your browser. It inspects your tab\u2019s Firestore network activity via DevTools \u2014 <strong>no servers, no tracking<\/strong>.<\/p>\n\n\n\n\n<h2>\n  \n  \n  Troubleshooting\n<\/h2>\n\n<ul>\n<li>\n<strong>FireScope panel missing?<\/strong> Close\/reopen DevTools, then reload the page.\n<\/li>\n<li>\n<strong>Empty list?<\/strong> Perform an action that hits Firestore (read\/write\/query).\n<\/li>\n<li>\n<strong>Still stuck?<\/strong> Open an issue on GitHub with a short repro.<\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  Roadmap \/ Ideas\n<\/h2>\n\n<ul>\n<li>More export targets (React, Svelte, Next.js server actions, etc.)\n<\/li>\n<li>Filters &amp; search, pin a session\n<\/li>\n<li>\u201cCopy as test\u201d templates\n<\/li>\n<li>Shortcuts and better empty states<\/li>\n<\/ul>\n\n<p>Have an idea? Drop an issue on GitHub.<\/p>\n\n\n\n\n<h2>\n  \n  \n  Links &amp; Feedback\n<\/h2>\n\n<ul>\n<li>\n<strong>Install:<\/strong> <a href=\"https:\/\/chromewebstore.google.com\/detail\/firescope\/dpjiajgeckamnpncihnhldkehaghaffd\" rel=\"noopener noreferrer\">https:\/\/chromewebstore.google.com\/detail\/firescope\/dpjiajgeckamnpncihnhldkehaghaffd<\/a>\n<\/li>\n<li>\n<strong>Source:<\/strong> <a href=\"https:\/\/github.com\/omar-dulaimi\/firescope\" rel=\"noopener noreferrer\">https:\/\/github.com\/omar-dulaimi\/firescope<\/a>\n<\/li>\n<\/ul>\n\n<p>I\u2019d love your thoughts. Try it on a real project, tell me what\u2019s missing, and if you hit any rough edges, please open an issue. PRs are super welcome \ud83d\ude4f<\/p>\n\n<p>Thanks for reading!<\/p>\n\n","category":["firestore","firebase","chrome","opensource"]},{"title":"DRZL \u2014 Adapter\u2011based codegen for Drizzle ORM (oRPC routers, services, and validators)","pubDate":"Sun, 07 Sep 2025 00:46:34 +0000","link":"https:\/\/dev.to\/omardulaimi\/drzl-adapter-based-codegen-for-drizzle-orm-orpc-routers-services-and-validators-1fjp","guid":"https:\/\/dev.to\/omardulaimi\/drzl-adapter-based-codegen-for-drizzle-orm-orpc-routers-services-and-validators-1fjp","description":"<blockquote>\n<p><strong>TL;DR<\/strong>: DRZL is a developer toolkit for <strong>Drizzle ORM<\/strong>. It <strong>analyzes<\/strong> your schema and <strong>generates<\/strong> router code (adapter\u2011based), <strong>typed services<\/strong>, and <strong>runtime validators<\/strong> (Zod\/Valibot\/ArkType). It\u2019s template\u2011driven, so you can swap adapters (currently oRPC) and grow into tRPC\/Express\/Nest\/Next.js\u2011style stacks with custom templates.<\/p>\n<\/blockquote>\n\n<h2>\n  \n  \n  What is DRZL?\n<\/h2>\n\n<p><strong>DRZL<\/strong> is an adapter\u2011agnostic code generation toolchain for Drizzle ORM. It consists of:<\/p>\n\n<ul>\n<li>\n<strong>Analyzer<\/strong> \u2014 normalizes your Drizzle schema into a portable <strong>Analysis<\/strong> that generators can consume.<\/li>\n<li>\n<strong>Generators<\/strong> \u2014 build reusable code from the Analysis:\n\n<ul>\n<li>\n<strong>Routers (adapter\u2011based)<\/strong> \u2014 currently ships with <strong>oRPC<\/strong>, with templates for different styles.<\/li>\n<li>\n<strong>Validation<\/strong> \u2014 <strong>Zod<\/strong>, <strong>Valibot<\/strong>, and <strong>ArkType<\/strong> schemas (insert\/update\/select) + index barrel.<\/li>\n<li>\n<strong>Service<\/strong> \u2014 typed services that can be Drizzle\u2011aware or stubbed.<\/li>\n<\/ul>\n\n\n<\/li>\n\n<li>\n\n<strong>Templates<\/strong> \u2014 swap or customize router implementations (standard\/minimal, oRPC + Service, or your own).<\/li>\n\n<\/ul>\n\n<p>\ud83d\udc49 Docs &amp; examples: <a href=\"https:\/\/use-drzl.github.io\/drzl\/\" rel=\"noopener noreferrer\">https:\/\/use-drzl.github.io\/drzl\/<\/a><\/p>\n\n\n\n\n<h2>\n  \n  \n  Quickstart\n<\/h2>\n\n<h3>\n  \n  \n  1) Install the CLI\n<\/h3>\n\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>pnpm add <span class=\"nt\">-D<\/span> @drzl\/cli\n<span class=\"c\"># npm i -D @drzl\/cli<\/span>\n<span class=\"c\"># yarn add -D @drzl\/cli<\/span>\n<span class=\"c\"># bun add -d @drzl\/cli<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h3>\n  \n  \n  2) Add a single config (oRPC + Zod + Service)\n<\/h3>\n\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ drzl.config.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">defineConfig<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@drzl\/cli\/config<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nf\">defineConfig<\/span><span class=\"p\">({<\/span>\n  <span class=\"na\">schema<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">src\/db\/schemas\/index.ts<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">outDir<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">src\/api<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">generators<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n    <span class=\"c1\">\/\/ 1) Zod validators<\/span>\n    <span class=\"p\">{<\/span> <span class=\"na\">kind<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">zod<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">path<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">src\/validators\/zod<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">schemaSuffix<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Schema<\/span><span class=\"dl\">'<\/span> <span class=\"p\">},<\/span>\n\n    <span class=\"c1\">\/\/ 2) Routers (oRPC adapter), reusing Zod schemas<\/span>\n    <span class=\"p\">{<\/span>\n      <span class=\"na\">kind<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">orpc<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">template<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@drzl\/template-orpc-service<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">includeRelations<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">outputHeader<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">enabled<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"p\">},<\/span>\n      <span class=\"na\">validation<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">useShared<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">library<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">zod<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">importPath<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">src\/validators\/zod<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">schemaSuffix<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Schema<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">},<\/span>\n\n    <span class=\"c1\">\/\/ 3) Typed services (Drizzle\u2011aware or stub)<\/span>\n    <span class=\"p\">{<\/span>\n      <span class=\"na\">kind<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">service<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">path<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">src\/services<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">dataAccess<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">drizzle<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ or 'stub'<\/span>\n      <span class=\"na\">dbImportPath<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">src\/db\/connection<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">schemaImportPath<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">src\/db\/schemas<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">},<\/span>\n  <span class=\"p\">],<\/span>\n<span class=\"p\">});<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h3>\n  \n  \n  3) Install the generators\/template you reference\n<\/h3>\n\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>pnpm add <span class=\"nt\">-D<\/span> @drzl\/generator-zod @drzl\/generator-service @drzl\/template-orpc-service\n<span class=\"c\"># If you prefer Valibot or ArkType:<\/span>\n<span class=\"c\"># pnpm add -D @drzl\/generator-valibot @drzl\/generator-service @drzl\/template-orpc-service<\/span>\n<span class=\"c\"># pnpm add -D @drzl\/generator-arktype @drzl\/generator-service @drzl\/template-orpc-service<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<blockquote>\n<p>The <strong>oRPC generator<\/strong> ships with the CLI. Validation + Service generators are separate packages so you install only what you use.<\/p>\n<\/blockquote>\n\n<h3>\n  \n  \n  4) Generate\n<\/h3>\n\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>pnpm drzl generate <span class=\"nt\">-c<\/span> drzl.config.ts\n<span class=\"c\"># npx drzl generate -c drzl.config.ts<\/span>\n<span class=\"c\"># yarn drzl generate -c drzl.config.ts<\/span>\n<span class=\"c\"># bunx drzl generate -c drzl.config.ts<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>This writes validators to <code>src\/validators\/*<\/code>, routers to <code>src\/api<\/code>, and services to <code>src\/services<\/code>.<\/p>\n\n<h3>\n  \n  \n  (Optional) Watch mode\n<\/h3>\n\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>pnpm drzl watch <span class=\"nt\">-c<\/span> drzl.config.ts <span class=\"nt\">--pipeline<\/span> all <span class=\"nt\">--debounce<\/span> 200\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h3>\n  \n  \n  (Optional) No\u2011config oRPC quickstart\n<\/h3>\n\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>pnpm dlx drzl generate:orpc src\/db\/schemas\/index.ts <span class=\"nt\">-o<\/span> src\/api <span class=\"nt\">--template<\/span> standard <span class=\"nt\">--includeRelations<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n\n\n\n<h2>\n  \n  \n  Adapter\u2011based by design\n<\/h2>\n\n<p>DRZL is <strong>adapter\u2011agnostic<\/strong>: router generation is driven by small, composable <strong>templates<\/strong>. Today it targets <strong>oRPC<\/strong>. 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.<\/p>\n\n<p>Key ideas:<\/p>\n\n<ul>\n<li>\n<strong>Templates<\/strong> define file paths, exported names, imports\/prelude, and the code for each procedure.<\/li>\n<li>\n<strong>Validation reuse<\/strong>: generators can wire shared Zod\/Valibot\/ArkType schemas into handlers (inputs\/outputs).<\/li>\n<li>\n<strong>Typed outputs<\/strong>: the generator adds <code>.output(...)<\/code> typing where applicable.<\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  Examples\n<\/h2>\n\n<ul>\n<li>\n<strong>Relations<\/strong> example \u2014 relation\u2011aware generation patterns.<\/li>\n<li>\n<strong>Validation mix<\/strong> \u2014 reuse shared validators across routers\/services.<\/li>\n<\/ul>\n\n<p>(See the site for live examples and code.)<\/p>\n\n\n\n\n<h2>\n  \n  \n  Licenses &amp; ownership\n<\/h2>\n\n<ul>\n<li>You <strong>own the generated output<\/strong> \u2014 use\/modify\/distribute under your project\u2019s license.<\/li>\n<li>A short output header is added by default; you can disable (<code>outputHeader.enabled = false<\/code>) or customize it.<\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  Roadmap &amp; support\n<\/h2>\n\n<ul>\n<li>More <strong>adapter templates<\/strong> (community + premium) for deeper integrations.<\/li>\n<li>\n<strong>Custom templates<\/strong> available as a paid service if you need a specific stack\/pattern.<\/li>\n<li>DRZL is open\u2011core; contributions, issues, and stars are welcome.<\/li>\n<\/ul>\n\n<p>\u2014<\/p>\n\n<p><strong>Links<\/strong>  <\/p>\n\n<ul>\n<li>Docs: <a href=\"https:\/\/use-drzl.github.io\/drzl\/\" rel=\"noopener noreferrer\">https:\/\/use-drzl.github.io\/drzl\/<\/a>\n<\/li>\n<li>Getting Started: <a href=\"https:\/\/use-drzl.github.io\/drzl\/guide\/getting-started.html\" rel=\"noopener noreferrer\">https:\/\/use-drzl.github.io\/drzl\/guide\/getting-started.html<\/a>\n<\/li>\n<li>CLI Overview: <a href=\"https:\/\/use-drzl.github.io\/drzl\/cli.html\" rel=\"noopener noreferrer\">https:\/\/use-drzl.github.io\/drzl\/cli.html<\/a>\n<\/li>\n<li>Generators: oRPC, Service, Zod, Valibot, ArkType\n<\/li>\n<li>Templates: Standard, oRPC + Service, Custom\n<\/li>\n<li>Adapters: Overview &amp; Router Adapters\n<\/li>\n<\/ul>\n\n<p>If you ship something with DRZL, I\u2019d love to see it!<\/p>\n\n","category":["drizzle","typescript","node","codegeneration"]},{"title":"Stop losing your breakpoints: Meet Breakpoint Bookmarks for VS Code","pubDate":"Fri, 22 Aug 2025 11:20:25 +0000","link":"https:\/\/dev.to\/omardulaimi\/stop-losing-your-breakpoints-meet-breakpoint-bookmarks-for-vs-code-3c4b","guid":"https:\/\/dev.to\/omardulaimi\/stop-losing-your-breakpoints-meet-breakpoint-bookmarks-for-vs-code-3c4b","description":"<p>If you've ever stopped mid\u2011debug 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\u2026 and momentum dies.<\/p>\n\n<p>I built <strong>Breakpoint Bookmarks<\/strong> to fix that. It lets you <strong>save<\/strong> your current breakpoints to a named \u201cflow\u201d, <strong>switch<\/strong> between flows instantly, and <strong>restore<\/strong> everything exactly where it was\u2014conditions, logpoints, function breakpoints and all.<\/p>\n\n<blockquote>\n<p>TL;DR \u2014 Install it, hit <strong>Save<\/strong>, and stop babysitting your breakpoints.<\/p>\n<\/blockquote>\n\n\n\n\n<h2>\n  \n  \n  Quick demo\n<\/h2>\n\n<p><strong>Save your current session<\/strong><br><br>\n<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\"><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\"><\/a><\/p>\n\n<p><strong>Load a saved flow<\/strong><br><br>\n<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\"><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\"><\/a><\/p>\n\n\n<h2>\n  \n  \n  What it does\n<\/h2>\n\n<ul>\n<li>\n<strong>One\u2011click save &amp; restore<\/strong> of all your active breakpoints (source &amp; function)<\/li>\n<li>\n<strong>Unlimited flows<\/strong> \u2014 create one per bug, feature, or customer issue<\/li>\n<li>\n<strong>Works with anything VS Code can debug<\/strong> (JS\/TS, Python, Java, C#, Go, Rust, PHP, Ruby\u2026)<\/li>\n<li>\n<strong>Friendly UI<\/strong>: a dedicated sidebar with inline actions (Save, Load, Edit, Delete)<\/li>\n<li>\n<strong>Type\u2011safe &amp; reliable<\/strong>: built in TypeScript, tested, and cross\u2011platform<\/li>\n<\/ul>\n\n\n<h2>\n  \n  \n  Install (10 seconds)\n<\/h2>\n\n<p>From the Command Palette (<strong>Ctrl\/Cmd+P<\/strong>):<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>ext install OmarDulaimi.breakpoint-bookmarks\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Or via CLI:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>code <span class=\"nt\">--install-extension<\/span> OmarDulaimi.breakpoint-bookmarks\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Marketplace page: <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=OmarDulaimi.breakpoint-bookmarks\" rel=\"noopener noreferrer\">https:\/\/marketplace.visualstudio.com\/items?itemName=OmarDulaimi.breakpoint-bookmarks<\/a><\/p>\n\n<p>Repo: <a href=\"https:\/\/github.com\/omar-dulaimi\/breakpoint-bookmarks\" rel=\"noopener noreferrer\">https:\/\/github.com\/omar-dulaimi\/breakpoint-bookmarks<\/a><\/p>\n\n\n\n\n<h2>\n  \n  \n  How to use it\n<\/h2>\n\n<p>1) <strong>Set up<\/strong> your breakpoints as usual (conditions, hit counts, logpoints, function breakpoints\u2014go wild).<br><br>\n2) Open the <strong>Breakpoint Bookmarks<\/strong> view (Activity Bar \u2192 \u201cBreakpoint Bookmarks\u201d).<br><br>\n3) Click <strong>Save<\/strong> to snapshot your current session to a named flow.<br><br>\n4) Later, click <strong>Load<\/strong> on any flow to restore the entire session\u2014exact lines, conditions, and messages.<br><br>\n5) Use <strong>Edit<\/strong> to tweak the JSON by hand (power users, this is for you).<br><br>\n6) <strong>Delete<\/strong> a flow when it\u2019s no longer useful.<\/p>\n\n<blockquote>\n<p>Pro tip: Keep a \u201cHappy\u2011path\u201d flow you can load anytime you need a clean baseline.<\/p>\n<\/blockquote>\n\n\n\n\n<h2>\n  \n  \n  Settings you might care about\n<\/h2>\n\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json-doc\"><code><span class=\"c1\">\/\/ Settings \u2192 search for \u201cbreakpoint bookmark\u201d<\/span><span class=\"w\">\n<\/span><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"c1\">\/\/ Use relative paths so flows work across machines &amp; teammates<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"breakpointBookmark.useRelativePaths\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span><span class=\"w\">\n\n  <\/span><span class=\"c1\">\/\/ When loading a flow, clear any pre\u2011existing breakpoints first<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"breakpointBookmark.clearPreviousBreakpoints\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span><span class=\"w\">\n\n  <\/span><span class=\"c1\">\/\/ Pick a custom folder for the saved JSON files<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"breakpointBookmark.saveLocation\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\".vscode\/breakpoint-flows\"<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n\n<\/div>\n\n\n\n\n\n\n<h2>\n  \n  \n  Real\u2011world uses\n<\/h2>\n\n<ul>\n<li>\n<strong>Multiple parallel bugs<\/strong> \u2014 keep one flow per issue, jump between them in seconds.\n<\/li>\n<li>\n<strong>Feature flags &amp; envs<\/strong> \u2014 flows for \u201cstaging\u201d, \u201ccanary\u201d, \u201cprod\u2011sim\u201d.\n<\/li>\n<li>\n<strong>Onboarding<\/strong> \u2014 hand new folks a \u201cDebug 101\u201d flow for the codebase.\n<\/li>\n<li>\n<strong>Customer escalations<\/strong> \u2014 save the exact breakpoints used to reproduce a ticket.\n<\/li>\n<li>\n<strong>Pairing &amp; reviews<\/strong> \u2014 share a flow in the repo so everyone can follow the same trail.<\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  What\u2019s new lately\n<\/h2>\n\n<ul>\n<li>Function breakpoints are fully supported (alongside file\/line breakpoints)<\/li>\n<li>Cleaner sidebar UI with hover actions and a top\u2011bar <strong>Save<\/strong> button<\/li>\n<li>Better Windows path handling and cross\u2011platform behavior<\/li>\n<li>Backward\u2011compatible with older bookmark files<\/li>\n<\/ul>\n\n<p>(Changelog lives in the repo if you like the gory details.)<\/p>\n\n\n\n\n<h2>\n  \n  \n  Roadmap \u2014 tell me what to ship next\n<\/h2>\n\n<p>I have a few ideas cooking, but I\u2019d rather build what <em>you<\/em> need:<\/p>\n\n<ul>\n<li>Shared\/team flows out of the box (auto\u2011discover in workspace)<\/li>\n<li>Branch\u2011aware flows (auto\u2011switch based on current git branch)<\/li>\n<li>\u201cSave only changes since last load\u201d<\/li>\n<li>Diff\/merge flows, and search across flows<\/li>\n<li>CLI to automate flows in CI\/repros<\/li>\n<li>API for other extensions to read\/write flows<\/li>\n<\/ul>\n\n<p>Have a better idea? Open an issue or drop a comment \u2014 I read everything.<\/p>\n\n<ul>\n<li>Issues &amp; feature requests: <a href=\"https:\/\/github.com\/omar-dulaimi\/breakpoint-bookmarks\/issues\" rel=\"noopener noreferrer\">https:\/\/github.com\/omar-dulaimi\/breakpoint-bookmarks\/issues<\/a>\n<\/li>\n<li>Pull requests welcome: <a href=\"https:\/\/github.com\/omar-dulaimi\/breakpoint-bookmarks\/pulls\" rel=\"noopener noreferrer\">https:\/\/github.com\/omar-dulaimi\/breakpoint-bookmarks\/pulls<\/a>\n<\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  If this saves you time \u2764\ufe0f\n<\/h2>\n\n<p>A star or review goes a long way. If it\u2019s really helping your day\u2011to\u2011day, you can also sponsor development \u2014 even a tiny amount helps me ship faster and keep docs &amp; fixes flowing.<\/p>\n\n<ul>\n<li>GitHub Sponsors: <a href=\"https:\/\/github.com\/sponsors\/omar-dulaimi\" rel=\"noopener noreferrer\">https:\/\/github.com\/sponsors\/omar-dulaimi<\/a>\n<\/li>\n<\/ul>\n\n<p>Thanks for reading \u2014 and happy debugging. If you write about how you\u2019re using flows in your team, I\u2019ll gladly link it from the repo.<\/p>\n\n","category":["vscode","python","webdev","javascript"]},{"title":"Full JavaScript Internationalization CheatSheet!","pubDate":"Sun, 21 Aug 2022 19:33:00 +0000","link":"https:\/\/dev.to\/omardulaimi\/full-javascript-internationalization-cheatsheet-3fo","guid":"https:\/\/dev.to\/omardulaimi\/full-javascript-internationalization-cheatsheet-3fo","description":"<p>Did you know that \ud835\udddd\ud835\uddee\ud835\ude03\ud835\uddee\ud835\udde6\ud835\uddf0\ud835\uddff\ud835\uddf6\ud835\uddfd\ud835\ude01 can do \ud835\uddf6\ud835\uddfb\ud835\ude01\ud835\uddf2\ud835\uddff\ud835\uddfb\ud835\uddee\ud835\ude01\ud835\uddf6\ud835\uddfc\ud835\uddfb\ud835\uddee\ud835\uddf9\ud835\uddf6\ud835\ude07\ud835\uddee\ud835\ude01\ud835\uddf6\ud835\uddfc\ud835\uddfb \ud835\uddfb\ud835\uddee\ud835\ude01\ud835\uddf6\ud835\ude03\ud835\uddf2\ud835\uddf9\ud835\ude06 ?<\/p>\n\n<p>Well, this cheatsheet will help you discover and learn all about the different objects and constructors this global object(\ud835\udddc\ud835\uddfb\ud835\ude01\ud835\uddf9) provides.<\/p>\n\n<p>A lot of details can be found on the official docs, so be sure to check them out.<\/p>\n\n<p>Make sure to follow me for more, as I'm positive you liked my \ud835\uddd8\ud835\udde6\ud835\udfee\ud835\udfec\ud835\udfee\ud835\udfee cheatsheet before.<\/p>\n\n<p>PDF Version Here: <a href=\"https:\/\/www.linkedin.com\/feed\/update\/urn:li:activity:6966873641892347904\" rel=\"noopener noreferrer\">https:\/\/www.linkedin.com\/feed\/update\/urn:li:activity:6966873641892347904<\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n","category":["javascript","webdev","node","beginners"]},{"title":"How to change access and modification times in Nodejs?","pubDate":"Thu, 18 Aug 2022 13:05:17 +0000","link":"https:\/\/dev.to\/omardulaimi\/how-to-change-access-and-modification-times-in-nodejs-4mm3","guid":"https:\/\/dev.to\/omardulaimi\/how-to-change-access-and-modification-times-in-nodejs-4mm3","description":"<p><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\"><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\"><\/a><\/p>\n\n"},{"title":"How to create symbolic links in Nodejs?","pubDate":"Wed, 17 Aug 2022 19:31:35 +0000","link":"https:\/\/dev.to\/omardulaimi\/how-to-create-symbolic-links-in-nodejs-3i3i","guid":"https:\/\/dev.to\/omardulaimi\/how-to-create-symbolic-links-in-nodejs-3i3i","description":"<p><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\"><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\"><\/a><\/p>\n\n"},{"title":"How to copy a file in Nodejs?","pubDate":"Tue, 16 Aug 2022 13:26:26 +0000","link":"https:\/\/dev.to\/omardulaimi\/how-to-copy-a-file-in-nodejs-52pl","guid":"https:\/\/dev.to\/omardulaimi\/how-to-copy-a-file-in-nodejs-52pl","description":"<p><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\"><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\"><\/a><\/p>\n\n","category":["node","nodejstip","webdev","javascript"]},{"title":"How to append contents to a file in Nodejs?","pubDate":"Mon, 15 Aug 2022 15:43:38 +0000","link":"https:\/\/dev.to\/omardulaimi\/how-to-append-contents-to-a-file-in-nodejs-2fk6","guid":"https:\/\/dev.to\/omardulaimi\/how-to-append-contents-to-a-file-in-nodejs-2fk6","description":"<p>How to append contents to a file in Nodejs?<\/p>\n\n<p>I hope you like the new format, it's so much more readable!<\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n","category":["node","nodejstip","javascript"]},{"title":"What is the best way to read directories in Nodejs?","pubDate":"Sun, 14 Aug 2022 19:04:00 +0000","link":"https:\/\/dev.to\/omardulaimi\/what-is-the-best-way-to-read-directories-in-nodejs-3le2","guid":"https:\/\/dev.to\/omardulaimi\/what-is-the-best-way-to-read-directories-in-nodejs-3le2","description":"<p>Different ways to read directories in Nodejs!<br>\nWhich way do you use? Why?<\/p>\n\n<p>Let me know what you think in the comments<\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n\n\n\n<p>Make sure to check my profile for more tips from the Nodejs world<\/p>\n\n","category":["node","nodejstip","javascript","webdev"]},{"title":"How to create unique temporary directories in Nodejs?","pubDate":"Sat, 13 Aug 2022 21:48:21 +0000","link":"https:\/\/dev.to\/omardulaimi\/how-to-create-unique-temporary-directories-in-nodejs-1n69","guid":"https:\/\/dev.to\/omardulaimi\/how-to-create-unique-temporary-directories-in-nodejs-1n69","description":"<p>\ud835\udde1\ud835\uddfc\ud835\uddf1\ud835\uddf2\ud835\uddf7\ud835\ude00 provides an awesome method that lets you create unique temporary directories.<\/p>\n\n<p>This is really useful when you need to store some data temporarily then delete them later.<\/p>\n\n<p>\ud835\udde1\ud835\uddfc\ud835\uddf1\ud835\uddf2\ud835\uddf7\ud835\ude00 helps you further, by concatenating 6 unique characters to the \ud835\uddfd\ud835\uddff\ud835\uddf2\ud835\uddf3\ud835\uddf6\ud835\ude05 you pick. This results in creating unique directories every single time without worrying about collisions.<\/p>\n\n<p>Library authors will benefit of this tip as well of course.<\/p>\n\n<p>Just make sure to avoid trailing \ud835\uddeb characters in the \ud835\uddfd\ud835\uddff\ud835\uddf2\ud835\uddf3\ud835\uddf6\ud835\ude05, due to some platform inconsistencies.<\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n\n\n\n<p>Did you learn something new today?<\/p>\n\n<p>Like and share this post, and follow me for more!<\/p>\n\n","category":["node","nodejstip","javascript"]},{"title":"Full ES2022 Cheatsheet!","pubDate":"Sat, 13 Aug 2022 00:46:00 +0000","link":"https:\/\/dev.to\/omardulaimi\/full-es2022-cheatsheet-4m9l","guid":"https:\/\/dev.to\/omardulaimi\/full-es2022-cheatsheet-4m9l","description":"<p>PDF version here(High Quality): <a href=\"https:\/\/www.linkedin.com\/posts\/activity-6942202973657702401-ZX6Y\" rel=\"noopener noreferrer\">https:\/\/www.linkedin.com\/posts\/activity-6942202973657702401-ZX6Y<\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n","category":["javascript","node","webdev","es2022"]},{"title":"How to change ownership of a file in Nodejs?","pubDate":"Fri, 12 Aug 2022 23:36:00 +0000","link":"https:\/\/dev.to\/omardulaimi\/how-to-change-ownership-of-a-file-in-nodejs-1fke","guid":"https:\/\/dev.to\/omardulaimi\/how-to-change-ownership-of-a-file-in-nodejs-1fke","description":"<p>As for our last permissions and access related methods, today we talk about the \ud835\uddf0\ud835\uddf5\ud835\uddfc\ud835\ude04\ud835\uddfb method.<\/p>\n\n<p>It lets you change the ownership of a file. Just like you're used to on your terminal:<\/p>\n\n<p>\ud835\uddf0\ud835\uddf5\ud835\uddfc\ud835\ude04\ud835\uddfb &lt;\ud835\udde8\ud835\ude00\ud835\uddf2\ud835\uddff&gt;&lt;:&gt;&lt;\ud835\uddda\ud835\uddff\ud835\uddfc\ud835\ude02\ud835\uddfd&gt; &lt;\ud835\uddd9\ud835\uddf6\ud835\uddf9\ud835\uddf2&gt;<\/p>\n\n<p>\ud835\udde1\ud835\uddfc\ud835\uddf1\ud835\uddf2\ud835\uddf7\ud835\ude00 provides support for it natively; so you won't have to spawn a process to access this API.<\/p>\n\n<p>You can check the updated values with this basic list command:<\/p>\n\n<p>\ud835\uddf9\ud835\ude00 -\ud835\uddf9 &lt;\ud835\uddd9\ud835\udddc\ud835\udddf\ud835\uddd8&gt;<\/p>\n\n<p><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\"><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\"><\/a><\/p>\n\n\n\n\n<p>Did you learn something new today?<\/p>\n\n<p>Like and share this post, and follow me for more!<\/p>\n\n","category":["node","nodejstip","javascript"]}]}}