<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: JSDev Space</title>
    <description>The latest articles on DEV Community by JSDev Space (@jsdevspace).</description>
    <link>https://dev.to/jsdevspace</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%2F1381737%2F39fc43a5-0614-4890-9b5f-f0933dae93c2.jpg</url>
      <title>DEV Community: JSDev Space</title>
      <link>https://dev.to/jsdevspace</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jsdevspace"/>
    <language>en</language>
    <item>
      <title>Friday Links #36: New JavaScript Tools, Frameworks, and Research</title>
      <dc:creator>JSDev Space</dc:creator>
      <pubDate>Fri, 13 Mar 2026 11:47:27 +0000</pubDate>
      <link>https://dev.to/jsdevspace/friday-links-36-new-javascript-tools-frameworks-and-research-5222</link>
      <guid>https://dev.to/jsdevspace/friday-links-36-new-javascript-tools-frameworks-and-research-5222</guid>
      <description>&lt;p&gt;The JavaScript ecosystem never slows down. Every week brings new tools, framework updates, performance benchmarks, and occasionally discoveries that reshape how we think about existing platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subscribe to &lt;a href="https://jsdevspace.substack.com/" rel="noopener noreferrer"&gt;JavaScript Friday Links&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;This week’s highlights cover a broad spectrum of topics. The release of Solid 2.0 Beta introduces a redesigned async model that simplifies reactive workflows. New benchmarking data compares modern JavaScript minifiers and shows how tools like SWC, Oxc, and Minify are redefining build performance. At the same time, researchers used AI-assisted analysis to uncover multiple previously undiscovered vulnerabilities in Firefox — demonstrating how machine learning is increasingly being used to audit complex codebases.&lt;/p&gt;

&lt;p&gt;In this week’s Friday Links, we’ve collected the most interesting stories, tools, and discussions worth your attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Ecosystem Highlights
&lt;/h2&gt;

&lt;h3&gt;
  
  
  TypeScript 6 Prepares the Path to TS7
&lt;/h3&gt;

&lt;p&gt;The TypeScript team &lt;a href="https://devblogs.microsoft.com/typescript/announcing-typescript-6-0-rc/" rel="noopener noreferrer"&gt;released&lt;/a&gt; an early preview of &lt;strong&gt;TypeScript 6&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This release is mainly about &lt;strong&gt;internal changes preparing for the future Go-based compiler planned for TypeScript 7&lt;/strong&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;faster compilation&lt;/li&gt;
&lt;li&gt;reduced memory usage&lt;/li&gt;
&lt;li&gt;better incremental builds&lt;/li&gt;
&lt;li&gt;improved large project performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Large monorepos could see &lt;strong&gt;dramatic speed improvements&lt;/strong&gt; once the Go compiler lands.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deno 2.7 Improves Node Compatibility
&lt;/h3&gt;

&lt;p&gt;The latest &lt;a href="https://deno.com/blog/v2.7" rel="noopener noreferrer"&gt;&lt;strong&gt;Deno runtime release&lt;/strong&gt;&lt;/a&gt; continues improving Node compatibility.&lt;/p&gt;

&lt;p&gt;Highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;improved npm integration&lt;/li&gt;
&lt;li&gt;Node API compatibility&lt;/li&gt;
&lt;li&gt;Temporal API stabilization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Temporal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instant&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📜 Articles &amp;amp; Tutorials
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.blog/ai-and-ml/generative-ai/under-the-hood-security-architecture-of-github-agentic-workflows/" rel="noopener noreferrer"&gt;Under the hood: Security architecture of GitHub Agentic Workflows&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hackernoon.com/beating-javascript-performance-limits-with-rust-and-n-api-building-a-faster-image-diff-tool" rel="noopener noreferrer"&gt;Beating JavaScript Performance Limits With Rust and N-API: Building a Faster Image Diff Tool&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://css-tricks.com/the-different-ways-to-select-html-in-css/" rel="noopener noreferrer"&gt;The Different Ways to Select &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; in CSS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://frontendmasters.com/blog/the-big-gotcha-of-anchor-positioning/" rel="noopener noreferrer"&gt;The Big Gotcha of Anchor Positioning&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/valibot-vs-zod/" rel="noopener noreferrer"&gt;Valibot vs Zod: A Lightweight Validation Alternative&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://neciudan.dev/cline-ci-got-compromised-here-is-how" rel="noopener noreferrer"&gt;How to steal npm publish tokens by opening GitHub issues&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cardog.app/blog/vin-decoder-javascript" rel="noopener noreferrer"&gt;How to Decode a VIN in JavaScript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/safe-json-parse-javascript/" rel="noopener noreferrer"&gt;Why Blindly Using JSON.parse() Can Be Dangerous&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.scottlogic.com/2026/03/09/noJS-3-flappy-bird.html" rel="noopener noreferrer"&gt;Making a Flappy Bird clone using pure HTML and CSS, no JavaScript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.ishchhabra.com/writing/pnpm-monorepo" rel="noopener noreferrer"&gt;How to build a pnpm monorepo, the right way&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mux.com/blog/react-is-changing-the-game-for-streaming-apps-with-the-activity-component" rel="noopener noreferrer"&gt;React is changing the game for streaming apps with the Activity component&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://patrickbrosset.com/articles/2026-03-09-using-css-animations-as-state-machines-to-remember-focus-and-hover-states-with-css-only/" rel="noopener noreferrer"&gt;Using CSS animations as state machines to remember focus and hover states with CSS only&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.frankmtaylor.com/2026/03/05/you-dont-know-html-tables/" rel="noopener noreferrer"&gt;You Don’t Know HTML Tables&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reactdevelopment.substack.com/p/5-react-hooks-techniques-to-improve" rel="noopener noreferrer"&gt;5 React Hooks Techniques to Improve Component Performance&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/tailwind-v4-vs-mui-antd-styled-components/" rel="noopener noreferrer"&gt;Tailwind CSS v4 vs MUI, Ant Design &amp;amp; Styled Components&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/howto/lru-cache-javascript/" rel="noopener noreferrer"&gt;Designing an Efficient LRU Cache Step by Step&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/howto/deploy-openclaw-second-brain/" rel="noopener noreferrer"&gt;Howto Deploy OpenClaw and Build Your Personal AI Second Brain&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚒️ Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Repomix — Turn Any Repo Into a Single AI-Readable File
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/.%2Fimages%2Frepomix.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/.%2Fimages%2Frepomix.png" alt="Repomix"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/yamadashy/repomix" rel="noopener noreferrer"&gt;Repomix&lt;/a&gt; packs an entire repository into a single AI-friendly document.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tb5z035i/cursor-tg" rel="noopener noreferrer"&gt;Cursor Cloud Telegram Connector&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://npmx.dev/" rel="noopener noreferrer"&gt;npmx&lt;/a&gt; is an experimental tool designed to improve npm package exploration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://litepacks.github.io/welyjs/" rel="noopener noreferrer"&gt;Wely&lt;/a&gt; — Lightweight Web Component Framework&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/vadimdemedes/ink" rel="noopener noreferrer"&gt;Ink&lt;/a&gt; allows developers to build CLI tools using React components.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sojinantony01.github.io/react-cron-generator/" rel="noopener noreferrer"&gt;Cron Expression Generator&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 Libs
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/vercel/nft" rel="noopener noreferrer"&gt;Node File Trace&lt;/a&gt; - determines exactly which files a Node application needs to run.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/privatenumber/minification-benchmarks" rel="noopener noreferrer"&gt;JavaScript Minification Benchmarks&lt;/a&gt;: SWC Still Leads&lt;/p&gt;

&lt;p&gt;&lt;a href="https://rv-grid.com/" rel="noopener noreferrer"&gt;RevoGrid&lt;/a&gt; - High-Performance Data Grid Component&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cosmiciron/vmprint" rel="noopener noreferrer"&gt;VMPrint&lt;/a&gt; - A pure-JS, tiny typesetting engine with bit-perfect PDF output on everything—from Cloudflare Workers to the browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/quantizor/markdown-to-jsx" rel="noopener noreferrer"&gt;markdown-to-jsx&lt;/a&gt; -  A very fast and versatile markdown toolchain. Output to AST, React, React Native, SolidJS, Vue, HTML, and more! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/sindresorhus/clipboardy" rel="noopener noreferrer"&gt;clipboardy&lt;/a&gt; -  Access the system clipboard (copy/paste) &lt;/p&gt;

&lt;h2&gt;
  
  
  ⌚ Releases
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/solidjs/solid/releases/tag/v2.0.0-beta.0" rel="noopener noreferrer"&gt;Solid v2.0.0 Beta: The &lt;code&gt;&amp;lt;Suspense&amp;gt;&lt;/code&gt; Era Comes to an End&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After a long experimental phase, Solid 2.0 has released its first beta, introducing native asynchronous reactivity as a core feature of the framework.&lt;/p&gt;

&lt;p&gt;In this new model, reactive computations can directly return Promises or async iterables, and Solid’s reactive graph will automatically suspend and resume around those async operations. This removes much of the complexity developers previously had to manage when dealing with asynchronous state.&lt;/p&gt;

&lt;p&gt;One notable change is that &lt;code&gt;&amp;lt;Suspense&amp;gt;&lt;/code&gt; has been retired. For initial renders, it is now replaced by a simpler component called &lt;code&gt;&amp;lt;Loading&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://astro.build/blog/astro-6/" rel="noopener noreferrer"&gt;Astro 6 is here!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nodejs.org/en/blog/release/v25.8.0" rel="noopener noreferrer"&gt;Node.js 25.8.0 (Current)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://eslint.org/blog/2026/03/eslint-v10.0.3-released/" rel="noopener noreferrer"&gt;ESLint v10.0.3 released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.emberjs.com/ember-released-6-11/" rel="noopener noreferrer"&gt;Ember 6.11 Released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ionic.io/blog/announcing-ionic-framework-8-8" rel="noopener noreferrer"&gt;Ionic Framework 8.8&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/facebook/react-native/releases/tag/v0.85.0-rc.0" rel="noopener noreferrer"&gt;React Native 0.85 RC.0&lt;/a&gt;, &lt;a href="https://github.com/pnpm/pnpm/releases/tag/v10.32.0" rel="noopener noreferrer"&gt;pnpm 10.32&lt;/a&gt;, &lt;a href="https://github.com/jestjs/jest/releases/tag/v30.3.0" rel="noopener noreferrer"&gt;Jest 30.3&lt;/a&gt;, &lt;a href="https://github.com/recharts/recharts/releases/tag/v3.8.0" rel="noopener noreferrer"&gt;Recharts 3.8&lt;/a&gt;, &lt;br&gt;
&lt;a href="https://github.com/openplayerjs/openplayerjs/releases/tag/v3.0.2" rel="noopener noreferrer"&gt;OpenPlayer.js 3.0.2&lt;/a&gt;, &lt;a href="https://github.com/prisma/prisma/releases/tag/7.5.0" rel="noopener noreferrer"&gt;Prisma 7.5&lt;/a&gt;, &lt;a href="https://github.com/sqliteai/sqlite-js" rel="noopener noreferrer"&gt;SQLite JS 1.3&lt;/a&gt;, &lt;a href="https://github.com/staylor/react-helmet-async/pull/260" rel="noopener noreferrer"&gt;React Helmet Async 3.0&lt;/a&gt;, &lt;a href="https://github.com/preactjs/preact/releases/tag/10.29.0" rel="noopener noreferrer"&gt;Preact 10.29.0&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  📺 Videos
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=IBTx5aGj-6U" rel="noopener noreferrer"&gt;Build Your Own Video Sharing App – Loom Clone with Next.js and Mux JavaScript Tutorial&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=_TRV6fPUMJw" rel="noopener noreferrer"&gt;You Can Just Ship Agents: Architecting for the Agentic Era | Dom Sipowicz, Vercel&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=wvt5JNUXXLM" rel="noopener noreferrer"&gt;The Future of TypeScript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=IBTx5aGj-6U" rel="noopener noreferrer"&gt;Build Your Own Video Sharing App – Loom Clone with Next.js and Mux JavaScript Tutorial&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=abbeIUOCzmw" rel="noopener noreferrer"&gt;Cloudflare just slop forked Next.js…&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Xn-gtHDsaPY" rel="noopener noreferrer"&gt;7 new open source AI tools you need right now…&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=S26VdcWQzRQ" rel="noopener noreferrer"&gt;NEW Tanstack Hotkeys Library is Amazing&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🎤 Talks &amp;amp; Podcasts
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=S_wCMc_iNk4" rel="noopener noreferrer"&gt;Why are we building CodePen v2? — CodePen Radio 419&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=M5IkdUunf8g" rel="noopener noreferrer"&gt;Stop putting secrets in .env&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🗞️ News &amp;amp; Updates
&lt;/h2&gt;
&lt;h3&gt;
  
  
  The web industry is gradually shortening the maximum lifespan of TLS certificates.
&lt;/h3&gt;

&lt;p&gt;Starting March 15, 2026, the limit will drop from 398 days to 200 days. The timeline continues with further reductions: 100 days in 2027, and by 2029 the maximum validity period will shrink to just 47 days.&lt;/p&gt;

&lt;p&gt;Because of these changes, &lt;a href="https://www.heroku.com/blog/preparing-for-shorter-ssl-tls-certificate-lifetimes/" rel="noopener noreferrer"&gt;Heroku recommends enabling automatic certificate renewal&lt;/a&gt; to avoid unexpected expirations and potential service disruptions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.11ty.dev/blog/build-awesome/" rel="noopener noreferrer"&gt;Eleventy is now Build Awesome&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🔐 Security
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Supply-Chain Attacks Target Developers
&lt;/h3&gt;

&lt;p&gt;Researchers recently discovered malicious GitHub repositories disguised as job assignments.&lt;/p&gt;

&lt;p&gt;When opened in VS Code they may execute scripts automatically.&lt;/p&gt;

&lt;p&gt;Developers should always review:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;.vscode/tasks.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;.vscode/settings.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;package.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔗 &lt;a href="https://thehackernews.com/2026/02/fake-nextjs-repos-target-developers.html" rel="noopener noreferrer"&gt;thehackernews&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  vm2 Sandbox Escape Vulnerability
&lt;/h3&gt;

&lt;p&gt;A critical vulnerability was discovered in vm2, a sandbox library used for executing untrusted JavaScript.&lt;/p&gt;

&lt;p&gt;This vulnerability allows escaping the sandbox and executing arbitrary code.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/patriksimek/vm2" rel="noopener noreferrer"&gt;github.com/patriksimek/vm2&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Researchers at Brave discovered that web agents often leak user information — even when explicitly instructed not to.
&lt;/h3&gt;

&lt;p&gt;In a &lt;a href="https://brave.com/blog/agentic-oversharing/" rel="noopener noreferrer"&gt;study involving 1,080 runs&lt;/a&gt; on Amazon and eBay, agents powered by GPT-4o, O3, and O4-mini repeatedly exposed data to third-party services that had nothing to do with the task they were performing.&lt;/p&gt;

&lt;p&gt;Examples included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inserting conversation history into search fields&lt;/li&gt;
&lt;li&gt;revealing personal details through interaction patterns&lt;/li&gt;
&lt;li&gt;unintentionally sending contextual data to external services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The findings highlight a growing concern: AI web agents may unintentionally expose sensitive user information through their behavior, even when privacy safeguards are in place.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Anthropic team&lt;/strong&gt; recently analyzed the Firefox codebase using Claude and uncovered &lt;a href="https://blog.mozilla.org/en/firefox/hardening-firefox-anthropic-red-team/" rel="noopener noreferrer"&gt;14 critical vulnerabilities&lt;/a&gt; that had gone unnoticed for years.&lt;/p&gt;

