Hot Spec Summer: ES2025

Issue #405.July 1, 2025.2 Minute read.
Bytes

Today’s issue: Deno’s Duchess of Sussex, the Linux of all Linuxes, and the dangers of creating your own holidays.

Welcome to #405.


Eyeballs logo

The Main Thing

Aubrey Plaza wearing goggles in a pool

Still no Temporal API.

Hot Spec Summer: ES2025

ECMAScript 2025 was officially approved last week, which means we got some new JavaScript features and celebrated the only religious holiday on the Gregorian Bytes calendar – Hot Spec Summer™️.

The festivities involve a mostly harmless ritual where we drink copious amounts of Robitussin mixed with White Monster, eat our weight in Pizza Rolls, and spend 48 straight hours in my above-ground swimming pool trying to touch the face of God predict the future of JavaScript.

And now that we’ve completed our vision quest, we’re ready to rate the five most exciting ES2025 features on a hotness scale of 1-5 🔥. Let’s dive in.

Iterator helper methods – Iterators finally get their own helpers like .map(), .filter(), .take() and .drop(). Unlike array methods, these helpers process data incrementally, so they don’t create intermediate arrays or load everything into memory at once.

🔥 Rating: 5/5. This makes iterators first-class citizens in JavaScript and should massively improve the experience of working with streams, iterables, and large data sets.

Import Attributes and JSON Modules – Import attributes now let you import JSON and other non-JavaScript assets natively, without bundler magic. You can now do this in plain JavaScript:

import config from './config.json' with { type: 'json' };

🔥 Rating: 3/5. A big ergonomics win for working with configuration and other structured data, but lots of bundlers and frameworks already have JSON imports built in, so you might not always notice it.

Promise.try() – Helps you start promise chains that include synchronous code which might throw. Instead of wrapping things in a manual try/catch, you can write this:

Promise.try(() => mightThrow())
  .then(result => doSomething(result));

🔥 Rating: 2.5/5. A tidy little helper that simplifies error handling for promise chains that start with synchronous code, but we know most of you will just keep using async/await.

New Set methods – Sets got some long-overdue love with new methods to combine and compare them, like union(), intersection(), difference(), and checks like isSubsetOf(). Here’s a quick example:

const s1 = new Set(['a','b']);
const s2 = new Set(['b','c']);
s1.union(s2); // Set {'a','b','c'}

🔥 Rating: 4.5/5. This means you finally don’t need to convert sets to arrays just to do basic operations. Huge win.

RegExp.escape() – This makes it easy to safely insert arbitrary strings into regex patterns without worrying about special characters causing chaos like so:

const safe = RegExp.escape('hello.*+?');
console.log(safe); // 'hello\.\*\+\?'

🔥 Rating: 3.5/5. Not super flashy, but it should help prevent subtle regex bugs from user input for features like search boxes and dynamic features. We’ll take all the help we can get.

Bottom Line: Did you know that cooking Pizza Rolls on a Traeger really brings out the smoky flavor of the mini pepperonis? Another important lesson learned from Hot Spec Summer.


QA Wolf logo

Our Friends
(With Benefits)

Chihuahua with big eyes and glasses looking nervous

When you burn $12K in Claude tokens running a bunch of flaky tests

Test your app’s generative AI features – without burning through tokens

3 reasons why testing genAI apps is harder than testing a regular app:

  1. Outputs are non-deterministic
  2. The models are constantly evolving
  3. Edge cases are basically infinite

Thankfully, QA Wolf builds and maintains all your genAI test cases for you. And they developed novel AI testing techniques like deductive assertions and temp control – so you can trust your AI outputs every time (see how it works in detail).

Get a personalized demo to see how they can maximize your genAI testing coverage without torching your budget – or your team’s sanity.


Pop Quiz logo

Pop Quiz

Sponsored by Clerk

They just announced MCP Server Support for Next.js, which enables your users to securely grant AI apps like Claude and Cursor to access their data within your app 🔥

In the code snippet below, what do a and b evaluate to?

let a = 0;
const b = [1, 2, 3, 4, 5].map((x) => (
  (a += x), x * x
));

console.log(a) // ?
console.log(b) // ?

Cool Bits logo

Cool Bits

  1. If you want a preview of other JavaScript features in the TC39 pipeline, Luca Casonato and Andy Jiang from the Deno team wrote about what’s coming soon to a JS spec near you.

  2. CodeRabbit just launched a free VS Code extension that provides AI code reviews right in your IDE. It gives senior developer-level attention to every line of your code and one-click fix suggestions to clean up mistakes fast. [sponsored]

  3. Craig Brunner wrote on the Shopify blog about how they used Remix to make Shopify admin 30% faster at massive scale – 620K total files and 3 million lines of TypeScript supporting 67 million daily page views.

  4. DHH & friends created Omarchy, an Arch/Hyprland setup that provides “an opinionated take on what Linux can be at its best” – which sounds refreshing, since most of us are far more familiar with Linux at its worst.

  5. Turso just released the first alpha version of their full rewrite of SQLite in Rust. Yes, that sounds like a meme, but it’s real and it’s spectacular.

  6. Deno shared a new update on their JavaScript trademark battle with Oracle – which has felt like watching a full season of Suits. I guess that means Louis Litt is Oracle’s general counsel and Ryan Dahl is the Duchess of Sussex.

  7. Base UI just released the v1.0 beta of its unstyled UI component library built by the creators of Radix, Floating UI, and Material UI.

  8. Cloudflare just declared that today is Content Independence Day, and that they’re changing the default to block AI crawlers unless they pay creators for their content. It’s a noble cause, but I, for one, don’t want to live in a world where anyone can just make up their own holiday whenever they feel like it. Doesn’t anyone respect traditional family values anymore?


Pop Quiz logo

Pop Quiz: Answer

Sponsored by Clerk

Here’s the code with more descriptive variable names.

let sum = 0;
const squares = [1, 2, 3, 4, 5].map((x) => (
  (sum += x), x * x
));

console.log(sum) // 15
console.log(squares) // [1, 4, 9, 16, 25]

This is a fun one. The weirdest part is probably the comma , operator.

If you’re not familiar, , evaluates each of its operands (from left to right) and returns the value of the last operand. This allows us to, in a single line, increase sum by x and return the square of x. When finished, we get the sum of the array as well as a new array of squares.