<?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: nyxb</title>
    <description>The latest articles on DEV Community by nyxb (@nyxb).</description>
    <link>https://dev.to/nyxb</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%2F822461%2F69f4c692-53e1-46d6-895c-907fc7d2e314.jpg</url>
      <title>DEV Community: nyxb</title>
      <link>https://dev.to/nyxb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nyxb"/>
    <language>en</language>
    <item>
      <title>🧙‍♂️ The Enchanted Tale of JavaScript's Magical Evolution - ESM &amp; CJS 🌟</title>
      <dc:creator>nyxb</dc:creator>
      <pubDate>Mon, 15 May 2023 09:46:18 +0000</pubDate>
      <link>https://dev.to/nyxb/the-enchanted-tale-of-javascripts-magical-evolution-esm-cjs-4kkf</link>
      <guid>https://dev.to/nyxb/the-enchanted-tale-of-javascripts-magical-evolution-esm-cjs-4kkf</guid>
      <description>&lt;h2&gt;
  
  
  🏰 Prologue - The Kingdoms of ESM &amp;amp; CJS
&lt;/h2&gt;




&lt;p&gt;Once upon a time, in the vast universe of JavaScript, there existed two magical realms - ESM, the kingdom of ECMAScript modules, and CJS, the land of CommonJS. Over the past decade, due to the absence of a unified magical script (module system) of JavaScript, CJS (signified by the incantation &lt;code&gt;require('xxx')&lt;/code&gt; and &lt;code&gt;module.exports&lt;/code&gt; syntax) was the universal spell used in Node.js and NPM packages.&lt;/p&gt;

&lt;p&gt;However, in the fateful year of 2015, ESM's powerful runes finally emerged as the standard incantation, prompting a gradual migration towards native ESM. This enabled named exports, better static analysis, tree-shaking, and native browser support. 🌳📚&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// CJS&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;circle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./circle.js&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`The area of a circle of radius 4 is &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;circle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;area&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// ESM&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;area&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./circle.mjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`The area of a circle of radius 4 is &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;area&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ESM was like the prophecy of a new dawn, offering a promising future for JavaScript. Node.js v12 introduced experimental support for native ESM, which was later stabilized in v12.22.0 and v14.17.0. As we approached the end of 2021, many packages began to be shipped in pure-ESM format or as a hybrid of CJS and ESM; meta-frameworks like Nuxt 3 and SvelteKit recommended users to adopt an ESM-first environment. 🚀&lt;/p&gt;

&lt;p&gt;However, this migration was akin to a grand quest, full of challenges and adventures. For most library authors, shipping dual formats became a safer, smoother path, enabling them to reap the benefits of both realms.&lt;/p&gt;




&lt;h2&gt;
  
  
  🐉 The Challenge of Compatibility
&lt;/h2&gt;

&lt;p&gt;Despite ESM's promising future, the road was fraught with obstacles. One such hurdle was the inability to use ESM packages in CJS. Node.js was smart enough to allow CJS and ESM packages to co-exist, but attempting to use ESM packages in CJS would result in an error. 🚧&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// in CJS&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pkg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;esm-only-package&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// will throw an error&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The underlying issue was that ESM is asynchronous by nature, which means it couldn't be imported into the synchronous context of &lt;code&gt;require&lt;/code&gt;. This generally meant that to use ESM packages, you also needed to use ESM. There was one exception though - ESM packages could be used in CJS using dynamic &lt;code&gt;import()&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="c1"&gt;// in CJS&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pkg&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="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;esm-only-package&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meanwhile, if you were able to use ESM directly, it was significantly easier as &lt;code&gt;import&lt;/code&gt; supports both ESM and CJS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// in ESM&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;named&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;esm-package&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;cjs&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;cjs-package&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some packages started shipping pure-ESM packages, advocating for the ecosystem to transition from CJS to ESM. While this might be the "right thing to do", considering the majority of the ecosystem was still on CJS and the migration wasn't a walk in the park, I found myself more inclined to ship both CJS and ESM formats for a smoother transition.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 The Alchemical Recipe - package.json
&lt;/h2&gt;