&lt;p&gt;In total, the investigation led to the discovery of 22 security issues, all of which were assigned CVE identifiers and addressed in Firefox 148.&lt;/p&gt;

&lt;p&gt;Some of these vulnerabilities had reportedly been present in the codebase for over a decade, highlighting how AI-assisted analysis can help uncover deeply hidden security flaws in large, mature software projects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://trigger.dev/blog/shai-hulud-postmortem" rel="noopener noreferrer"&gt;How we got hit by Shai-Hulud: A complete post-mortem&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;That’s all for this week’s JavaScript roundup.&lt;/p&gt;

&lt;p&gt;The ecosystem continues to evolve rapidly, and keeping track of new tools, releases, and discoveries can be challenging. Weekly collections like Friday Links aim to surface the most meaningful updates so developers can stay informed without being overwhelmed.&lt;/p&gt;

&lt;p&gt;If you came across an interesting library, experiment, or article this week, consider sharing it — the next edition might include it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Mastering JavaScript map(): Hidden Pitfalls and Smarter Patterns</title>
      <dc:creator>JSDev Space</dc:creator>
      <pubDate>Mon, 17 Nov 2025 00:00:50 +0000</pubDate>
      <link>https://dev.to/jsdevspace/mastering-javascript-map-hidden-pitfalls-and-smarter-patterns-18p4</link>
      <guid>https://dev.to/jsdevspace/mastering-javascript-map-hidden-pitfalls-and-smarter-patterns-18p4</guid>
      <description>&lt;p&gt;JavaScript’s &lt;code&gt;Array.prototype.map()&lt;/code&gt; is simple on the surface yet surprisingly deep once you inspect how callbacks, types, coercion, and encoding work under the hood. One of the most infamous examples — &lt;code&gt;[1,2,3].map(parseInt)&lt;/code&gt; — looks harmless but produces confusing output that often appears in interviews.&lt;/p&gt;

&lt;p&gt;This guide breaks everything down clearly: how &lt;code&gt;map()&lt;/code&gt; really works, why &lt;code&gt;parseInt&lt;/code&gt; misbehaves, how &lt;code&gt;NaN&lt;/code&gt; is detected, how wrapper objects make &lt;code&gt;"text".length&lt;/code&gt; possible, and why emoji “length” is unintuitive. Each section includes modern examples and best-practice patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. How &lt;code&gt;map()&lt;/code&gt; Actually Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1 Syntax and Basic Behavior
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;map()&lt;/code&gt; creates a brand-new array using your callback’s return values. The original array is never modified.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transformed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sourceList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;itemValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;itemPosition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;originalList&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="cm"&gt;/* computed value */&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;optionalThisArgument&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1.2 Practical Examples
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Example 1: Transforming numbers
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;baseNumbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doubledValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;baseNumbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doubledValues&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// [4, 10, 20]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example 2: Mapping object properties
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;studentRecords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;nickname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lara&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;nickname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tomas&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;extractedNames&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;studentRecords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nickname&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example 3: Using map() on array-like structures
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pseudoArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;y&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uppercased&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pseudoArray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1.3 Sparse Arrays and Missing Elements
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;weird&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;weird&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;unit&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;unit&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Understanding &lt;code&gt;parseInt()&lt;/code&gt; — and Why It Breaks with &lt;code&gt;map()&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Parsing Rules
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0xA&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// 10&lt;/span&gt;
&lt;span class="nf"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;10&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;     &lt;span class="c1"&gt;// 8&lt;/span&gt;
&lt;span class="nf"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;7.8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// 7&lt;/span&gt;
&lt;span class="nf"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;xy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;// NaN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Why &lt;code&gt;[1, 2, 3].map(parseInt)&lt;/code&gt; Gives &lt;code&gt;[1, NaN, NaN]&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 The Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// [1, NaN, NaN]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2 The Real Reason
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;map()&lt;/code&gt; passes &lt;code&gt;(value, index, array)&lt;/code&gt; while &lt;code&gt;parseInt&lt;/code&gt; expects &lt;code&gt;(string, radix)&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 Correct Solutions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Special Numeric Values: &lt;code&gt;NaN&lt;/code&gt; and &lt;code&gt;Infinity&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 Properties of &lt;code&gt;NaN&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isNaN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
&lt;span class="nf"&gt;isNaN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;         
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Wrapper Objects
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. UTF-16, Unicode, and Emoji Length Issues
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;👩‍💻&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Interviewer Expectations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Higher-order function comprehension
&lt;/li&gt;
&lt;li&gt;Callback mechanics
&lt;/li&gt;
&lt;li&gt;Debugging ability
&lt;/li&gt;
&lt;li&gt;Understanding coercion and Unicode
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;code&gt;map()&lt;/code&gt; touches many deeper JS concepts, from number parsing to Unicode. Mastering these details helps you write safer, clearer, more predictable code — and ace interview challenges.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>TypeScript Generics: The Magic Behind Flexible, Type-Safe Code</title>
      <dc:creator>JSDev Space</dc:creator>
      <pubDate>Fri, 07 Nov 2025 07:26:45 +0000</pubDate>
      <link>https://dev.to/jsdevspace/typescript-generics-the-magic-behind-flexible-type-safe-code-4mob</link>
      <guid>https://dev.to/jsdevspace/typescript-generics-the-magic-behind-flexible-type-safe-code-4mob</guid>
      <description>&lt;p&gt;For many developers, the first encounter with &lt;strong&gt;TypeScript generics&lt;/strong&gt; can feel perplexing. Symbols like &lt;code&gt;&amp;lt;T&amp;gt;&lt;/code&gt; appear abstract and mathematical — yet they unlock one of the language’s most powerful features. Generics make it possible to write code that is both &lt;em&gt;type-safe&lt;/em&gt; and &lt;em&gt;highly reusable&lt;/em&gt;, allowing developers to define patterns that adapt to different data structures without losing type precision.&lt;/p&gt;

&lt;p&gt;This article examines the concept of generics in depth: what they are, why they matter, and how they elevate the architecture of TypeScript projects — from simple utility functions to enterprise-level abstractions.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Understanding Generics — From Function Parameters to Type Parameters
&lt;/h2&gt;

&lt;p&gt;In plain JavaScript, functions often lose type context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;mirror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mirror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;       &lt;span class="c1"&gt;// returns 42, but type info is lost&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mirror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// returns "hello", but type info is lost&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TypeScript addresses this with type parameters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;mirror&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mirror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;       &lt;span class="c1"&gt;// number&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mirror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// string&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mirror&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="c1"&gt;// boolean&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;&amp;lt;T&amp;gt;&lt;/code&gt; acts as a placeholder for a concrete type — a &lt;em&gt;type variable&lt;/em&gt; that TypeScript infers automatically. This allows the function to maintain flexibility while preserving safety.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ The Fundamentals of Generics
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Generic Classes
&lt;/h3&gt;

&lt;p&gt;A simple example is a type-safe stack implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SafeStack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="na"&gt;store&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

  &lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;peek&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;SafeStack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;SafeStack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;words&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;words&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;world&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. Multiple Type Parameters
&lt;/h3&gt;

&lt;p&gt;Functions can also define relationships between multiple types:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;pairOf&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;K&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;V&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;K&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;V&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;K&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;V&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;one&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pairOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;age&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;      
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;two&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pairOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;        
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;three&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pairOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;config&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;debug&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. Constrained Generics
&lt;/h3&gt;

&lt;p&gt;Developers can restrict what a generic type can accept:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;WithLength&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;measure&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;WithLength&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;measure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;        
&lt;span class="nf"&gt;measure&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;      
&lt;span class="nf"&gt;measure&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;  
&lt;span class="c1"&gt;// measure(42);          // Error: number has no length&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💼 Practical Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Generic API Responses
&lt;/h3&gt;

&lt;p&gt;Generics are extremely useful in API and data-handling layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;message&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;apiFetch&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;RequestInit&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/api/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Product&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userRes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;apiFetch&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;users/1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userRes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prodRes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;apiFetch&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;products/12&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prodRes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. Utility Function Libraries
&lt;/h3&gt;

&lt;p&gt;Generic utilities enhance flexibility and type inference:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;filterList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;mapList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;U&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="nx"&gt;mapper&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;U&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;U&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mapper&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;pick&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;K&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="kr"&gt;keyof&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;K&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;K&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;combine&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;U&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;U&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;U&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These functions scale seamlessly across data structures, avoiding repetitive type definitions.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Type-Safe React Hooks
&lt;/h3&gt;

&lt;p&gt;In React applications, generics help ensure predictable form and state handling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useCallback&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="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useForm&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initial&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setForm&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initial&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;update&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;K&lt;/span&gt; &lt;span class="na"&gt;extends&lt;/span&gt; &lt;span class="na"&gt;keyof&lt;/span&gt; &lt;span class="na"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;(key: K, val: T[K]) =&amp;gt; &lt;span class="si"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setForm&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
  &lt;span class="si"&gt;}&lt;/span&gt;, []);

  const reset = useCallback(() =&amp;gt; setForm(initial), [initial]);

  return &lt;span class="si"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;update&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setForm&lt;/span&gt; &lt;span class="si"&gt;}&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This design makes custom hooks fully type-aware — every field and update operation is validated at compile time.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Advanced Generic Techniques
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Conditional Types
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;IsString&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;yes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;no&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;IsString&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;IsString&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UnwrapArray&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="nf"&gt;extends &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;infer&lt;/span&gt; &lt;span class="nx"&gt;U&lt;/span&gt;&lt;span class="p"&gt;)[]&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;U&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;never&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;UnwrapArray&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;UnwrapArray&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mapped Types
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;K&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="kr"&gt;keyof&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]?:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;K&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Immutable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;K&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="kr"&gt;keyof&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;K&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;PartialUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ReadonlyUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Immutable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚠️ Common Pitfalls and Best Practices
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Avoid overengineering.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Excessively complex generic signatures reduce readability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use default type parameters.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;   &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;PageOptions&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="na"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
     &lt;span class="nl"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
     &lt;span class="nl"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;boolean&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;ol&gt;
&lt;li&gt;
&lt;strong&gt;Leverage type inference.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;   &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;buildArray&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[]):&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nums&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;buildArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;texts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;buildArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;b&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;buildArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;two&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;Generics are one of TypeScript’s defining strengths. They allow developers to build systems that are expressive, safe, and reusable — without compromising flexibility. By thinking in terms of generic patterns rather than fixed types, teams can write libraries, hooks, and utilities that adapt naturally to any use case.&lt;/p&gt;

&lt;p&gt;Understanding generics is more than mastering syntax; it’s about adopting a mindset where &lt;strong&gt;code scales with types&lt;/strong&gt;. Once internalized, generics turn abstract type definitions into practical tools that make TypeScript both elegant and powerful.&lt;/p&gt;

&lt;p&gt;Read more about &lt;a href="https://jsdev.space/" rel="noopener noreferrer"&gt;JavaScript Development&lt;/a&gt; and subscribe to our &lt;a href="https://jsdevspace.substack.com/" rel="noopener noreferrer"&gt;weekly newsletter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Friday Links #30 — JavaScript Updates, Tools, and Inspiration</title>
      <dc:creator>JSDev Space</dc:creator>
      <pubDate>Fri, 17 Oct 2025 13:12:03 +0000</pubDate>
      <link>https://dev.to/jsdevspace/friday-links-30-javascript-updates-tools-and-inspiration-1akf</link>
      <guid>https://dev.to/jsdevspace/friday-links-30-javascript-updates-tools-and-inspiration-1akf</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsb2az6w4eqdtafbiwy0h.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%2Fsb2az6w4eqdtafbiwy0h.png" alt="Friday Links #30 — JavaScript Updates, Tools, and Inspiration" width="800" height="576"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Welcome to &lt;a href="https://jsdevspace.substack.com/p/friday-links-30-the-week-in-javascript" rel="noopener noreferrer"&gt;Friday Links #30&lt;/a&gt;, your curated roundup of the week’s most notable happenings in the JavaScript world. From emerging frameworks and performance breakthroughs to creative experiments and open-source gems, this week’s collection is packed with fresh insights and practical discoveries for web developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  📜 Articles &amp;amp; Tutorials
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://overreacted.io/open-social/" rel="noopener noreferrer"&gt;Open Social&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tylercipriani.com/blog/2025/08/15/git-lfs/" rel="noopener noreferrer"&gt;The future of large files in Git is Git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://userjot.com/blog/best-practices-building-agentic-ai-systems" rel="noopener noreferrer"&gt;Best Practices for Building Agentic AI Systems: What Actually Works in Production&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/howto/javascript-reduce/" rel="noopener noreferrer"&gt;Howto Use JavaScript reduce() Like a Pro&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ryanskinner.com/posts/how-i-built-a-full-stack-react-framework-4x-faster-than-nextjs-with-4x-more-throughput" rel="noopener noreferrer"&gt;How I Built a Full-Stack React Framework 4x Faster Than Next.js With 4x More Throughput&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/copilotkit/heres-how-to-build-fullstack-agent-apps-gemini-copilotkit-langgraph-15jb"&gt;Here's How To Build Fullstack Agent Apps (Gemini, CopilotKit &amp;amp; LangGraph)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jross.me/run-express-js-on-cloudflare-workers/" rel="noopener noreferrer"&gt;Run Express.js on Cloudflare Workers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/nextjs-routing-mastery/" rel="noopener noreferrer"&gt;Next.js App Router: Dynamic, Grouped, Parallel &amp;amp; Intercepted&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-how-to-get-started/" rel="noopener noreferrer"&gt;GitHub Copilot CLI: How to get started&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://matthiasott.com/notes/css-is-where-the-magic-happens" rel="noopener noreferrer"&gt;CSS :is() :where() the Mag­ic Happens&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://stuffandnonsense.co.uk/blog/the-thing-about-contrast-color" rel="noopener noreferrer"&gt;The thing about contrast-color&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://frontendmasters.com/blog/modern-css-round-out-tabs/" rel="noopener noreferrer"&gt;Modern CSS Round-Out Tabs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/ethersjs-basics/" rel="noopener noreferrer"&gt;Mastering Ethers.js — From MetaMask to Smart Contracts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/wagmi-react/" rel="noopener noreferrer"&gt;Building Web3 Frontends with React and wagmi&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nodesource.com/blog/nodejs-features-replacing-npm-packages" rel="noopener noreferrer"&gt;15 Recent Node.js Features that Replace Popular npm Packages&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aurorascharff.no/posts/building-an-async-combobox-with-usesuspensequery-and-usedeferredvalue/" rel="noopener noreferrer"&gt;Building an Async Combobox with useSuspenseQuery() and useDeferredValue()&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://denodell.com/blog/html-best-kept-secret-output-tag" rel="noopener noreferrer"&gt;HTML’s Best Kept Secret: The &lt;code&gt;&amp;lt;output&amp;gt;&lt;/code&gt; Tag&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚒️ Tools
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mirrow.app/" rel="noopener noreferrer"&gt;Mirrow&lt;/a&gt;: A DSL for Dynamic SVG Creation and Animation — Instead of treating SVGs as static graphics, Mirrow reimagines them as interactive, code-defined visuals. It introduces a domain-specific language (DSL) that lets you generate and animate SVGs programmatically, making them flexible, reusable, and expressive. Visit the playground to experiment with Mirrow syntax and bring your own SVG animations to life in real time.&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%2Fegt8ta19z8xy51rcswv1.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%2Fegt8ta19z8xy51rcswv1.png" alt="Free OG Image Creator" width="799" height="287"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://ogimage.click/" rel="noopener noreferrer"&gt;ogImage.click&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://makegraph.app/" rel="noopener noreferrer"&gt;Make Graph&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/khromov/ai-digest" rel="noopener noreferrer"&gt;ai-digest&lt;/a&gt;: A CLI for Summarizing Your Entire Codebase — This command-line tool automatically compiles your entire project into a single, structured Markdown file. Perfect for feeding into Claude projects, custom ChatGPTs, or AI code assistants, it gives large models full context of your codebase for analysis, documentation, or refactoring.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/humanwhocodes/crosspost" rel="noopener noreferrer"&gt;Crosspost&lt;/a&gt; - A JavaScript utility for posting across multiple social networks at once&lt;/p&gt;

&lt;p&gt;&lt;a href="https://stackoverflow.ai/" rel="noopener noreferrer"&gt;stackoverflow.ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/czlonkowski/n8n-mcp" rel="noopener noreferrer"&gt;n8n-MCP&lt;/a&gt; - A MCP for Claude Desktop / Claude Code / Windsurf / Cursor to build n8n workflows for you&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 Libs
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Olow304/memvid" rel="noopener noreferrer"&gt;memvid&lt;/a&gt; - Video-based AI memory library. Store millions of text chunks in MP4 files with lightning-fast semantic search. No database needed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/CaviraOSS/pagelm" rel="noopener noreferrer"&gt;PageLM&lt;/a&gt; - PageLM is a community driven version of NotebookLM &amp;amp; a education platform that transforms study materials into interactive resources like quizzes, flashcards, notes, and podcasts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/linagora/twake-drive" rel="noopener noreferrer"&gt;Twake Drive&lt;/a&gt; - The open-source alternative to Google Drive.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/MatthewHerbst/react-to-print" rel="noopener noreferrer"&gt;ReactToPrint&lt;/a&gt; - Print React components in the browser&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rictic/jsonriver" rel="noopener noreferrer"&gt;jsonriver&lt;/a&gt; - A simple, fast streaming JSON parser built on standards.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/oozcitak/xmlbuilder2" rel="noopener noreferrer"&gt;xmlbuilder2&lt;/a&gt; - An XML builder for node.js&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/vercel-labs/coding-agent-template" rel="noopener noreferrer"&gt;Coding Agent Template&lt;/a&gt; - Multi-agent AI coding platform powered by Vercel Sandbox and AI Gateway&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.isagent.dev/" rel="noopener noreferrer"&gt;IsAgent SDK&lt;/a&gt; - A lightweight SDK for building agent-specific experiences in your app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/visgl/react-map-gl" rel="noopener noreferrer"&gt;react-map-gl&lt;/a&gt; - React friendly API wrapper around MapboxGL JS&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/simonedevit/reactylon" rel="noopener noreferrer"&gt;reactylon&lt;/a&gt; - A powerful multiplatform framework built on top of Babylon.js and React, designed to create interactive and immersive XR experiences.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/playcanvas/model-viewer" rel="noopener noreferrer"&gt;PlayCanvas Model Viewer&lt;/a&gt; - 3D Model Viewer supporting glTF and 3D Gaussian Splats&lt;/p&gt;

&lt;h2&gt;
  
  
  ⌚ Releases
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://react.dev/blog/2025/10/07/react-compiler-1" rel="noopener noreferrer"&gt;React Compiler v1.0&lt;/a&gt; — The React team has officially declared the compiler stable and ready for production use. It automatically applies memoization optimizations based on static code analysis, reducing unnecessary re-renders and improving performance without manual tweaks. You can still rely on &lt;code&gt;useMemo&lt;/code&gt; and &lt;code&gt;useCallback&lt;/code&gt; for fine-grained control when needed, but many optimizations are now handled seamlessly by the compiler itself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82" rel="noopener noreferrer"&gt;React Native 0.82 - A New Era&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bun.com/blog/bun-v1.3" rel="noopener noreferrer"&gt;Bun 1.3 Released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nodejs.org/en/blog/release/v24.10.0" rel="noopener noreferrer"&gt;Node.js v24.10.0 (Current)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nextjs.org/blog/next-16-beta" rel="noopener noreferrer"&gt;Next.js 16 (beta) released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cratedb.com/blog/new-release-cratedb-6.0" rel="noopener noreferrer"&gt;New Release: CrateDB 6.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/olegshulyakov/llama.ui/releases/tag/v2.38.2" rel="noopener noreferrer"&gt;llama.ui v2.38.2 released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/microsoft/playwright/releases/tag/v1.56.0" rel="noopener noreferrer"&gt;playwright v1.56.0 released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/capricorn86/happy-dom/releases/tag/v20.0.0" rel="noopener noreferrer"&gt;Happy DOM v20.0 released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/openai/openai-node" rel="noopener noreferrer"&gt;openai-node v6.4.0 released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/marmelab/react-admin/releases/tag/v5.12.0" rel="noopener noreferrer"&gt;React Admin v5.12.0&lt;/a&gt;, &lt;a href="https://github.com/TanStack/router/releases/tag/v1.133.0" rel="noopener noreferrer"&gt;TanStack Router 1.133&lt;/a&gt;, &lt;a href="https://github.com/react-hook-form/react-hook-form/releases/tag/v7.65.0" rel="noopener noreferrer"&gt;React Hook Form v7.65.0&lt;/a&gt;, &lt;a href="https://github.com/pixijs/pixijs/releases/tag/v8.14.0" rel="noopener noreferrer"&gt;Pixijs v8.14.0&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📺 Videos
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=gdRCIOn5zVA" rel="noopener noreferrer"&gt;RabbitMQ Crash Course #1 – Setup, Queues &amp;amp; Why Message Brokers Matter Node js + Docker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=5KkaaYl5rwA" rel="noopener noreferrer"&gt;React Coding Interview: Kent C. Dodds, Jack Herrington &amp;amp; Roadside Coder Solve React HARD Question&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=GOejI6c0CMQ" rel="noopener noreferrer"&gt;Meta's most dystopian product yet...&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=P8rrhZTPEAQ" rel="noopener noreferrer"&gt;99% of Developers Don't Get PostgreSQL&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=0ZUkQF6boNg" rel="noopener noreferrer"&gt;AI Coding Sucks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=CBCujAQtdfQ" rel="noopener noreferrer"&gt;Big Tech Is Faking Revenue&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=5cAjuIxIvHg" rel="noopener noreferrer"&gt;Extremely Underrated Programming Skills&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎤 Talks &amp;amp; Podcasts
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://thecsspodcast.libsyn.com/93-state-queries-in-2025" rel="noopener noreferrer"&gt;CSS Podcast 93: State queries in 2025&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🗞️ News &amp;amp; Updates
&lt;/h2&gt;

&lt;p&gt;🕹️ The JS13KGames 2025 competition has wrapped up, and &lt;a href="https://js13kgames.com/2025/blog/winners-announced" rel="noopener noreferrer"&gt;the winners have been announced&lt;/a&gt;! Explore this year’s top entries — all built in under 13KB of JavaScript — to play inventive mini-games or dive into their clever, size-optimized source code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://socket.dev/blog/npm-trusted-publishing" rel="noopener noreferrer"&gt;npm Adopts OIDC for Trusted Publishing in CI/CD Workflows&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://triplex.dev/blog/triplex-moves-to-pmndrs" rel="noopener noreferrer"&gt;Triplex Goes Open Source and Moves to Poimandres&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🤖 &lt;a href="https://mastra.ai/" rel="noopener noreferrer"&gt;Mastra&lt;/a&gt;, a rapidly growing TypeScript-based AI framework founded by former members of the Gatsby team, &lt;a href="https://mastra.ai/blog/seed-round" rel="noopener noreferrer"&gt;has secured a $13 million seed&lt;/a&gt; round to accelerate development and expand its ecosystem of AI tools for developers.&lt;/p&gt;




&lt;p&gt;That’s a wrap for this edition of &lt;a href="https://jsdev.space/friday/" rel="noopener noreferrer"&gt;Friday Links&lt;/a&gt;! Keep exploring, building, and sharing your favorite finds with the community. Check back next Friday for another round of JavaScript updates, tools, and ideas that push the web forward.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>node</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Understanding CSS Priority — The Cascade Explained</title>
      <dc:creator>JSDev Space</dc:creator>
      <pubDate>Thu, 16 Oct 2025 15:11:30 +0000</pubDate>
      <link>https://dev.to/jsdevspace/understanding-css-priority-the-cascade-explained-5gai</link>
      <guid>https://dev.to/jsdevspace/understanding-css-priority-the-cascade-explained-5gai</guid>
      <description>&lt;h2&gt;
  
  
  Mastering the Priority of CSS Styles
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity" rel="noopener noreferrer"&gt;CSS Cascading and Specificity&lt;/a&gt; are the foundation of how browsers decide which styles to apply. In this article, we’ll explore how multiple CSS rules interact and which one takes precedence — from classic specificity formulas to modern &lt;code&gt;@layer&lt;/code&gt; rules.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 Let’s Start with a Simple Example
&lt;/h2&gt;

&lt;p&gt;When multiple CSS classes are applied to one element:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"blue red green"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;What color is this text?&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.blue&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.red&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.green&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final color is &lt;strong&gt;green&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
This happens because CSS follows a &lt;strong&gt;cascading order&lt;/strong&gt;, where later declarations take precedence when all else is equal.&lt;/p&gt;


&lt;h2&gt;
  
  
  🕰️ The Birth of Cascading
&lt;/h2&gt;

&lt;p&gt;When CSS was first introduced in 1996, &lt;em&gt;cascading&lt;/em&gt; was its key concept.&lt;br&gt;&lt;br&gt;
The design goals were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎯 &lt;strong&gt;Predictability:&lt;/strong&gt; Developers can reason about the final result.
&lt;/li&gt;
&lt;li&gt;⚙️ &lt;strong&gt;Flexibility:&lt;/strong&gt; Allow style overrides and inheritance.
&lt;/li&gt;
&lt;li&gt;⚖️ &lt;strong&gt;Balance:&lt;/strong&gt; Respect both author and user styles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This concept, created by &lt;strong&gt;Håkon Wium Lie&lt;/strong&gt;, was meant to handle conflicts between multiple sources — author styles, user styles, and browser defaults.&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚖️ The System of Cascading Priorities
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🎯 Specificity Formula
&lt;/h3&gt;

&lt;p&gt;Specificity is represented as a four-part tuple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(Inline, ID selectors, Class/Attribute/Pseudo-class, Element selectors)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Style Type&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Inline style&lt;/td&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;style="color: red"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ID selector&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;#header&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Class/attribute/pseudo-class&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;.active, [type=text]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Element selector&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;div, p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Universal selector&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  🔍 Real Examples
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Specificity: (0, 0, 1, 1) = 11 */&lt;/span&gt;
&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="nc"&gt;.blue&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Specificity: (0, 1, 0, 0) = 100 */&lt;/span&gt;
&lt;span class="nf"&gt;#content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Specificity: (0, 0, 2, 1) = 21 */&lt;/span&gt;
&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="nc"&gt;.blue.active&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Inline style: (1, 0, 0, 0) = 1000 */&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="nt"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"color: yellow;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Note:&lt;/strong&gt; Ten class selectors will never outweigh a single ID selector.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📝 Overriding Rules at Equal Priority
&lt;/h2&gt;

&lt;p&gt;When selectors share the same specificity, &lt;strong&gt;source order&lt;/strong&gt; decides which one wins.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.blue&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.red&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.green&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;HTML order doesn’t matter — only the CSS definition order does:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"green blue red"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Green&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"red green blue"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Green&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"blue red green"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Green&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎨 Priority in Complex Scenarios
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="nc"&gt;.red&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;           &lt;span class="c"&gt;/* 11 */&lt;/span&gt;
  &lt;span class="nc"&gt;.blue.text&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;       &lt;span class="c"&gt;/* 20 */&lt;/span&gt;
  &lt;span class="nf"&gt;#content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;        &lt;span class="c"&gt;/* 100 */&lt;/span&gt;
  &lt;span class="nc"&gt;.yellow&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;yellow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;        &lt;span class="c"&gt;/* 10 (later defined) */&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"red blue text yellow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    What color is this?
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Result: &lt;strong&gt;Green&lt;/strong&gt; — because the ID selector has the highest priority.&lt;br&gt;&lt;br&gt;
If the ID is removed, &lt;strong&gt;blue.text&lt;/strong&gt; (20) wins over &lt;strong&gt;red&lt;/strong&gt; (11).&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚡ The Power of &lt;code&gt;!important&lt;/code&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.blue&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.red&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.green&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;!important&lt;/code&gt; overrides all other declarations, even with lower specificity.&lt;/p&gt;
&lt;h3&gt;
  
  
  💡 Usage Tips
&lt;/h3&gt;

&lt;p&gt;✅ Use for overriding library defaults or utility classes.&lt;br&gt;&lt;br&gt;
❌ Avoid in component-level styles — it leads to “priority wars.”&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠️ Best Practices in CSS Architecture
&lt;/h2&gt;

&lt;p&gt;A recommended CSS priority structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* 1. Reset styles — lowest priority */&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* 2. Base elements */&lt;/span&gt;
&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Arial&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* 3. Layout classes */&lt;/span&gt;
&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1200px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* 4. Components */&lt;/span&gt;
&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* 5. States */&lt;/span&gt;
&lt;span class="nc"&gt;.button.active&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* 6. Utilities — highest */&lt;/span&gt;
&lt;span class="nc"&gt;.text-center&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🎯 Avoiding Conflicts
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use BEM naming:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;   &lt;span class="nc"&gt;.card__title--highlighted&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of deeply nested selectors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;   &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nc"&gt;.content&lt;/span&gt; &lt;span class="nc"&gt;.title.highlighted&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&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;ol&gt;
&lt;li&gt;
&lt;strong&gt;Modular CSS-in-JS:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
     &lt;span class="na"&gt;subtitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
   &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Custom properties for flexibility:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;   &lt;span class="nc"&gt;.theme-blue&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;--primary-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--primary-color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;gray&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;h2&gt;
  
  
  🆕 Modern CSS: Cascade Layers
&lt;/h2&gt;

&lt;p&gt;CSS now includes the powerful &lt;code&gt;@layer&lt;/code&gt; feature:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.text-red&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cascade order:&lt;/strong&gt; &lt;code&gt;base &amp;lt; components &amp;lt; utilities&lt;/code&gt;&lt;br&gt;&lt;br&gt;
This gives fine-grained control and clarity for large projects.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔮 Logical Properties and Modern Trends
&lt;/h2&gt;

&lt;p&gt;As CSS evolves with globalization and layout flexibility, &lt;strong&gt;logical properties&lt;/strong&gt; change how cascading behaves:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.text&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;margin-inline-start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In browsers supporting logical properties, &lt;code&gt;margin-inline-start&lt;/code&gt; takes precedence over &lt;code&gt;margin-left&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/TR/css-cascade-5/" rel="noopener noreferrer"&gt;CSS Cascading Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity" rel="noopener noreferrer"&gt;MDN: CSS Specificity Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@layer" rel="noopener noreferrer"&gt;MDN: Cascade Layers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Friday Links 26: This Week in JavaScript</title>
      <dc:creator>JSDev Space</dc:creator>
      <pubDate>Fri, 22 Aug 2025 06:08:05 +0000</pubDate>
      <link>https://dev.to/jsdevspace/friday-links-26-this-week-in-javascript-3ahc</link>
      <guid>https://dev.to/jsdevspace/friday-links-26-this-week-in-javascript-3ahc</guid>
      <description>&lt;p&gt;It’s Friday, which means another edition of Friday Links! In issue #26 we’ve gathered the most interesting JavaScript updates from around the community. From new libraries to thoughtful guides and project showcases, here’s what caught our eye this week.&lt;/p&gt;