&lt;p&gt;Fortunately, Node allowed us to hold these two realms in balance, marking the scripts with &lt;code&gt;"type": "module"&lt;/code&gt; in &lt;code&gt;package.json&lt;/code&gt;. This made &lt;code&gt;.js&lt;/code&gt; files to be interpreted as ESM by default. However, if we wanted to use both ESM and CJS in the same codebase, we needed to use &lt;code&gt;.cjs&lt;/code&gt; and &lt;code&gt;.mjs&lt;/code&gt; extensions for CJS and ESM respectively. This was akin to placing a magical seal to ensure harmony.&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;//&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./index.cjs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./index.mjs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"import"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./index.mjs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"require"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./index.cjs"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above example, &lt;code&gt;"main"&lt;/code&gt; and &lt;code&gt;"module"&lt;/code&gt; entries pointed to our CJS and ESM entries respectively. The &lt;code&gt;"exports"&lt;/code&gt; field was especially powerful. It allowed us to map different entry points for &lt;code&gt;require&lt;/code&gt; and &lt;code&gt;import&lt;/code&gt;, thus ensuring compatibility with both.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// index.mjs&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;named&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;esm-package&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;cjs&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;cjs-package&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;named&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;cjs&lt;/span&gt;

&lt;span class="c1"&gt;// index.cjs&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;named&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;esm-package&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;cjs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cjs-package&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;named&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;cjs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While this was a good start, it wasn't perfect. To fully support both ESM and CJS, you needed to ensure that your code and its dependencies were compatible with both module systems. This could be a significant challenge, but with careful planning and a thorough understanding of both systems, it was achievable.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 The Journey Ahead
&lt;/h2&gt;

&lt;p&gt;The migration from CJS to ESM may seem like a long and winding journey, but it's a path that the JavaScript community is steadily traversing. With every challenge, there are new learnings, and with every step forward, we're making the ecosystem more future-ready.&lt;/p&gt;