&lt;p&gt;Subscribe to Friday Links &lt;a href="https://jsdevspace.substack.com/" rel="noopener noreferrer"&gt;here&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%2F2b3pcfjngffdamr09ux0.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%2F2b3pcfjngffdamr09ux0.png" alt="Friday Links 26: This Week in JavaScript" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Allie: Human-Like AI Chess Bot on Lichess
&lt;/h3&gt;

&lt;p&gt;Since launch on Lichess, the &lt;a href="https://lichess.org/@/Allie" rel="noopener noreferrer"&gt;AI bot Allie&lt;/a&gt; has played over 11,600 games, winning more than 6,800. The bot is free and &lt;a href="https://github.com/ippolito-cmu/allie" rel="noopener noreferrer"&gt;open source&lt;/a&gt;, available only in blitz mode, where you can also &lt;a href="https://lichess.org/@/Allie" rel="noopener noreferrer"&gt;watch its games live&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Created by Carnegie Mellon PhD student Yimin Zhang, Allie was trained not on engine calculations but on 91 million human games, making its style strikingly human-like. Researchers note it performs at grandmaster level, while remaining an excellent and natural sparring partner for learning.&lt;/p&gt;

&lt;h3&gt;
  
  
  DBQuacks: A Quest Game to Learn SQL
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvhz2n1amfz5qcmmrbjse.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%2Fvhz2n1amfz5qcmmrbjse.png" alt="DBQuacks" width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dbquacks.com/" rel="noopener noreferrer"&gt;DBQuacks&lt;/a&gt; is a new SQL learning quest game. The first chapter (38 levels) introduces SQL basics with DuckDB through puzzles and story-driven tasks. Players solve mysteries by writing correct SQL queries, with hints and references available. A second chapter with advanced SQL features is coming soon.&lt;/p&gt;

&lt;h2&gt;
  
  
  📜 Articles &amp;amp; Tutorials
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://awsfundamentals.com/blog/aws-getting-started" rel="noopener noreferrer"&gt;How to Get Started with AWS in 2025&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/sumonta056/how-to-run-frontend-backend-together-with-one-command-no-docker-needed-29nd"&gt;How to Run Frontend &amp;amp; Backend Together with One Command (No Docker Needed)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.logrocket.com/how-to-optimize-next-js-app-after" rel="noopener noreferrer"&gt;How to optimize your Next.js app with after()&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/future-of-javascript/" rel="noopener noreferrer"&gt;The Future of JavaScript: What Awaits Us&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.freecodecamp.org/news/the-nextjs-15-streaming-handbook/" rel="noopener noreferrer"&gt;The Next.js 15 Streaming Handbook — SSR, React Suspense, and Loading Skeleton&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.joshwcomeau.com/svg/interactive-guide-to-paths/" rel="noopener noreferrer"&gt;An Interactive Guide to SVG Paths&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/local-ai-ollama-react/" rel="noopener noreferrer"&gt;Build a Local AI Chatbot with Ollama, React &amp;amp; Express&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://research.kudelskisecurity.com/2025/08/19/how-we-exploited-coderabbit-from-a-simple-pr-to-rce-and-write-access-on-1m-repositories/" rel="noopener noreferrer"&gt;How We Exploited CodeRabbit: From a Simple PR to RCE and Write Access on 1M Repositories&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/gemini-cli-custom-commands/" rel="noopener noreferrer"&gt;Mastering Gemini CLI: Create, Optimize &amp;amp; Automate Commands&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ntietz.com/blog/visualizing-distributions-with-pepperoni-pizza/" rel="noopener noreferrer"&gt;Visualizing distributions with pepperoni pizza (and javascript)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://zed.dev/blog/why-llms-cant-build-software" rel="noopener noreferrer"&gt;Why LLMs Can't Really Build Software&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/howto/rtk-query-redux-alternative/" rel="noopener noreferrer"&gt;Howto Simplify Redux with RTK Query in React Projects&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://prava.co/archon/" rel="noopener noreferrer"&gt;Teaching GPT-5 to Use a Computer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/howto/tanstack-query-api-factory/" rel="noopener noreferrer"&gt;Accelerating API Development with TanStack Query&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.docuseal.com/blog/make-any-website-load-faster-with-6-lines-html" rel="noopener noreferrer"&gt;Make any website load faster with 6 lines of HTML&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://christianheilmann.com/2025/08/11/using-github-pages-as-a-url-shortener-redirection-service/" rel="noopener noreferrer"&gt;Using GitHub Pages as a URL shortener / redirection service&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://natalie.sh/posts/bluesky-comments/" rel="noopener noreferrer"&gt;Building Bluesky Comments for My Blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/howto/vite-module-federation-404/" rel="noopener noreferrer"&gt;Fixing Vite Module Federation Errors When Starting Apps Separately&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://atlaspuplabs.com/blog/liquid-glass-but-in-css" rel="noopener noreferrer"&gt;Liquid Glass, but in CSS&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚒️ Tools
&lt;/h2&gt;

&lt;p&gt;🍃 Ethersync&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%2Fmb7by3e13bulxp8z6r4q.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%2Fmb7by3e13bulxp8z6r4q.png" alt="Ethersync" width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ethersync enables real-time collaborative editing of local text files. You can use it for pair programming or note-taking, for example. It's the missing real-time complement to Git!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/law-chain-hot/websocket-devtools" rel="noopener noreferrer"&gt;WebSocket DevTools&lt;/a&gt; - Complete WebSocket Traffic Control with advanced proxy, simulation, and blocking capabilities&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ethersync/ethersync" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/WCY-dt/ponghub" rel="noopener noreferrer"&gt;PongHub&lt;/a&gt; - Free endpoint monitoring. One-click deployment. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://jwtauditor.com/" rel="noopener noreferrer"&gt;JWTAuditor&lt;/a&gt; - A tool to audit JWTs (JSON Web Tokens) for security vulnerabilities and best practices.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/f/mcptools" rel="noopener noreferrer"&gt;MCP Tools&lt;/a&gt; - A comprehensive command-line interface for interacting with MCP (Model Context Protocol) servers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/jobpare/cvgen" rel="noopener noreferrer"&gt;Jobpare CV Generator&lt;/a&gt; - A tool to generate professional CVs in various formats.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/gradio-app/trackio" rel="noopener noreferrer"&gt;Trackio&lt;/a&gt; - A lightweight, local-first, and free experiment tracking Python library built on top of 🤗 Datasets and Spaces.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/luminal-ai/luminal" rel="noopener noreferrer"&gt;Luminal&lt;/a&gt; - Deep learninglibrary that uses search-based compilation to achieve high performance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://agents.md/" rel="noopener noreferrer"&gt;AGENTS.md&lt;/a&gt; - A simple, open format for guiding coding agents, used by over 20k open-source projects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/karpathy/rendergit" rel="noopener noreferrer"&gt;rendergit&lt;/a&gt; - Render any git repo into a single static HTML page for humans or LLMs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ngafar/llama-scan" rel="noopener noreferrer"&gt;llama-scan&lt;/a&gt; - A tool for converting PDFs to text files using Ollama.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/anthropics/anthropic-cookbook" rel="noopener noreferrer"&gt;Anthropic Cookbook&lt;/a&gt; - A collection of examples and best practices for using Anthropic's AI models.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://panda-css.com/" rel="noopener noreferrer"&gt;Panda CSS&lt;/a&gt; - A CSS-in-JS library that allows you to write CSS in JavaScript with a focus on performance and developer experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nolanlawson/fuite" rel="noopener noreferrer"&gt;fuite&lt;/a&gt; - A tool to detect memory leaks in JavaScript applications by tracking memory usage over time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://animateicons.vercel.app/" rel="noopener noreferrer"&gt;AnimateIcons&lt;/a&gt; - A sleek React library that transforms SVGs into smooth, purposeful animations — lightweight, customizable, and built with motion/react.&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 Libs
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/MotiaDev/motia" rel="noopener noreferrer"&gt;Motia&lt;/a&gt; - local-first tool for creating professional resumes from JSON data and HTML templates. Features web editor, CLI tool, role-specific guidance, and PDF output. Perfect for developers and professionals who want full control over their CV presentation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/firecrawl/open-lovable" rel="noopener noreferrer"&gt;Open Lovable&lt;/a&gt; - About&lt;br&gt;
🔥 Clone and recreate any website as a modern React app in seconds&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/opactorai/Claudable" rel="noopener noreferrer"&gt;Claudable&lt;/a&gt; - Connect Claude Code. Build what you want. Deploy instantly. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/KittenML/KittenTTS" rel="noopener noreferrer"&gt;KittenTTS&lt;/a&gt; - is an open-source realistic text-to-speech model with just 15 million parameters, designed for lightweight deployment and high-quality voice synthesis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/wcandillon/react-native-webgpu" rel="noopener noreferrer"&gt;React Native WebGPU&lt;/a&gt; - A React Native library that provides WebGPU support for high-performance graphics and compute on mobile devices.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/entronad/crypto-es" rel="noopener noreferrer"&gt;CryptoES&lt;/a&gt; - A JavaScript library for cryptographic operations, including hashing, encryption, and decryption.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/vpulim/node-soap" rel="noopener noreferrer"&gt;node-soap&lt;/a&gt; - A SOAP client and server for Node.js, allowing you to create and consume SOAP web services.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://andreruffert.github.io/syntax-highlight-element/" rel="noopener noreferrer"&gt;syntax-highlight-element&lt;/a&gt; - A web component for syntax highlighting code snippets in HTML documents, supporting multiple languages and themes.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⌚ Releases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Git 2.51 Released: Preparing for Git 3.0
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqa0an0cdo6scipr7i6y5.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%2Fqa0an0cdo6scipr7i6y5.png" alt="Git 2.51" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On August 18, 2025, &lt;a href="https://github.blog/open-source/git/highlights-from-git-2-51/" rel="noopener noreferrer"&gt;Git 2.51 was released with 506 changes&lt;/a&gt; from 91 contributors. This update prepares for Git 3.0, which will switch the default hash from SHA-1 to SHA-256 and adopt the reftable backend. Key improvements include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;git cat-file&lt;/code&gt;: better handling of missing objects and submodules.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git log&lt;/code&gt;: faster history search with Bloom filters.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git switch &amp;amp; git restore&lt;/code&gt;: now stable replacements for git checkout.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git whatchanged&lt;/code&gt;: deprecated, set for removal in Git 3.0.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New options&lt;/strong&gt;: &lt;code&gt;--start-after&lt;/code&gt; for git &lt;code&gt;for-each-ref&lt;/code&gt;, &lt;code&gt;--compact-summary&lt;/code&gt; for &lt;code&gt;git merge&lt;/code&gt; and &lt;code&gt;git pull&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance boosts&lt;/strong&gt;: &lt;code&gt;git push&lt;/code&gt; and &lt;code&gt;git fetch&lt;/code&gt; are faster, especially with reftable (22× faster fetch, 18× faster push in large repos).&lt;/li&gt;
&lt;li&gt;C99 support: broader use of modern C features.&lt;/li&gt;
&lt;li&gt;Patch policy: pseudonyms now allowed for contributions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://nextjs.org/blog/next-15-4" rel="noopener noreferrer"&gt;Next.js 15.4 Released&lt;/a&gt; - This release includes new features like &lt;code&gt;next/image&lt;/code&gt; improvements, enhanced performance, and more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.postgresql.org/about/news/autobase-230-released-3104/" rel="noopener noreferrer"&gt;Autobase 2.3.0 released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://api-docs.deepseek.com/news/news250821" rel="noopener noreferrer"&gt;DeepSeek-v3.1 Release&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nuxt.com/blog/v4" rel="noopener noreferrer"&gt;Announcing Nuxt 4.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://astro.build/blog/astro-5120/" rel="noopener noreferrer"&gt;Astro 5.12 Released&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://nodejs.org/en/blog/release/v24.6.0" rel="noopener noreferrer"&gt;Node.js v24.6.0 (Current) Released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reactnative.dev/blog/2025/08/12/react-native-0.81" rel="noopener noreferrer"&gt;React Native 0.81 Released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/1111mp/nvm-desktop/releases/tag/v4.1.0" rel="noopener noreferrer"&gt;NVM Desktop v4.1.0&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📺 Videos
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=d3cMODi1CtU" rel="noopener noreferrer"&gt;How to Create a Minimap in Three.js with React Three Fiber (Drei View)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=BTfcnxXevm0" rel="noopener noreferrer"&gt;Build &amp;amp; Deploy 3 Full-stack Mobile Apps That’ll Get You Hired | Full 10-Hour React Native Course&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=bFLGwVyIotA" rel="noopener noreferrer"&gt;Multi-Tenant SaaS Architecture in 3 Simple Steps&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=oDgkM7G8ezU&amp;amp;ab_channel=edureka%21" rel="noopener noreferrer"&gt;Linux Full Course - 10 Hours [2025]&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=6fXNWBFPfRM&amp;amp;t=9246s&amp;amp;ab_channel=CodeWithAntonio" rel="noopener noreferrer"&gt;Build and Deploy a Multi-Vendor E-Commerce Marketplace with Nextjs, React, Stripe Connect, MongoDB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=xqoYkX4hfwg&amp;amp;t=515s&amp;amp;ab_channel=JanMarshal" rel="noopener noreferrer"&gt;Create an LMS Course Platform with Next.js, Arcjet, Better-Auth, and Stripe&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=X1zCAPLvMtw&amp;amp;t=1s&amp;amp;ab_channel=EdRoh" rel="noopener noreferrer"&gt;Build an Enterprise Nextjs Rental App | AWS, EC2, Cognito, Shadcn, RDS, S3, Node, React&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=xIfSwINNM40&amp;amp;ab_channel=WebDevSimplified" rel="noopener noreferrer"&gt;Build an AI-Powered Job Board From Scratch with Next.js 15, Drizzle, Tailwind&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=oxEmHmx4jm4&amp;amp;ab_channel=SangamMukherjee" rel="noopener noreferrer"&gt;Next.js 15 Full Course 2025 | Drizzle, Better Auth, Postgres, TypeScript | 14 Hours&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=OqlI2766LCk&amp;amp;list=PLv8XNy31mAPq__ZitIrgMrb4vI2I2hZKs&amp;amp;ab_channel=ElliottChong" rel="noopener noreferrer"&gt;Build and Deploy Full Stack AI GitHub SaaS | Next JS 15, Google Gemini AI, Assembly AI, Stripe&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=CAr02YlEJUc&amp;amp;ab_channel=CodeWithAntonio" rel="noopener noreferrer"&gt;Build and Deploy a B2B SaaS AI Support Platform | Next.js 15, React, Convex, Turborepo, Vapi, AWS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=XiD_TsGRQtE&amp;amp;ab_channel=Becodemy" rel="noopener noreferrer"&gt;Let's build a multi-vendor E-Commerce SaaS by using Microservice Architecture, ImageKit&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎤 Talks &amp;amp; Podcasts
&lt;/h2&gt;

&lt;p&gt;No content this week 😢&lt;/p&gt;

&lt;h2&gt;
  
  
  🗞️ News &amp;amp; Updates
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OpenAI CFO: $1B Monthly Revenue, But Compute Shortage Looms
&lt;/h3&gt;

&lt;p&gt;In an &lt;a href="https://www.cnbc.com/2025/08/20/openai-compute-ai.html" rel="noopener noreferrer"&gt;interview with CNBC&lt;/a&gt;, OpenAI CFO Sarah Friar revealed the company generated over $1 billion in revenue in July 2025, projecting $12.7B for the year. Yet the main challenge remains severe compute shortages.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Stargate project launched to expand compute, with partners including Oracle and CoreWeave.&lt;/li&gt;
&lt;li&gt;Microsoft partnership remains central — as both investor and primary compute provider.&lt;/li&gt;
&lt;li&gt;Despite a rocky GPT-5 launch, OpenAI has seen rising Plus and Pro subscriptions.&lt;/li&gt;
&lt;li&gt;Analysts expect an $8B negative cash flow in 2025; Stargate’s long-term investment is valued at $500B, with Altman hinting at “trillions” for future data centers and chips.&lt;/li&gt;
&lt;li&gt;Friar notes OpenAI may one day sell compute to third parties, becoming an “AWS for AI”, but for now lacks the capacity even for its own work.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  IBM &amp;amp; NASA Launch Surya AI to Predict Solar Storms
&lt;/h3&gt;

&lt;p&gt;IBM and NASA have unveiled Surya, an &lt;a href="https://huggingface.co/ibm-nasa/Surya" rel="noopener noreferrer"&gt;open-source AI model&lt;/a&gt; designed to forecast solar flares and coronal mass ejections before they strike Earth. Built on the world’s largest heliophysics dataset, Surya analyzes high-resolution solar images to predict dangerous events that can disrupt satellites, power grids, telecoms, and navigation systems.&lt;/p&gt;

&lt;p&gt;Highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trained on 9 years of NASA’s Solar Dynamics Observatory images.&lt;/li&gt;
&lt;li&gt;Improves solar flare classification accuracy by 16%.&lt;/li&gt;
&lt;li&gt;First steps toward visual forecasting of flares, with warnings up to 2 hours ahead.&lt;/li&gt;
&lt;li&gt;Openly available for research on &lt;a href="https://huggingface.co/ibm-nasa/Surya" rel="noopener noreferrer"&gt;Hugging Face&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Builds on IBM &amp;amp; NASA’s earlier &lt;a href="https://huggingface.co/ibm-nasa/Prithvi" rel="noopener noreferrer"&gt;Prithvi&lt;/a&gt; Earth observation AI models.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Researchers call Surya a “weather forecaster for the Sun”, a critical step in protecting modern infrastructure from Carrington-level solar storms.&lt;/p&gt;

&lt;p&gt;That’s a wrap for &lt;a href="https://jsdev.space/friday/friday-26/" rel="noopener noreferrer"&gt;Friday Links 26&lt;/a&gt;. We hope these resources give you fresh ideas to explore over the weekend. Share this roundup with your fellow developers, and check back next Friday for more highlights from the JavaScript ecosystem.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>backend</category>
    </item>
    <item>
      <title>JavaScript Weekly #25 – What Devs Loved This Week (Aug 01, 2025)</title>
      <dc:creator>JSDev Space</dc:creator>
      <pubDate>Fri, 01 Aug 2025 12:19:30 +0000</pubDate>
      <link>https://dev.to/jsdevspace/javascript-weekly-25-what-devs-loved-this-week-aug-01-2025-1i9b</link>
      <guid>https://dev.to/jsdevspace/javascript-weekly-25-what-devs-loved-this-week-aug-01-2025-1i9b</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F47ttjhk8xvv6pgb595ur.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%2F47ttjhk8xvv6pgb595ur.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Welcome to &lt;a href="https://jsdevspace.substack.com/p/friday-js-roundup-25-august-1-2025" rel="noopener noreferrer"&gt;Issue #25&lt;/a&gt; of the JavaScript Weekly Roundup — your go-to source for what’s new, useful, and exciting in the JavaScript world.&lt;br&gt;
Each Friday, we gather the most talked-about updates, from powerful new libraries to smart tips and ideas worth exploring. Whether you’re polishing components or digging into server-side logic, this list will keep your dev stack fresh.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistral Launches Codestral Ecosystem as Enterprise AI Coding Suite
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mistral.ai/solutions/coding" rel="noopener noreferrer"&gt;Mistral has introduced&lt;/a&gt; its response to GitHub Copilot: a comprehensive enterprise development ecosystem powered by its &lt;strong&gt;Codestral&lt;/strong&gt; model family. At the core is &lt;strong&gt;Codestral 25.08&lt;/strong&gt;, an updated model fine-tuned for real-world software environments.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 Model Improvements
&lt;/h3&gt;

&lt;p&gt;Codestral 25.08 delivers measurable gains based on real codebase benchmarks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;30% more accepted completions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;📈 &lt;strong&gt;10% more preserved code&lt;/strong&gt; after applying suggestions
&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;50% fewer overly long or incorrect generations&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These enhancements aim to streamline development and reduce common friction points in AI-assisted coding—especially in enterprise-scale projects.&lt;/p&gt;




&lt;p&gt;Codestral isn’t just a model update—it’s Mistral’s strategic move toward building a full-featured coding assistant ecosystem for large teams and production systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  # Qwen 3 Coder: Alibaba’s Open 480B MoE Model for Programming
&lt;/h2&gt;

&lt;p&gt;Alibaba has released &lt;strong&gt;Qwen 3 Coder&lt;/strong&gt;, an open-source Mixture-of-Experts (MoE) model built for programming tasks. The model boasts &lt;strong&gt;480 billion parameters&lt;/strong&gt; (with 35B active at any time) and was trained on &lt;strong&gt;7.5 trillion tokens&lt;/strong&gt;, of which &lt;strong&gt;70% are code&lt;/strong&gt;. It’s designed to solve real-world tasks and demonstrates performance comparable to &lt;strong&gt;Claude 4 Sonnet&lt;/strong&gt; on code and tool usage benchmarks.&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%2F3dl1uiti3ycbx0k8xt8c.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%2F3dl1uiti3ycbx0k8xt8c.png" alt="Qwen 3 Coder" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;480B total / 35B active parameters&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;7.5T tokens training corpus&lt;/strong&gt;, heavily code-focused
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;256K context length&lt;/strong&gt;, scalable up to &lt;strong&gt;1M tokens&lt;/strong&gt; using &lt;strong&gt;YaRN&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Trained using &lt;strong&gt;RL at scale&lt;/strong&gt;, with 20K parallel environments&lt;/li&gt;
&lt;li&gt;Emphasizes real-world scenarios and tool usage&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;The training approach lets the model learn from its own mistakes, thanks to a large-scale reinforcement learning setup.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  💰 Pricing &amp;amp; Availability
&lt;/h3&gt;

&lt;p&gt;The major downside of Qwen 3 Coder is its &lt;strong&gt;expensive API&lt;/strong&gt; access:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At &lt;strong&gt;1M context tokens&lt;/strong&gt;, pricing can reach &lt;strong&gt;$6–$60 per million tokens&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Developers are encouraged to use &lt;strong&gt;alternative API providers&lt;/strong&gt; that support up to &lt;strong&gt;262K context&lt;/strong&gt; and are &lt;strong&gt;3–4x cheaper&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔗 GitHub Repository
&lt;/h3&gt;

&lt;p&gt;The model and further resources are available here:&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://github.com/QwenLM/Qwen3-Coder" rel="noopener noreferrer"&gt;https://github.com/QwenLM/Qwen3-Coder&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Qwen 3 Coder is a major step forward in open LLMs optimized for software development and tool interactions. While pricing may be high for some use cases, the availability of alternatives makes it flexible for research and production alike.&lt;/p&gt;

&lt;h2&gt;
  
  
  📜 Articles &amp;amp; Tutorials
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://css-tip.com/nth-child/" rel="noopener noreferrer"&gt;Dynamic nth-child() using sibling-index() and if()&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.builder.io/blog/figma-mcp-server" rel="noopener noreferrer"&gt;Design to Code with the Figma MCP Server&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://devtron.ai/blog/microservices-ci-cd-best-practices/" rel="noopener noreferrer"&gt;CI/CD Best Practices for Microservices Architecture&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://coralogix.com/blog/using-the-opentelemetry-operator-to-boost-your-observability/" rel="noopener noreferrer"&gt;Using the OpenTelemetry Operator to boost your observability&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.lorenstew.art/blog/always-architect-with-contraints" rel="noopener noreferrer"&gt;Architecting with Constraints: A Pragmatic Guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.epicreact.dev/react-server-components-how-we-got-here-zcuxn" rel="noopener noreferrer"&gt;React Server Components: How We Got Here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.freecodecamp.org/news/how-to-upload-large-objects-to-s3-with-aws-cli-multipart-upload/" rel="noopener noreferrer"&gt;How to Upload Large Objects to S3 with AWS CLI Multipart Upload&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.totaltypescript.com/how-to-create-an-npm-package" rel="noopener noreferrer"&gt;How To Create An NPM Package&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.docker.com/blog/leveraging-docker-with-tensorflow/" rel="noopener noreferrer"&gt;Leveraging Docker with TensorFlow Models &amp;amp; TensorFlow.js for a Snake AI Game&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://css-tricks.com/the-gap-strikes-back-now-stylable/" rel="noopener noreferrer"&gt;The Gap Strikes Back: Now Stylable&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.taekim.dev/writing/parsing-1b-rows-in-bun" rel="noopener noreferrer"&gt;Parsing 1 Billion Rows in Bun/Typescript Under 10 Seconds&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://frontendmasters.com/blog/liquid-glass-on-the-web/" rel="noopener noreferrer"&gt;Liquid Glass on the Web&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://una.im/scroll-target-group/" rel="noopener noreferrer"&gt;Creating a scroll-spy with 2 lines of CSS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cthiriet.com/blog/nano-claude-code" rel="noopener noreferrer"&gt;A Full Code Agent in 200 Lines—Here’s How&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://prismic.io/blog/tailwind-css-grid" rel="noopener noreferrer"&gt;Tailwind CSS Grid: Complete Guide &amp;amp; Examples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/howto/calendar-table-sql/" rel="noopener noreferrer"&gt;Howto Generate a Calendar Table in SQL&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/react-19-hydration-guide/" rel="noopener noreferrer"&gt;Hydration in React 19: Smarter, Faster, and Fully Optimized&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/git-time-saving-commands/" rel="noopener noreferrer"&gt;Git Smarter: 7 Essential Commands Every Dev Should Know&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚒️ Tools
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/OpenCut-app/OpenCut" rel="noopener noreferrer"&gt;OpenCut&lt;/a&gt; - Cap-Cut's open-source alternative&lt;/p&gt;

&lt;p&gt;&lt;a href="https://filepursuit.com/" rel="noopener noreferrer"&gt;FilePursuit&lt;/a&gt; -  is a free search tool for finding files online—documents, APKs, ZIPs, images, videos, books, and PDFs—scanned directly from public sources.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://patterncraft.fun/" rel="noopener noreferrer"&gt;Craft Beautiful Patterns Backgrounds&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://canine.sh" rel="noopener noreferrer"&gt;Canine&lt;/a&gt; - A modern, open source alternative to Heroku&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.jsv9000.app/" rel="noopener noreferrer"&gt;JavaScript Visualizer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/a-h-abid/docker-commons" rel="noopener noreferrer"&gt;docker-commons&lt;/a&gt; - All common docker scripts in one place&lt;/p&gt;

&lt;p&gt;&lt;a href="https://picossg.dev/" rel="noopener noreferrer"&gt;PicoSSG&lt;/a&gt; - The anti-framework static site generator. No config. No nonsense Just files in, files out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/stan-smith/FossFLOW" rel="noopener noreferrer"&gt;FossFLOW&lt;/a&gt; - Make beautiful isometric infrastructure diagrams&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/chatwoot/chatwoot" rel="noopener noreferrer"&gt;Chatwoot&lt;/a&gt; - An Open Source Zendesk Alternative&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/sheshbabu/zen" rel="noopener noreferrer"&gt;zen&lt;/a&gt; - Selfhosted notes app. Single golang binary, notes stored as markdown within SQLite, full-text search, very low resource usage&lt;/p&gt;

&lt;p&gt;&lt;a href="https://layout.bradwoods.io/" rel="noopener noreferrer"&gt;CSS Layout Generator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.browseros.com/" rel="noopener noreferrer"&gt;The Open-Source Agentic Browser&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svgdoodles.com/" rel="noopener noreferrer"&gt;SVG Doodles Collection&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 Libs
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/f/awesome-chatgpt-prompts" rel="noopener noreferrer"&gt;awesome-chatgpt-prompts&lt;/a&gt; - This repo includes ChatGPT prompt curation to use ChatGPT and other LLM tools better.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/apexcharts/apexcharts.js" rel="noopener noreferrer"&gt;apexcharts.js&lt;/a&gt; - 📊 Interactive JavaScript Charts built on SVG&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/xiangechen/chili3d" rel="noopener noreferrer"&gt;chili3d&lt;/a&gt; - A web-based 3D CAD application for online model design and editing&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/dahlia/upyo" rel="noopener noreferrer"&gt;upyo&lt;/a&gt; - Upyo is a simple and cross-runtime library for sending email messages using SMTP and various email providers. It works on Node.js, Deno, Bun, and edge functions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mapbox/concaveman" rel="noopener noreferrer"&gt;concaveman&lt;/a&gt; - A very fast 2D concave hull algorithm in JavaScript&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/VIDA-NYU/reprozip" rel="noopener noreferrer"&gt;ReproZip&lt;/a&gt; - is a tool that simplifies the process of creating reproducible experiments from command-line executions, a frequently-used common denominator in computational science. &lt;/p&gt;

&lt;h2&gt;
  
  
  ⌚ Releases
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://nextjs.org/blog/next-15-4" rel="noopener noreferrer"&gt;Next.js 15.4 Released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://astro.build/blog/astro-5120/" rel="noopener noreferrer"&gt;Astro 5.12&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rustdesk/rustdesk/releases/tag/1.4.1" rel="noopener noreferrer"&gt;RustDesk 1.4.1&lt;/a&gt; - a self-hosted open-source remote desktop app and TeamViewer alternative, was released in July 2025. Built with Rust and Dart, it's AGPL-licensed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/sourcebot-dev/sourcebot/releases/tag/v4.6.0" rel="noopener noreferrer"&gt;Sourcebot v4.6.0 Released&lt;/a&gt; -  a self-hosted tool that helps you understand your codebase. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://pixieditor.net/blog/2025/07/30/20-release/" rel="noopener noreferrer"&gt;PixiEditor 2.0 - a FOSS Universal 2D Graphics Editor is here!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nuxt.com/blog/v4" rel="noopener noreferrer"&gt;Announcing Nuxt 4.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bun.com/blog/bun-v1.2.19" rel="noopener noreferrer"&gt;Bun v1.2.19 Released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tiptap.dev/docs/resources/whats-new" rel="noopener noreferrer"&gt;Tiptap V3 Released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/openpgpjs/openpgpjs/releases/tag/v6.2.0" rel="noopener noreferrer"&gt;openpgpjs v6.2.0 Released&lt;/a&gt; - OpenPGP implementation for JavaScript&lt;/p&gt;

&lt;p&gt;&lt;a href="https://eslint.org/blog/2025/07/eslint-v9.31.0-released/" rel="noopener noreferrer"&gt;ESLint v9.31.0 released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/oxc-project/oxc/releases/tag/oxlint_v1.8.0" rel="noopener noreferrer"&gt;oxlint v1.8.0&lt;/a&gt; - ⚓ A collection of JavaScript tools written in Rust.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/wasp-lang/wasp/releases/tag/v0.17.0" rel="noopener noreferrer"&gt;wasp v0.17.0&lt;/a&gt; - The fastest way to develop full-stack web apps with React &amp;amp; Node.js.&lt;/p&gt;