&lt;p&gt;As with any quest, patience and persistence are the keys to success. The future of JavaScript is bright with ESM, and the potential it holds is truly magical. So, let's brace ourselves for the exciting journey ahead and be a part of this evolution. 🌈💡&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// The future is here, and it's written in ESM!&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;future&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;javascript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Welcome to the &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;future&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; of JavaScript!`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌟 Epilogue
&lt;/h2&gt;

&lt;p&gt;This tale is an ongoing saga in the world of JavaScript. It serves as a testament to the dynamism of this language and the relentless pursuit of its community for better, more efficient coding practices.&lt;/p&gt;

&lt;p&gt;Remember, whether you're an ESM enthusiast or a CJS loyalist, in the end, we're all JavaScript wizards weaving our own magic. Let's continue to evolve, innovate, and inspire each other in this enchanted tale of JavaScript's magical evolution. 🧙‍♂️🌟🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  🗣 The Oracles Speak - The Tools of Prophecy
&lt;/h2&gt;

&lt;p&gt;In the quest of magical JavaScript transformation, there are two legendary tools that JavaScript wizards have been using – &lt;code&gt;tsup&lt;/code&gt; and &lt;code&gt;buildkarium&lt;/code&gt;. These tools help in creating a balance between the ESM and CJS realms, ensuring a smoother transition.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚡ &lt;code&gt;tsup&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The first magical tool, &lt;code&gt;tsup&lt;/code&gt; by &lt;a href="https://github.com/egoist"&gt;@egoist&lt;/a&gt;, offers a zero-config building experience for TypeScript projects, bringing harmony between CJS and ESM.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;tsup src/index.ts &lt;span class="nt"&gt;--format&lt;/span&gt; cjs,esm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command above will create two files: &lt;code&gt;dist/index.js&lt;/code&gt; (for CJS) and &lt;code&gt;dist/index.mjs&lt;/code&gt; (for ESM), thus preserving the balance between the two realms.&lt;/p&gt;

&lt;h3&gt;
  
  
  🏗 &lt;code&gt;buildkarium&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The second tool in our arsenal, &lt;code&gt;buildkarium&lt;/code&gt; by the &lt;a href="https://github.com/nyxblabs"&gt;@nyxblabs&lt;/a&gt; organization, is a more generalized, customizable, and powerful tool. It offers a unique feature called Stubbing, which eliminates the need for a watcher process. It's akin to a magical charm that ensures your code is always up-to-date.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;buildkarium &lt;span class="nt"&gt;--stub&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running the command above once is all you need to keep your library code up-to-date!&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;buildkarium&lt;/code&gt; tool also enables Bundleless Build, which allows you to maintain the structure of your source code, enabling on-demand importing of submodules, thus optimizing performance.&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="c1"&gt;// karium.config.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineBuildConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;buildkarium&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;defineBuildConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;// bundling&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/index&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// bundleless, or just copy assets&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/components/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;outDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dist/components&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;declaration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌉 Bridging Context Misalignment
&lt;/h2&gt;

&lt;p&gt;Despite these powerful tools, wizards must remain cautious of context misalignment between ESM and CJS. ESM does not recognize &lt;code&gt;__dirname&lt;/code&gt;, &lt;code&gt;__filename&lt;/code&gt;, &lt;code&gt;require&lt;/code&gt;, &lt;code&gt;require.resolve&lt;/code&gt;, instead it uses &lt;code&gt;import.meta.url&lt;/code&gt;. However, with a little extra spellcasting, we can conjure up a solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;dirname&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fileURLToPath&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;_dirname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;__dirname&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;undefined&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;__dirname&lt;/span&gt;
  &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fileURLToPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code snippet above provides an isomorphic &lt;code&gt;__dirname&lt;/code&gt;, working in both ESM and CJS contexts.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌟 The Magical Epilogue
&lt;/h2&gt;

&lt;p&gt;This tale of ESM and CJS is far from over, the JavaScript community continues its quest for the most efficient coding practices. As we venture forth, let's embrace the magical evolution of JavaScript, making the most of both the CJS past and the ESM future.&lt;/p&gt;

&lt;p&gt;Remember, whether you're working in ESM or CJS, we're all JavaScript wizards, conjuring up our own magical code in this ever-evolving landscape. 🧙‍♀️🌟🚀&lt;/p&gt;




&lt;p&gt;2023-PRESENT © Dennis Ollhoff&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🧙‍♂️✨ Welcome to the magical world of indentation! 🌟📜</title>
      <dc:creator>nyxb</dc:creator>
      <pubDate>Thu, 04 May 2023 15:36:01 +0000</pubDate>
      <link>https://dev.to/nyxb/welcome-to-the-magical-world-of-indentation-1fc</link>
      <guid>https://dev.to/nyxb/welcome-to-the-magical-world-of-indentation-1fc</guid>
      <description>&lt;p&gt;🔮 Ever found yourself in a mystic quest to decide if 2 or 4 spaces is best for your new code adventure? You've come to the right place!&lt;/p&gt;

&lt;p&gt;I could cast a spell 🪄 and tell you which of the two is the ultimate choice. But as you probably know, it's a matter of individual preference for personal/solo quests, and coding guidelines if you're embarking on an epic journey with an organization (assuming they have coding guidelines).&lt;/p&gt;

&lt;p&gt;As a code wizard 🧙‍♂️, my choice is to wield 2-space indentation for front-end spells and 4-space indentation for backend enchantments. However, 4-space indentation can sometimes create more margin than needed. On the other hand, 2-space indentation may not provide enough space, reducing the readability of your magical incantations.&lt;/p&gt;

&lt;p&gt;Why not harness the power of both realms? Embrace 3 spaces/tab! ⚡️ It's a no-brainer, right? The 2 and 4 space conventions have been widely adopted across the enchanted coding kingdoms. Don't waste time debating whether 3-space indentation is valid for coding. I've been using 3 spaces in my new projects, and I make sure to share this secret with my fellow adventurers at the start of each new quest.&lt;/p&gt;

&lt;p&gt;For those interested, you can find my ESLint configuration and read about the epic battle between Prettier and ESLint in this thrilling tale: &lt;a href="https://dev.to/nyxb/prettier-a-double-edged-sword-for-code-formatting-29o9"&gt;Prettier - A Double-Edged Sword for Code Formatting&lt;/a&gt; 🗡️&lt;/p&gt;

&lt;p&gt;That said, I'll save the space vs tab indentation comparison for another thrilling tale.&lt;/p&gt;

&lt;p&gt;I'd be delighted to hear your thoughts on 3 space/tab indentation in the comments section below! 📣 Thanks for joining me on this fantastic journey! 🌈&lt;/p&gt;

</description>
      <category>indentation</category>
      <category>beginners</category>
      <category>programming</category>
      <category>2v4spaces</category>
    </item>
    <item>
      <title>Prettier: A Double-Edged Sword for Code Formatting 🎭</title>
      <dc:creator>nyxb</dc:creator>
      <pubDate>Tue, 18 Apr 2023 13:40:26 +0000</pubDate>
      <link>https://dev.to/nyxb/prettier-a-double-edged-sword-for-code-formatting-29o9</link>
      <guid>https://dev.to/nyxb/prettier-a-double-edged-sword-for-code-formatting-29o9</guid>
      <description>&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Why I Admire Prettier&lt;/li&gt;
&lt;li&gt;The Peculiar Situation&lt;/li&gt;
&lt;li&gt;The Rigidity of Prettier&lt;/li&gt;
&lt;li&gt;The Line Wrap Dilemma&lt;/li&gt;
&lt;li&gt;The Prettier and ESLint Saga&lt;/li&gt;
&lt;li&gt;An Alternative Approach&lt;/li&gt;
&lt;li&gt;Final Thoughts&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;My Persistent Effort to Articulate My Sentiments&lt;/strong&gt; 😣&lt;/p&gt;

&lt;p&gt;Despite numerous attempts to pen down this post, I've struggled to express my feelings about Prettier. This time around, I'm committed to clarifying my position for future reference.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: I don't oppose Prettier—in fact, I appreciate it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Admire Prettier ❤️
&lt;/h2&gt;

&lt;p&gt;Prettier is an invaluable tool that has spared me a tremendous amount of time. I'm grateful to the maintainers and contributors who have put in the effort to establish a reliable foundation for neat, consistent code across the developer community. Although the title may seem provocative, I &lt;em&gt;do&lt;/em&gt; frequently use Prettier for interactive documentation and playgrounds with technologies like TypeScript and Next.js. Its seamless support for a wide range of languages allows me to effortlessly enhance the appearance of generated code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Peculiar Situation ❓
&lt;/h2&gt;

&lt;p&gt;Upon exploring my open-source projects, you might observe that I rarely rely on Prettier for formatting source code. In this post, I intend to elaborate on the reasoning behind this decision:&lt;/p&gt;

&lt;h2&gt;
  
  
  The Rigidity of Prettier 🧱
&lt;/h2&gt;

&lt;p&gt;Prettier markets itself as "an opinionated code formatter."&lt;/p&gt;

&lt;p&gt;Being opinionated implies that it won't cater to everyone's preferences. Prettier enforces numerous hard-coded decisions to offer a minimal configuration interface. While this approach simplifies usage (which is fantastic!) and promotes consistency across projects, it also restricts your ability to fine-tune the appearance of your code.&lt;/p&gt;

&lt;p&gt;Although I appreciate most of Prettier's choices, it can be frustrating to encounter formatting decisions that you dislike and cannot work around.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Line Wrap Dilemma 📏
&lt;/h2&gt;

&lt;p&gt;One aspect that particularly irks me is the automatic wrapping/unwrapping of code based on line length. Prettier employs a &lt;code&gt;printWidth&lt;/code&gt; concept, which limits each line to a specified width (80 characters by default). In general, this approach ensures that code fits within a single screen and eliminates the need for horizontal scrolling.&lt;/p&gt;

&lt;p&gt;However, I've often found that it compromises readability and complicates git diffs.&lt;/p&gt;

&lt;p&gt;In a recent PR review, highlight an example of this issue:&lt;br&gt;
Formatters truly shine in their brilliance, particularly during PR reviews. However, they can also present challenges, such as when a newly added piece of code initiates a line break. The diff, in this case, fails to reveal the actual changes. It would be splendid if diff viewers were Prettier-conscious and considered line breaks as mere spacing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RdiQXktS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wtm0nd8s4um6g8xe7vdx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RdiQXktS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wtm0nd8s4um6g8xe7vdx.png" alt="Example1" width="800" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Modifying a JavaScript string literal to exceed the &lt;code&gt;printWidth&lt;/code&gt; value causes Prettier to wrap the line forcibly. This action disrupts inline diffing and complicates the review process. In another pull request, shortening the string could lead Prettier to unwrap the lines, creating unnecessary noise.&lt;/p&gt;

&lt;p&gt;The following image illustrates another example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OQ9QTBUf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dd7bfv8cwcvrwj3foes5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OQ9QTBUf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dd7bfv8cwcvrwj3foes5.png" alt="Example 2" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While the &lt;code&gt;printWidth&lt;/code&gt; of 42 is used for demonstration purposes, this issue persists regardless of the &lt;code&gt;printWidth&lt;/code&gt; value.&lt;/p&gt;

&lt;p&gt;On the left, we have the input code, and on the right, the output from Prettier. It's apparent which one is "more visually appealing." In my opinion, Prettier's strict adherence to its rule hinders code readability and modification, which contradicts the primary objective of formatting—to enhance code readability.&lt;/p&gt;

&lt;p&gt;The real issue lies in the fact that this behavior is non-negotiable. You cannot disable it entirely(#3468). Increasing the &lt;code&gt;printWidth&lt;/code&gt; merely postpones the problem and affects other files you haven't touched. The only workaround is to use &lt;code&gt;// prettier-ignore&lt;/code&gt;, but the "all or nothing" choice defeats the purpose of utilizing Prettier in the first place.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Prettier and ESLint Saga 🤹
&lt;/h2&gt;

&lt;p&gt;Prettier, as a code formatter, focuses solely on code styles and not logic. Consequently, many projects use ESLint in conjunction with Prettier to check logic as well. If you've ever configured this setup, you might have noticed some overlapping functionality between the two—ESLint can also lint code styles. A common practice is to use &lt;code&gt;eslint-config-prettier&lt;/code&gt; to disable overlapping rules in ESLint (other solutions are also available).&lt;/p&gt;

&lt;p&gt;However, this approach creates a messy situation for me:&lt;/p&gt;

&lt;p&gt;ESLint's auto-fix feature can format code just as effectively as Prettier, but with greater flexibility.&lt;/p&gt;
&lt;h2&gt;
  
  
  An Alternative Approach 🔄
&lt;/h2&gt;

&lt;p&gt;ESLint is essential to my workflow for ensuring code quality. Since ESLint is already capable of formatting, I prefer to utilize it exclusively.&lt;/p&gt;

&lt;p&gt;I dedicated some time to configuring my ESLint and created a config preset:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nyxb/eslint-config"&gt;@nyxb/eslint-config&lt;/a&gt;&lt;br&gt;
As a result, the setup configuration can be minimal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-D&lt;/span&gt; @nyxb/eslint-config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// .eslintrc&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;extends&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;@nyxb&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's all it takes. With IDE extensions, auto-fixing on save is also possible. It functions similarly to Prettier but respects your choices regarding line breaks and adheres to numerous linting best practices. Naturally, it's opinionated to cater to my needs. However, it could serve as a helpful reference for creating your own version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts 🌅
&lt;/h2&gt;

&lt;p&gt;This post aims to share my personal experiences and opinions. Of course, you may have differing viewpoints and need not agree with me. I'm not criticizing Prettier for its design. Different tools have different purposes and focuses, so there's no definitive "better" or "worse." It's about choosing the right tools for the right situations. I'll continue to be a satisfied Prettier user for cases where I don't require maximum customizability, while exclusively using ESLint for my projects' source code.&lt;/p&gt;

&lt;p&gt;I hope this provides clarity and offers some insights. Cheers!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nyxb/eslint-config"&gt;@nyxb/eslint-config repo&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;cd ..&lt;br&gt;
CC BY-NC-SA 4.0 2023-PRESENT © Dennis Ollhoff&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>🎩✨ Reproductions: The Magic Behind the Scenes</title>
      <dc:creator>nyxb</dc:creator>
      <pubDate>Tue, 11 Apr 2023 21:14:43 +0000</pubDate>
      <link>https://dev.to/nyxb/reproductions-3o7o</link>
      <guid>https://dev.to/nyxb/reproductions-3o7o</guid>
      <description>&lt;p&gt;&lt;strong&gt;Join me on this enchanting journey as we unravel the mystical world of reproductions.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀🔮 A Thrilling Odyssey into the Realm of Open Source Enchantments: Embrace the "As-Is" Adventure
&lt;/h2&gt;

&lt;p&gt;Imagine this: you're a brave wizard venturing into the infinite cosmos of Open Source Software (OSS). You encounter the legendary MIT License, a magical parchment known far and wide in this land, whispering a cryptic prophecy:&lt;/p&gt;

&lt;p&gt;The software is provided "AS IS", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and noninfringement.&lt;/p&gt;

&lt;p&gt;The "as is" proclamation signifies you've been bestowed the power to utilize the spell (code), modify it, or even transfigure it to your will, all in its current form. However, the spell creators stand liberated from any obligation to mend or amplify anything you might face now or later. They gain no advantage from your use, and there's no vow of ceaseless support. In this OSS expedition, you are the master of your own magic.&lt;/p&gt;

&lt;p&gt;Sounds daunting, right? But fear not, for the reality is more merciful. In the expansive universe of open source projects, a trust pact binds users and maintainers. Users act as scouts, reporting obstacles they encounter or sharing their magical solutions through dynamic discussions and pull requests. Meanwhile, maintainers serve as the project's backbone, reviewing and making decisions, orchestrating new versions, and managing distributions. This harmonious alliance of users and maintainers works tirelessly, bound by a common goal: to enhance the software for the greater good.&lt;/p&gt;




&lt;h2&gt;
  
  
  💖 The Art of Maintenance: A Labour of Love
&lt;/h2&gt;

&lt;p&gt;The life of software is an eternal dance, never truly reaching completion. Maintenance is the life-force of a project, ensuring its pulse remains steady with timely bug fixes and security updates. It is the key to sustaining the project in the long run. However, tasks such as triaging issues, reviewing PRs, and engaging in discussions demand immense effort from maintainers.&lt;/p&gt;

&lt;p&gt;In the open source kingdom, the user-to-maintainer ratio often tips perilously out of balance. Many popular projects have only one or two unsung heroes working tirelessly behind the scenes. As a project grows and attracts a larger user base, the maintenance tasks required may quickly surpass the capacity of these devoted individuals.&lt;/p&gt;

&lt;h2&gt;
  
  
  🗺️ The Quest for Reproduction: Unearthing the Root of the Issue
&lt;/h2&gt;




&lt;h3&gt;
  
  
  💥 The Power of Reproduction
&lt;/h3&gt;

&lt;p&gt;Crafting a flawless minimal reproduction of a potential issue can be a powerful charm for maintainers, allowing them to pinpoint the root cause and swiftly implement a fix. Without such a reproduction, maintainers are left to decipher the issue from mere descriptions or screenshots, unsure whether the problem stems from the project itself or external factors. To unravel this mystery, maintainers may need to embark on a time-consuming journey, attempting to reproduce the issue themselves or delving into the labyrinthine projects shared as "non-minimal reproductions". Hours may be lost, only to discover an issue that is either nonexistent or impossible to reproduce. What if there are hundreds of such issues to tackle?&lt;/p&gt;

&lt;p&gt;In my view, requesting a minimal reproduction seeks to balance the efforts expended. If every adventurer took the time to create a minimal reproduction before presenting their issues, it would save maintainers countless hours (and perhaps even help users uncover solutions or mistakes on their own, negating the need for an issue). A thoroughly investigated and well-articulated issue may also inspire maintainers to devote their time and energy in return.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎨 The Art of Crafting a Minimal Reproduction
&lt;/h2&gt;

&lt;p&gt;This section is adapted from "Please include a repro" by Rich Harris. For a more detailed explanation, watch Rich Harris' spellbinding presentation.&lt;/p&gt;

&lt;p&gt;At times, there may be a project-specific method to demonstrate problems – for example, Rollup, Svelte, and Vue all have dedicated magical platforms, known as REPLs. Embrace them!&lt;/p&gt;

&lt;p&gt;However, sometimes it's not feasible to illustrate the problem with a REPL. In these cases, follow these magical steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;🏰 Forge a sample repo on GitHub, Stackblitz, or another platform of your choosing.&lt;/li&gt;
&lt;li&gt;🎭 Exhibit the problem – and only the problem. Pare it down to the absolute minimum of code that reliably demonstrates the issue. Eliminate any dependencies unrelated to the problem.&lt;/li&gt;
&lt;li&gt;📜 Embed all dependencies in package.json. If the maintainer can't clone the repo and execute &lt;code&gt;npm install &amp;amp;&amp;amp; npm run build&lt;/code&gt; (or similar – see point 4) to witness the problem because they require some globally installed CLI tool or otherwise, it becomes more challenging to solve the issue.&lt;/li&gt;
&lt;li&gt;🖋️ Incorporate instructions and a description of the expected and actual behavior in the repo, ideally in README.md. This document should also include a link back to the issue. If there are any instructions beyond &lt;code&gt;npm install &amp;amp;&amp;amp; npm run build&lt;/code&gt;, list them here.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🌅 The Journey's End
&lt;/h2&gt;

&lt;p&gt;As a maintainer, I am grateful for every issue and pull request submitted. I acknowledge that some closed issues lacking reproductions may still harbor genuine bugs requiring attention. However, to avoid being overwhelmed by a flurry of notifications, maintainers must prioritize their tasks. Keeping the number of issues manageable is one way to ensure a project's long-term health.&lt;/p&gt;

&lt;p&gt;I believe open source is about conjuring spectacular creations together, not placing the entire burden on maintainers' shoulders. Together, we can forge a more vibrant and magical community. Thank you for joining me on this enchanting journey. 🙏✨🎩&lt;/p&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>github</category>
    </item>
  </channel>
</rss>