&lt;h2&gt;
  
  
  📺 Videos
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=G5djZjdxVvo" rel="noopener noreferrer"&gt;How I Built a Web Scraping AI Agent - Use AI To Scrape ANYTHING&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=yTFC_MvwJvQ" rel="noopener noreferrer"&gt;99% of Developers Don't Get Git Rebase&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=PNhq_4d-5ek" rel="noopener noreferrer"&gt;Bash Scripting Tutorial for Beginners&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=ZSxo77jJBz4" rel="noopener noreferrer"&gt;How n8n Node Can Cut Your Costs by 90%&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=q3HE1dFiJBI" rel="noopener noreferrer"&gt;React Native Bootcamp in 30 HOURS for FREE 🎉&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=2NV1w1m9cTY" rel="noopener noreferrer"&gt;How I Built My Own Shadcn Library&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Yqi9wINTcf4" rel="noopener noreferrer"&gt;10x Your Neovim Experience&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=9bhNdw3fmQM" rel="noopener noreferrer"&gt;Build A Sick AI-Voice Memo App W/ Next.js + OpenAI Whisper (Background Jobs / Cron Job / Inngest)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=tBObk72EYYw" rel="noopener noreferrer"&gt;Build and Deploy a Full Stack Car Rental Booking App using React js &amp;amp; ImageKit | MERN Stack Project&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=iYOz165wGkQ" rel="noopener noreferrer"&gt;Build an Enterprise Ready AI Powered Applicant Tracking System&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=PtcQwb1uBhc" rel="noopener noreferrer"&gt;DON'T Use JSON.parse &amp;amp; JSON.stringify&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Wr2fOM_xD2I" rel="noopener noreferrer"&gt;Introducing React Native Reanimated 4&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎤 Talks &amp;amp; Podcasts
&lt;/h2&gt;

&lt;p&gt;No content this week 😢&lt;/p&gt;

&lt;h2&gt;
  
  
  🗞️ News &amp;amp; Updates
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot has surpassed 20 million users, Microsoft CEO Satya Nadella &lt;a href="https://www.microsoft.com/en-us/Investor/earnings/FY-2025-Q4/press-release-webcast" rel="noopener noreferrer"&gt;announced&lt;/a&gt;. GitHub confirmed the number reflects total usage to date.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bloomberg.com/news/articles/2025-07-29/figma-s-1-2-billion-ipo-approaching-40-times-oversubscribed?embedded-checkout=true" rel="noopener noreferrer"&gt;Figma raised $1.2B&lt;/a&gt; in its IPO, selling 36.9M shares at $33 each—above range. The company is now valued at $16.1B ($18.5B with options), nearing its scrapped Adobe deal.&lt;/p&gt;

&lt;p&gt;Thanks for reading this week’s roundup!&lt;br&gt;
We’ll be back next Friday with more handpicked JS content. Until then, keep experimenting, stay curious, and build cool things. 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>ai</category>
    </item>
    <item>
      <title>Say Goodbye to Try/Catch Blocks with the ECMAScript ?= Operator</title>
      <dc:creator>JSDev Space</dc:creator>
      <pubDate>Tue, 10 Jun 2025 02:57:28 +0000</pubDate>
      <link>https://dev.to/jsdevspace/say-goodbye-to-trycatch-blocks-with-the-ecmascript-operator-mog</link>
      <guid>https://dev.to/jsdevspace/say-goodbye-to-trycatch-blocks-with-the-ecmascript-operator-mog</guid>
      <description>&lt;p&gt;The ECMAScript proposal for the safe assignment operator &lt;code&gt;(?=)&lt;/code&gt; introduces a revolutionary way to handle errors in JavaScript. It borrows ideas from Rust, Go, and Swift—languages known for their clean error-handling patterns—and brings those benefits to JS developers.&lt;/p&gt;

&lt;p&gt;Instead of wrapping every async call in &lt;code&gt;try/catch&lt;/code&gt; blocks or nesting error-prone logic, &lt;code&gt;?=&lt;/code&gt; offers a clean, tuple-based alternative that promotes readability, consistency, and safety.&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%2Fq0tlypi7bfrt073qvd1k.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%2Fq0tlypi7bfrt073qvd1k.png" alt="the ECMAScript ?= Operator" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Traditional &lt;code&gt;try/catch&lt;/code&gt; Gets Messy
&lt;/h2&gt;

&lt;p&gt;JavaScript's try/catch can clutter your logic, especially when multiple async operations are involved.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌ Without &lt;code&gt;?=&lt;/code&gt;: Deep Nesting
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function fetchData() {
  try {
    const res = await fetch("https://api.example.com/data");
    try {
      const json = await res.json();
      return json;
    } catch (parseError) {
      console.error("Failed to parse JSON:", parseError);
    }
  } catch (networkError) {
    console.error("Network error:", networkError);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ✅ With ?=: Simpler Error Handling
&lt;/h2&gt;

&lt;p&gt;The safe assignment operator turns any async result into a destructurable tuple: &lt;code&gt;[error, value]&lt;/code&gt;. This makes code linear and easy to follow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function fetchData() {
  const [networkError, response] ?= await fetch("https://api.example.com/data");
  if (networkError) return console.error("Network error:", networkError);

  const [parseError, data] ?= await response.json();
  if (parseError) return console.error("Failed to parse JSON:", parseError);

  return data;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔍 How It Works: The Power of &lt;code&gt;Symbol.result&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The magic behind &lt;code&gt;?=&lt;/code&gt; lies in a special method: &lt;code&gt;Symbol.result&lt;/code&gt;. If an object implements it, that object can define how to unpack into [&lt;code&gt;error, result&lt;/code&gt;].&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function simulateFailure() {
  return {
    [Symbol.result]() {
      return [new Error("Oops! Something went wrong."), null];
    },
  };
}

const [err, value] ?= simulateFailure();
if (err) console.error(err.message); // "Oops! Something went wrong."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This provides the flexibility to adapt your own APIs or error-handling mechanisms.&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 Real-World Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Example 1: Async File Read with Error Handling
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { readFile } from "fs/promises";

async function readJson(path) {
  const [readErr, data] ?= await readFile(path, "utf-8");
  if (readErr) return console.error("Failed to read file:", readErr);

  const [parseErr, json] ?= JSON.parse(data);
  if (parseErr) return console.error("Invalid JSON:", parseErr);

  return json;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example 2: Custom Result Wrapper for APIs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function safeFetch(url) {
  return {
    async [Symbol.result]() {
      try {
        const res = await fetch(url);
        const json = await res.json();
        return [null, json];
      } catch (e) {
        return [e, null];
      }
    },
  };
}

const [error, result] ?= await safeFetch("/api/data");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example 3: Using with Resource Cleanup (&lt;code&gt;using&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;await using [err, connection] ?= await openDatabaseConnection();
if (err) throw err;

const [qErr, results] ?= await connection.query("SELECT * FROM users");
if (qErr) throw qErr;

return results;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;using&lt;/code&gt; statement ensures &lt;code&gt;connection&lt;/code&gt; is disposed of properly, regardless of errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Benefits of the ?= Operator
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Improves readability&lt;/strong&gt;: Keeps logic flat and linear.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Encourages consistency&lt;/strong&gt;: Same error pattern across your codebase.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Safer execution&lt;/strong&gt;: Catches every error without missed edge cases.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Adaptable to any API&lt;/strong&gt;: Works with &lt;code&gt;Symbol.result&lt;/code&gt; for full control.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Better DX&lt;/strong&gt;: Cleaner logs, simpler testing, easier debugging.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚫 Current Limitations
&lt;/h2&gt;

&lt;p&gt;The proposal is still experimental and not available in all JavaScript runtimes. Other considerations:&lt;/p&gt;

&lt;p&gt;-🔸 &lt;strong&gt;Polyfills not possible&lt;/strong&gt;: Since it's syntax, it can't be polyfilled directly.&lt;br&gt;
-🔸 &lt;strong&gt;Tooling required&lt;/strong&gt;: You’ll need a custom Babel/TypeScript transform or postprocessor.&lt;br&gt;
-🔸 &lt;strong&gt;No finally support&lt;/strong&gt;: You’ll still need &lt;code&gt;try/finally&lt;/code&gt; for cleanup logic.&lt;/p&gt;
&lt;h2&gt;
  
  
  🚀 Bonus: Emulating &lt;code&gt;?=&lt;/code&gt; in Today's JavaScript
&lt;/h2&gt;

&lt;p&gt;If you want to try it today, you can emulate the behavior like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;safe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;safe&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔮 Future Directions
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;?=&lt;/code&gt; operator has the potential to reshape our understanding of control flow in JavaScript. Inspired by Go's &lt;code&gt;err, val := fn()&lt;/code&gt; and Rust’s &lt;code&gt;Result&lt;/code&gt;, it bridges the gap between expressive syntax and safe semantics.&lt;/p&gt;

&lt;p&gt;As the proposal matures, expect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better integration with async resource handling (&lt;code&gt;using&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Enhanced developer tooling&lt;/li&gt;
&lt;li&gt;Wider runtime support in Node.js and browsers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔗 Relevant Links
&lt;/h2&gt;

&lt;p&gt;Here are some helpful resources to deepen your understanding of the &lt;code&gt;?=&lt;/code&gt; operator and related error-handling improvements in JavaScript:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔍 &lt;a href="https://jsdev.space/safe-assignment-operator/" rel="noopener noreferrer"&gt;The Safe Assignment Operator (?=) Explained&lt;/a&gt; – A deep dive into the proposal, use cases, and current status&lt;/li&gt;
&lt;li&gt;🧪 &lt;a href="https://github.com/tc39/proposal-explicit-resource-management" rel="noopener noreferrer"&gt;The Official TC39 Proposal for ?=&lt;/a&gt; – Follow the formal evolution of the feature&lt;/li&gt;
&lt;li&gt;🛠️ &lt;a href="https://tc39.es/process-document/" rel="noopener noreferrer"&gt;ECMAScript Proposal Stages&lt;/a&gt; – Learn about the process every feature goes through&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📘 Summary
&lt;/h2&gt;

&lt;p&gt;The safe assignment operator &lt;code&gt;?=&lt;/code&gt; helps you write cleaner, more reliable JavaScript. With it, you can eliminate deeply nested try/catch blocks, unify your error-handling approach, and write code that’s both safer and more readable.&lt;/p&gt;

&lt;p&gt;It's still early days, but this is a feature worth watching—and experimenting with—today.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How TypeScript Infers Generic Types Automatically — and Why It Matters</title>
      <dc:creator>JSDev Space</dc:creator>
      <pubDate>Fri, 02 May 2025 14:17:04 +0000</pubDate>
      <link>https://dev.to/jsdevspace/how-typescript-infers-generic-types-automatically-and-why-it-matters-4079</link>
      <guid>https://dev.to/jsdevspace/how-typescript-infers-generic-types-automatically-and-why-it-matters-4079</guid>
      <description>&lt;p&gt;This article explains how type inference works in practice, using a real-world utility function designed for API calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What Is Type Inference?
&lt;/h2&gt;

&lt;p&gt;Type inference allows TypeScript to deduce types from context, eliminating the need for explicit annotations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Basic Examples&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;let score = 100;           // Inferred as number
const nickname = "Nova";  // Inferred as string
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ypeScript looks at the assigned values and infers the correct types — even without annotations.&lt;/p&gt;

&lt;p&gt;But the true power of inference emerges when generics and higher-order functions come into play.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Automatic Inference in Generic Functions
&lt;/h2&gt;

&lt;p&gt;Consider a function that wraps any API call returning a Blob, such as a file download:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type ApiMethod&amp;lt;TArgs&amp;gt; = (args: TArgs) =&amp;gt; Promise&amp;lt;Blob&amp;gt;;

export function createDownloader&amp;lt;TArgs&amp;gt;(apiMethod: ApiMethod&amp;lt;TArgs&amp;gt;) {
  return (args: TArgs) =&amp;gt; {
    apiMethod(args).then(saveFileLocally);
  };
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Here's how inference works in practice:
&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;TypeScript infers the generic type &lt;code&gt;TArgs&lt;/code&gt; from the passed function&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;createDownloader(api.downloadPdf)({
  filters: { startDate: "2025-01-01", endDate: "2025-01-31" },
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When &lt;code&gt;createDownloader&lt;/code&gt; is called, TypeScript:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inspects the parameter type of &lt;code&gt;api.downloadPdf&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Infers that it accepts an object with a &lt;code&gt;filters&lt;/code&gt; property&lt;/li&gt;
&lt;li&gt;Substitutes that structure as &lt;code&gt;TArgs&lt;/code&gt; — without requiring manual typing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ &lt;strong&gt;Argument validation is enforced at compile time&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Passing incorrect arguments immediately triggers a type error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;createDownloader(api.downloadPdf)({
  wrongField: "2025-01-01", // ❌ Error: Object literal may only specify known properties
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 &lt;strong&gt;Inferred types persist in the returned function&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even the inner anonymous function maintains strong typing. Wherever it's used, the developer gets autocomplete, validation, and type safety — for free.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Why This Pattern Is So Useful
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Less Boilerplate&lt;/strong&gt;&lt;br&gt;
There's no need to write extra type declarations — TypeScript handles everything automatically.&lt;/p&gt;

&lt;p&gt;🔒 &lt;strong&gt;Strong Type Safety&lt;/strong&gt;&lt;br&gt;
If the shape of the API changes (e.g., renaming a field), all usages break immediately, catching bugs at compile time.&lt;/p&gt;

&lt;p&gt;🔁 &lt;strong&gt;Reusability&lt;/strong&gt;&lt;br&gt;
The &lt;code&gt;createDownloader&lt;/code&gt; function can be reused across many API endpoints, as long as they return a &lt;code&gt;Blob&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. Other Use Cases for Generic Inference
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;a) Generic API Utility Functions&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;function makeRequest&amp;lt;TResult, TInput&amp;gt;(fetcher: (input: TInput) =&amp;gt; Promise&amp;lt;TResult&amp;gt;) {
  return (input: TInput) =&amp;gt; fetcher(input);
}

const fetchUser = makeRequest(api.getUser); // TInput is inferred
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;b) Typed React Hooks&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;function useFetch&amp;lt;T&amp;gt;(url: string) {
  const [data, setData] = useState&amp;lt;T | null&amp;gt;(null);
  // ...
}

const { data } = useFetch&amp;lt;User[]&amp;gt;("/api/users");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TypeScript infers &lt;code&gt;T&lt;/code&gt; from the expected response format.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;c) Form Submission Handlers&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;function createSubmitHandler&amp;lt;TForm&amp;gt;(onSubmit: (values: TForm) =&amp;gt; void) {
  return (values: TForm) =&amp;gt; onSubmit(values);
}

const handleProfileForm = createSubmitHandler(api.submitProfileForm);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Where Inference Might Not Work
&lt;/h2&gt;

&lt;p&gt;TypeScript isn’t always able to infer complex or overloaded types. Here are two examples:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❗ Complex Nested Generics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In deeply nested or conditional types, inference may fail, and you'll need to provide the generic explicitly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;createDownloader&amp;lt;CustomDownloadParams&amp;gt;(api.customDownload);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;❗ Function Overloads&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Overloaded functions can confuse the type system. In those cases, manual annotations are often necessary.&lt;/p&gt;

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

&lt;p&gt;Automatic type inference is one of TypeScript’s most powerful and underappreciated features — especially in generics. The createDownloader example demonstrates how TypeScript can seamlessly infer argument types, enforce correctness, and maintain type safety throughout the function chain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Tips
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Trust inference as your default.&lt;/li&gt;
&lt;li&gt;Add explicit types only when TypeScript needs help.&lt;/li&gt;
&lt;li&gt;Use this pattern to write reusable, clean utilities with zero boilerplate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building API layers, React hooks, or utility wrappers — leverage TypeScript's inference. You’ll write less code, avoid bugs, and move faster. 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>typescript</category>
      <category>frontend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Mastering Timers in React: A Comprehensive Developer's Guide</title>
      <dc:creator>JSDev Space</dc:creator>
      <pubDate>Tue, 18 Mar 2025 00:00:58 +0000</pubDate>
      <link>https://dev.to/jsdevspace/mastering-timers-in-react-a-comprehensive-developers-guide-462p</link>
      <guid>https://dev.to/jsdevspace/mastering-timers-in-react-a-comprehensive-developers-guide-462p</guid>
      <description>&lt;p&gt;Timers in React can be tricky if you don’t consider key nuances. Let's explore how to properly use timers, avoid memory leaks and closure issues, and examine best practices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Principles of Working with Timers
&lt;/h2&gt;

&lt;p&gt;When working with timers in React, it's essential to consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cleaning up resources when a component unmounts.&lt;/li&gt;
&lt;li&gt;Handling closures correctly.&lt;/li&gt;
&lt;li&gt;Managing component state changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why &lt;code&gt;useEffect&lt;/code&gt; and &lt;code&gt;useRef&lt;/code&gt; Are Important for Timers
&lt;/h2&gt;

&lt;p&gt;The combination of &lt;code&gt;useEffect&lt;/code&gt; and &lt;code&gt;useRef&lt;/code&gt; solves critical issues that arise in naive timer implementations.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Role of &lt;code&gt;useEffect&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;useEffect&lt;/code&gt; manages the timer’s lifecycle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates a new interval when the component mounts or dependencies change.&lt;/li&gt;
&lt;li&gt;Ensures the interval is cleared when dependencies change or the component unmounts, preventing duplicate timers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Power of &lt;code&gt;useRef&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;useRef&lt;/code&gt; serves two key functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stores the interval ID for later cleanup.&lt;/li&gt;
&lt;li&gt;Ensures access to the latest version of the callback function, preventing closure-related issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementing a Custom &lt;code&gt;useInterval&lt;/code&gt; Hook
&lt;/h2&gt;

&lt;p&gt;Here's an implementation of a universal interval with pause and resume functionality:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useEffect, useRef, useState } from 'react';

export const useInterval = (callback: () =&amp;gt; void, interval = 1000) =&amp;gt; {
  const [active, setActive] = useState(true);
  const intervalIdRef = useRef&amp;lt;ReturnType&amp;lt;typeof setInterval&amp;gt;&amp;gt;();
  const callbackRef = useRef(callback);

  // Update the reference to the latest callback
  useEffect(() =&amp;gt; {
    callbackRef.current = callback;
  }, [callback]);

  useEffect(() =&amp;gt; {
    if (!active) return;

    intervalIdRef.current = setInterval(() =&amp;gt; callbackRef.current(), interval);

    return () =&amp;gt; clearInterval(intervalIdRef.current);
  }, [active, interval]);

  return {
    active,
    pause: () =&amp;gt; setActive(false),
    resume: () =&amp;gt; setActive(true),
    toggle: () =&amp;gt; setActive(prev =&amp;gt; !prev)
  };
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Code Breakdown
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Keeping the callback updated&lt;/strong&gt;: &lt;code&gt;useRef&lt;/code&gt; stores the function reference, avoiding closure issues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Controlling the timer state&lt;/strong&gt;: &lt;code&gt;active&lt;/code&gt; manages whether the interval is running or paused.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleaning up the interval&lt;/strong&gt;: &lt;code&gt;useEffect&lt;/code&gt; ensures &lt;code&gt;clearInterval(intervalIdRef.current);&lt;/code&gt; prevents memory leaks.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Alternative Timer Implementations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  One-Time Timer with &lt;code&gt;useTimeout&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;For a timer that executes only once, use &lt;code&gt;useTimeout&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useEffect, useRef } from 'react';

export const useTimeout = (callback: () =&amp;gt; void, delay: number) =&amp;gt; {
  const callbackRef = useRef(callback);

  useEffect(() =&amp;gt; {
    callbackRef.current = callback;
  }, [callback]);

  useEffect(() =&amp;gt; {
    const timer = setTimeout(() =&amp;gt; callbackRef.current(), delay);
    return () =&amp;gt; clearTimeout(timer);
  }, [delay]);
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Timers in React require a thoughtful approach: managing their lifecycle, handling closures, and preventing memory leaks. Use &lt;code&gt;useRef&lt;/code&gt; and &lt;code&gt;useEffect&lt;/code&gt; for robust timer functionality, and for complex scenarios, consider well-tested libraries that provide optimized timer management.&lt;/p&gt;

&lt;p&gt;For further insights on JavaScript timer management, check out &lt;a href="https://jsdev.space/js-timer-management/" rel="noopener noreferrer"&gt;this guide&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>JavaScript Weekly: Top Links for March 7, 2025</title>
      <dc:creator>JSDev Space</dc:creator>
      <pubDate>Fri, 07 Mar 2025 13:49:52 +0000</pubDate>
      <link>https://dev.to/jsdevspace/javascript-weekly-top-links-for-march-7-2025-4oo3</link>
      <guid>https://dev.to/jsdevspace/javascript-weekly-top-links-for-march-7-2025-4oo3</guid>
      <description>&lt;p&gt;Welcome to your JavaScript Weekly Roundup! As we approach mid-March, the JavaScript ecosystem continues to evolve with exciting new tools and techniques. This week's collection features breakthrough libraries, time-saving development tips, and thought-provoking articles that will enhance your coding workflow and keep you informed on the latest trends.&lt;/p&gt;

&lt;h2&gt;
  
  
  📜 Articles &amp;amp; Tutorials
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Ramda.js: Enhancing Array and Object Operations in JavaScript
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjd4y6mbkd41lgjyoycnk.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%2Fjd4y6mbkd41lgjyoycnk.png" alt="Ramda.js" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ramdajs.com/" rel="noopener noreferrer"&gt;Ramda.js&lt;/a&gt; is a powerful functional programming library for JavaScript. Unlike Lodash, it focuses on code purity, supports currying, and ensures data immutability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Currying&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Allows calling functions step by step:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;R&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;ramda&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// 15&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Function Composition&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Replaces &lt;code&gt;.map().filter().reduce()&lt;/code&gt; chains with more readable code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;normalizeNames&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toLower&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Working with APIs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Filtering active users and normalizing their names:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;processUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;propEq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;'&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="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toLower&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Objects: assoc, dissoc, evolve&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modify objects without mutations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;updatedUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assoc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;withoutAge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dissoc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;age&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;updatedUser&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Data Grouping&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;groupedOrders&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When is Ramda Not Needed?
&lt;/h3&gt;

&lt;p&gt;For simple operations, standard methods like map, filter, and reduce are often more convenient. Ramda is beneficial for complex transformations, ensuring immutability, and writing declarative code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.allanfernandes.dev/blog/build-your-own-chrome-extension" rel="noopener noreferrer"&gt;Build your own chrome extension&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://techhub.iodigital.com/articles/frontend-automation-with-github-actions-and-aws" rel="noopener noreferrer"&gt;Frontend Automation with Github Actions and AWS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.syncfusion.com/blogs/post/load-save-image-in-react-image-editor" rel="noopener noreferrer"&gt;React Image Editor: Load and Save Images from a Database Easily&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/advanced-type-tricks/" rel="noopener noreferrer"&gt;Navigating TypeScript's Type System: 24 Brilliant Advanced Techniques&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/mastering-redux/" rel="noopener noreferrer"&gt;Understanding the Redux Ecosystem: From Concept to Implementation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.appsignal.com/2025/01/22/fuzz-testing-rest-apis-in-nodejs.html" rel="noopener noreferrer"&gt;Fuzz Testing REST APIs in Node.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://css-tricks.com/a-css-only-star-rating-component-and-more-part-1/" rel="noopener noreferrer"&gt;A CSS-Only Star Rating Component and More!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.angular.dev/micro-frontends-with-angular-and-native-federation-7623cfc5f413" rel="noopener noreferrer"&gt;Micro Frontends with Angular and Native Federation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/howto/combine-two-nodes/" rel="noopener noreferrer"&gt;How to Combine Two Nodes into One&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/howto/mastering-js-closures/" rel="noopener noreferrer"&gt;How to Master JavaScript Closures: Theory, Practice, and Examples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/howto/implement-hash-history/" rel="noopener noreferrer"&gt;How to Implement Routing with Hash and History API in JavaScript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://neon.tech/blog/building-a-vscode-chat-extension-to-order-lunch" rel="noopener noreferrer"&gt;Building a VSCode Chat Extension to Order Lunch&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tropicolx.hashnode.dev/building-a-telegram-clone-with-nextjs-and-tailwindcss-part-one" rel="noopener noreferrer"&gt;Building a Telegram Clone with Next.js and TailwindCSS - Part One&lt;/a&gt;, &lt;a href="https://tropicolx.hashnode.dev/building-a-telegram-clone-with-nextjs-and-tailwindcss-part-two" rel="noopener noreferrer"&gt;two&lt;/a&gt;, &lt;a href="https://tropicolx.hashnode.dev/building-a-telegram-clone-with-nextjs-and-tailwindcss-part-three" rel="noopener noreferrer"&gt;three&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚒️ Tools
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zippystarter.com/tools/shadcn-ui-theme-generator" rel="noopener noreferrer"&gt;shadcn UI theme generator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://modern-fluid-typography.vercel.app/" rel="noopener noreferrer"&gt;Modern fluid typography editor&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/trycua/lume" rel="noopener noreferrer"&gt;lume&lt;/a&gt;: A lightweight CLI and local API server to create, run and manage macOS and Linux virtual machines (VMs) natively on Apple Silicon.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/agno-agi/agno" rel="noopener noreferrer"&gt;Agno&lt;/a&gt;: A lightweight library for building Multimodal Agents with memory, knowledge and tools.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ricochet-im/ricochet" rel="noopener noreferrer"&gt;ricochet&lt;/a&gt;: A peer-to-peer instant messaging system built on Tor hidden services.&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 Libs
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/usertour/usertour" rel="noopener noreferrer"&gt;Usertour&lt;/a&gt;: An alternative to: Appcues, Userpilot, Userflow, userguiding, Chameleon , Etc...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/algora-io/tv" rel="noopener noreferrer"&gt;Algora TV&lt;/a&gt;: A React component to embed a live streaming video player.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/SendWithSES/Drag-and-Drop-Email-Designer" rel="noopener noreferrer"&gt;Drag-and-Drop-Email-Designer&lt;/a&gt;: A drag and drop email designer for SES.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/pruvious/pruvious/tree/v4" rel="noopener noreferrer"&gt;Pruvious&lt;/a&gt;: A reliable CMS for your Nuxt app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/webjsx/webjsx" rel="noopener noreferrer"&gt;webjsx&lt;/a&gt;: A library for building web applications with JSX and Web Components.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Goldziher/kreuzberg" rel="noopener noreferrer"&gt;kreuzberg&lt;/a&gt;: A text extraction library supporting PDFs, images, office documents and more&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/yousboot/Memory" rel="noopener noreferrer"&gt;Memory&lt;/a&gt;: A self-hosted editor and note taking app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/NifrasUsanar/InfoShop" rel="noopener noreferrer"&gt;InfoShop&lt;/a&gt;: Free and open source laravel + Inertia JS (React JS) Point of Sale platform&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.tofast-png"&gt;fast-png&lt;/a&gt;:PNG image decoder and encoder written entirely in JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mercurius-js/mercurius" rel="noopener noreferrer"&gt;mercurius&lt;/a&gt;: A GraphQL HTTP Server for Fastify with TypeScript and hooks support.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⌚ Releases
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://vercel.com/blog/ai-sdk-4-1" rel="noopener noreferrer"&gt;AI SDK 4.1&lt;/a&gt;: Vercel AI SDK 4.1 is out with new features and improvements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nextjs.org/blog/next-15-2" rel="noopener noreferrer"&gt;Next.js 15.2 Released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://astro.build/blog/astro-540/" rel="noopener noreferrer"&gt;Astro 5.4&lt;/a&gt;: Astro 5.4 is out with new features and improvements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bun.sh/blog/bun-v1.2.3" rel="noopener noreferrer"&gt;Bun v1.2.3 Released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://eslint.org/blog/2025/02/eslint-v9.21.0-released/" rel="noopener noreferrer"&gt;ESLint v9.21.0 Released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/angular/angular/releases/tag/19.2.0" rel="noopener noreferrer"&gt;Angular v19.2 Released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.emberjs.com/ember-released-6-2/" rel="noopener noreferrer"&gt;Ember 6.2 Released&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📺 Videos
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=mKIQZNKdU2w&amp;amp;t=915s" rel="noopener noreferrer"&gt;How To Setup Rich Text Editor In Next.js&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=8m-O_KiHRjk" rel="noopener noreferrer"&gt;Build your first MCP Server in TypeScript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=OTP4hhX_xpM" rel="noopener noreferrer"&gt;New React Animation API Is Insane&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=bMqi1ujAgUc" rel="noopener noreferrer"&gt;The BEST UI Animation Library of 2025? 🤯 You NEED to See This!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=9DEvkYB5_A4" rel="noopener noreferrer"&gt;Using web sockets on Next.js | NO third party solution&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=w11cMyzKQ2A" rel="noopener noreferrer"&gt;CSS Clamp: Responsive design in one line&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=jHVDnbuB23k" rel="noopener noreferrer"&gt;Stream Video In React &amp;amp; Next.js OPTIMALLY (WebM, CDN, m3u8 / HLS / ABS, ImageKit)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=YxnxghkFqjI" rel="noopener noreferrer"&gt;How to create a Glassmorph Navbar (Next.js 15, Shadcn, Tailwind)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=wbj-DuaL748" rel="noopener noreferrer"&gt;The Ultimate React Native Course | Build Your First Mobile App in 2025&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=3EnathFYgz8" rel="noopener noreferrer"&gt;Fix Your Slow React App With React-Scan&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=x2WtHZciC74" rel="noopener noreferrer"&gt;Claude 3.7 goes hard for programmers…&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=IUAk1pjXDWM" rel="noopener noreferrer"&gt;This one tool forever changed how I use Docker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=ArmPzvHTcfQ" rel="noopener noreferrer"&gt;Ultimate Next 15 Course: Build a YouTube Clone (2025)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎤 Talks &amp;amp; Podcasts
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://player.fm/series/javascript-jabber-130015/beyond-aesthetics-what-the-next-generation-of-frameworks-should-offer-jsj-670" rel="noopener noreferrer"&gt;Beyond Aesthetics: What the Next Generation of Frameworks Should Offer - JsJ_670&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.htmlallthethings.com/podcasts/ai-has-broken-the-web-developer-job-market-w-kent-c-dodds" rel="noopener noreferrer"&gt;AI Has Broken the Web Developer Job Market w/ Kent C. Dodds&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🗞️ News &amp;amp; Updates
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://tailwindcss.com/blog/tailwind-plus" rel="noopener noreferrer"&gt;Tailwind UI is now Tailwind Plus&lt;/a&gt; - Tailwind UI is now Tailwind Plus, with new features and improvements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tanstack.com/blog/announcing-tanstack-form-v1" rel="noopener noreferrer"&gt;Announcing TanStack Form v1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for checking out this week's JavaScript roundup! We hope these resources help you build better applications and solve challenging problems. Join us next Friday when we'll be back with another curated selection of JavaScript excellence from around the web.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Weekly JavaScript Roundup: Friday Links 17, February 07, 2025</title>
      <dc:creator>JSDev Space</dc:creator>
      <pubDate>Fri, 07 Feb 2025 00:33:10 +0000</pubDate>
      <link>https://dev.to/jsdevspace/weekly-javascript-roundup-friday-links-17-february-07-2025-168l</link>
      <guid>https://dev.to/jsdevspace/weekly-javascript-roundup-friday-links-17-february-07-2025-168l</guid>
      <description>&lt;p&gt;Happy Friday, JavaScript enthusiasts! This week’s roundup brings you fresh updates, handy libraries, and insightful reads to level up your JS skills. Let’s get started!&lt;/p&gt;

&lt;h2&gt;
  
  
  📜 Articles &amp;amp; Tutorials
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.freecodecamp.org/news/build-an-analytical-dashboard-with-nextjs/" rel="noopener noreferrer"&gt;How to Build an Analytical Dashboard with Next.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.freecodecamp.org/news/what-is-css-subgrid" rel="noopener noreferrer"&gt;What is CSS Subgrid? A Practical Tutorial&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/usecombinedref-react/" rel="noopener noreferrer"&gt;Mastering React Refs: Advanced Techniques with useCombinedRef Hook&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://css-tricks.com/web-slinger-css-across-the-swiper-verse/" rel="noopener noreferrer"&gt;Web-Slinger.css: Across the Swiper-Verse&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.jomaendle.com/blog/focus-zoom-at-property" rel="noopener noreferrer"&gt;Dynamic Focus Zoom Effect with CSS @property&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/thesohailjafri/the-must-have-seo-checklist-for-developers-192i"&gt;The Must-Have SEO Checklist for Developers For 2025&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://frontendmasters.com/blog/creating-an-angled-slider/" rel="noopener noreferrer"&gt;Creating an Angled Slider&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/copilotkit/work-smarter-in-notion-add-a-copilot-with-copilotkit-50be"&gt;Build a Local Notion with an AI Agent Assistant 🤖&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kizu.dev/preview-mixin/" rel="noopener noreferrer"&gt;Pure CSS Mixin for Displaying Values of Custom Properties&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/spa-vanilla-js/" rel="noopener noreferrer"&gt;Build a Single-Page Application(SPA) Router in Vanilla JavaScript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marvinh.dev/blog/modern-way-to-write-javascript-servers/" rel="noopener noreferrer"&gt;The modern way to write JavaScript servers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://scottjehl.com/posts/q-r/" rel="noopener noreferrer"&gt;Building a QR Code HTML Web Component&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.allanfernandes.dev/blog/next-js-blog-using-app-router" rel="noopener noreferrer"&gt;Building a simple blog architecture&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.openreplay.com/create-scroll-animations-with-just-css/" rel="noopener noreferrer"&gt;Create Scroll Animations with just CSS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/blog/whats-new-in-svelte-february-2025" rel="noopener noreferrer"&gt;What’s new in Svelte: February 2025&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://liveblocks.io/blog/which-rich-text-editor-framework-should-you-choose-in-2025" rel="noopener noreferrer"&gt;Which rich text editor framework should you choose in 2025?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/solid-design-react/" rel="noopener noreferrer"&gt;Code Like a Pro: Implementing SOLID Design in React Ecosystem&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://css-tricks.com/positioning-text-around-elements-with-css-offset/" rel="noopener noreferrer"&gt;Positioning Text Around Elements With CSS Offset&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.smashingmagazine.com/2025/01/transitioning-top-layer-entries-display-property-css/" rel="noopener noreferrer"&gt;Transitioning Top-Layer Entries And The Display Property In CSS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/howto/js-code-security/" rel="noopener noreferrer"&gt;How to Improve JavaScript Code Security: Best Practices and Tips&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdev.space/ts-error-handling/" rel="noopener noreferrer"&gt;TypeScript Error Handling Evolution: From Try/Catch to Result Types&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚒️ Tools
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://rustdesk.com/" rel="noopener noreferrer"&gt;RustDesk&lt;/a&gt; - A secure, open-source remote desktop client for Windows, macOS, and Linux. RustDesk is built with Rust and uses the Tauri framework for the frontend. It offers features like file transfer, clipboard sharing, and multi-monitor support, making it a versatile tool for remote work and IT support.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://solidtime.io/" rel="noopener noreferrer"&gt;SolidTime&lt;/a&gt; - A privacy-focused time tracking app built with SolidJS and Tailwind CSS. SolidTime allows users to track their work hours and generate reports without compromising their data privacy. It's a lightweight, fast, and secure alternative to traditional time tracking tools.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://scroll-driven-animations.style/" rel="noopener noreferrer"&gt;Scroll-driven Animations&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.everyhex.codes/" rel="noopener noreferrer"&gt;Every Hex Codes&lt;/a&gt; - A collection of every possible hex color code, from #000000 to #FFFFFF. Every Hex Codes provides a visual representation of all 16,777,216 hex colors, making it a handy reference for designers and developers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://elizaos.github.io/eliza/" rel="noopener noreferrer"&gt;eliza&lt;/a&gt; - is a simple, fast, and lightweight AI agent framework&lt;/p&gt;

&lt;p&gt;&lt;a href="https://screenshottocode.com/" rel="noopener noreferrer"&gt;Screenshot to Code&lt;/a&gt; - A tool that converts screenshots of websites into HTML and CSS code. Screenshot to Code uses machine learning to analyze images and generate code snippets, helping developers recreate web designs more efficiently.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apiparrot.com/" rel="noopener noreferrer"&gt;API Parrot&lt;/a&gt; - A tool for mocking and testing APIs without writing code. API Parrot lets you create custom API endpoints, define responses, and simulate different scenarios to test your applications' behavior. It's a useful tool for frontend developers, QA engineers, and API designers.&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%2F9un2beyl1dw9z4mrsf17.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%2F9un2beyl1dw9z4mrsf17.png" alt="Image description" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vueless.com/" rel="noopener noreferrer"&gt;vuelessui&lt;/a&gt; - A minimalistic UI framework for Vue.js applications. VuelessUI focuses on simplicity and performance, providing essential components like buttons, forms, and modals without unnecessary bloat. It's designed to be lightweight and easy to customize, making it ideal for building fast and responsive web applications.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://finetunedb.com/" rel="noopener noreferrer"&gt;FinetuneDB&lt;/a&gt; - is an AI fine-tuning platform that enables users to create and manage datasets for customizing large language models (LLMs). It offers a collaborative editor for team-based dataset building, tools for evaluating model performance with human and AI feedback, and features for collecting production data to refine models. The platform also provides a prompt playground for optimizing interactions between users and AI models. Developers can integrate FinetuneDB into their applications using SDKs compatible with the OpenAI framework. FinetuneDB emphasizes security with encrypted data transmission and strict permission controls. &lt;/p&gt;

&lt;h2&gt;
  
  
  📚 Libs
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/livetrails/targetjs" rel="noopener noreferrer"&gt;TargetJS&lt;/a&gt; - A Novel JavaScript UI framework designed to simplify development and enhance animations. TargetJS offers a unique approach to building user interfaces, focusing on simplicity and performance. It provides a declarative syntax for creating components and animations, making it easy to develop interactive web applications. TargetJS is built with modern web technologies and aims to streamline the development process while delivering engaging user experiences.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/visprex/visprex" rel="noopener noreferrer"&gt;visprex&lt;/a&gt; - Visualise your CSV files in seconds without sending your data anywhere&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tonghohin/screen-sharing" rel="noopener noreferrer"&gt;screen-sharing&lt;/a&gt; - A simple screen sharing library for web applications. screen-sharing uses WebRTC technology to enable real-time screen sharing between users, making it ideal for remote collaboration and online meetings. It provides a straightforward API for integrating screen sharing functionality into web applications, allowing users to share their screens with minimal setup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/TahaSh/blendy" rel="noopener noreferrer"&gt;blendy&lt;/a&gt; - Smoothly transition one element into another with just a few lines of code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://waveform-renderer.vercel.app/" rel="noopener noreferrer"&gt;Waveform Renderer&lt;/a&gt; - A lightweight and customizable TypeScript library for rendering audio waveforms on HTML canvas. Create beautiful, interactive audio visualizations with ease.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/plotly/plotly.js" rel="noopener noreferrer"&gt;plotly.js&lt;/a&gt; - Open-source JavaScript charting library behind Plotly and Dash&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/sindresorhus/emittery" rel="noopener noreferrer"&gt;emittery&lt;/a&gt; - Simple and modern async event emitter&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/xzitlou/jsontr.ee" rel="noopener noreferrer"&gt;jsontr.ee&lt;/a&gt; - A JSON transformer and formatter for the web&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/puffinsoft/jscanify" rel="noopener noreferrer"&gt;jscanify&lt;/a&gt; - The Javascript document scanning library.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/fuma-nama/fumadocs" rel="noopener noreferrer"&gt;fumadocs&lt;/a&gt; - The beautiful docs framework with Next.js.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/arikchakma/maily.to" rel="noopener noreferrer"&gt;maily.to&lt;/a&gt; - Craft beautiful emails effortlessly with Maily, the powerful email editor that ensures impeccable communication across all major clients.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/yorukot/superfile" rel="noopener noreferrer"&gt;superfile&lt;/a&gt; - Pretty fancy and modern terminal file manager&lt;/p&gt;

&lt;h2&gt;
  
  
  ⌚ Releases
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://astro.build/blog/astro-520/" rel="noopener noreferrer"&gt;Astro 5.2 Released&lt;/a&gt;: Tailwind 4, TOML Support, and Improved Redirects&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%2F0hgg9cdda8h3jz9a11rg.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%2F0hgg9cdda8h3jz9a11rg.png" alt="Image description" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Astro framework has released version 5.2, introducing support for Tailwind 4, TOML frontmatter in Markdown, and an enhanced redirect logic for trailing slashes in URLs. Additionally, there's an experimental feature to disable React streaming for better compatibility with certain libraries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚀 Tailwind 4 Support&lt;/strong&gt;&lt;br&gt;
Astro now includes the &lt;a class="mentioned-user" href="https://dev.to/tailwindcss"&gt;@tailwindcss&lt;/a&gt;/vite plugin by default, making it easier to integrate Tailwind into projects. The old integration method via &lt;code&gt;@astrojs/tailwind&lt;/code&gt; remains available for previous Astro versions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📝 TOML Frontmatter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Astro now supports TOML for frontmatter in Markdown pages, making it more compatible with frameworks like Hugo. To enable TOML, wrap the frontmatter in triple plus (&lt;code&gt;+++&lt;/code&gt;) signs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="err"&gt;+++&lt;/span&gt;
&lt;span class="py"&gt;date&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2025-01-30&lt;/span&gt;
&lt;span class="py"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Use TOML frontmatter in Astro!"&lt;/span&gt;
&lt;span class="nn"&gt;[params]&lt;/span&gt;
  &lt;span class="py"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Houston"&lt;/span&gt;
&lt;span class="err"&gt;+++&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🔄 Improved Redirects for URLs with Slashes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Astro now ensures that URLs like &lt;code&gt;/about/&lt;/code&gt;, &lt;code&gt;/about&lt;/code&gt;, and &lt;code&gt;/about///&lt;/code&gt; correctly resolve to the intended page. During development, redirects are disabled to help catch potential issues. To enable redirects, update &lt;code&gt;astro.config.mjs&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="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;adapter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;node&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;standalone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="na"&gt;trailingSlash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;never&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 'always'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Astro 5.2 continues to refine performance and developer experience, making it an even more powerful framework for modern web development.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.thunderbird.net/en-US/thunderbird/135.0/releasenotes/" rel="noopener noreferrer"&gt;Mozilla Thunderbird 135.0 Released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/DavidXanatos/TaskExplorer/releases" rel="noopener noreferrer"&gt;TaskExplorer 1.6.0 Released&lt;/a&gt;: Advanced Task Manager for Windows&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%2Fy3nbkatwcqs8f82g8i0b.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%2Fy3nbkatwcqs8f82g8i0b.png" alt="Image description" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The open-source project &lt;a href="https://github.com/DavidXanatos/TaskExplorer" rel="noopener noreferrer"&gt;TaskExplorer&lt;/a&gt; has released version 1.6.0, offering an advanced task management tool for Windows 7 and later. Unlike traditional task managers, TaskExplorer focuses not only on monitoring running applications but also on analyzing their activities in detail.&lt;/p&gt;

&lt;p&gt;Built with C and C++, the project's source code is available on GitHub under the GNU General Public License v3.0. TaskExplorer was first introduced in October 2019, and this latest version continues to refine its capabilities for system administrators, developers, and users managing legacy hardware.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/a1ive/nwinfo/releases/tag/v1.1.1" rel="noopener noreferrer"&gt;NWinfo 1.1.1 Released&lt;/a&gt;: Portable System Info Tool for Windows&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%2Fferdp8f9frsktraqqq0k.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%2Fferdp8f9frsktraqqq0k.png" alt="Image description" width="480" height="621"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On February 4, 2025, the lightweight open-source project &lt;a href="https://github.com/a1ive/nwinfo/releases/tag/v1.1.1" rel="noopener noreferrer"&gt;NWinfo 1.1.1&lt;/a&gt; was released. This portable system information tool provides a quick overview of key PC details, from hardware specifications to software insights. It runs on Windows XP and newer, making it a versatile tool for both tech enthusiasts and troubleshooting professionals.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://a1ive.github.io/nwinfo/" rel="noopener noreferrer"&gt;NWinfo&lt;/a&gt; displays essential data on the CPU, memory, disks, network, and system status, all within an intuitive interface. It also generates detailed logs in JSON, YAML, and LUA formats for easy sharing and diagnostics.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ruck.tech/" rel="noopener noreferrer"&gt;Ruck 9.0&lt;/a&gt; - A React Webapp Framework for Deno&lt;/p&gt;

&lt;h2&gt;
  
  
  📺 Videos
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=lVg7kBhz2KE" rel="noopener noreferrer"&gt;Create a Job Board SaaS with Next.js, Inngest, Auth.js, Arcjet and Tailwind | 2025&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=RNRhNIk26Ow" rel="noopener noreferrer"&gt;How I used CODE to Create Paper Like Images&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=ReMCo2hkUAM" rel="noopener noreferrer"&gt;Create a super fun "focus by negation" effect&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=c-hKSbzooAg" rel="noopener noreferrer"&gt;My Biggest Tutorial Ever (Build A FULL Google Drive Clone with React, Next, TypeScript and more)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Ndvm7Ge4pic" rel="noopener noreferrer"&gt;Data Structures and Algorithms Crash Course&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=tZKeTSZmvTA" rel="noopener noreferrer"&gt;Build a Fullstack Project Management App with Next.js 15, Supabase, Shadcn, Resend, DnD Kit &amp;amp; Tiptap&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=prjMJtXCR-g" rel="noopener noreferrer"&gt;Heroku Is Dead, Here's What I Recommend&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=I20qfWRcgb8&amp;amp;ab_channel=OnlineTutorials" rel="noopener noreferrer"&gt;Simple CSS Animation Effects&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=7-UCkYlTr50" rel="noopener noreferrer"&gt;Why I Use Linux&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=ArmPzvHTcfQ&amp;amp;ab_channel=CodeWithAntonio" rel="noopener noreferrer"&gt;Ultimate Next 15 Course: Build a YouTube Clone (2025)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Q-cPtlYG1cY&amp;amp;ab_channel=freeCodeCamp.org" rel="noopener noreferrer"&gt;Strapi 5 and Next.js 15 Full Stack Project Course&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=XZj4hmbNdSE&amp;amp;ab_channel=GreatStack" rel="noopener noreferrer"&gt;Build Full Stack LMS Website using MERN Stack | Create Full Stack React JS Project 2025&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=290Ytj96vL4&amp;amp;ab_channel=CodinginFlow" rel="noopener noreferrer"&gt;Programmatic SEO in Next.js 15 - Full Guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s it for this week’s roundup! Stay curious, keep coding, and don’t forget to check back next Friday for more &lt;a href="https://jsdev.space/friday/" rel="noopener noreferrer"&gt;JavaScript highlights&lt;/a&gt;. Have a favorite link? Drop it in the comments! 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>react</category>
    </item>
  </channel>
</rss>
