Linting and Formatting Release Notes
Release notes for code linting, formatting and type-checking tools
Products (5)
Latest Linting and Formatting Updates
- Jul 10, 2026
- Date parsed from source:Jul 10, 2026
- First seen by Releasebot:Jul 10, 2026
ESLint v9.39.5 released
Eslint ships v9.39.5 as a patch release that fixes bugs and prevents crashes in host environments where require.cache is unavailable, including Yarn Plug’n’Play. It also includes documentation and maintenance updates.
We just pushed ESLint v9.39.5, which is a patch release upgrade of ESLint. This release fixes several bugs found in the previous release.
Highlights
This release backports a fix originally released in v10.3.0 that prevents ESLint from crashing in host environments where require.cache is unavailable, such as Yarn Plug’n’Play.
Bug Fixes
- 253be16 fix: handle unavailable require cache (backport of #20812 to v9.x) (#21065) (Eric)
Documentation
- 74930ed docs: switch build to Node.js 24 (#20894) (Milos Djermanovic)
- eaec8bb docs: Add ESLint v9.x EOL notice (#20828) (Milos Djermanovic)
Chores
- 458205f chore: update @eslint/eslintrc and @eslint/js for v9.39.5 (#21077) (Francesco Trotta)
- 202117b chore: package.json update for @eslint/js release (Jenkins)
- d9eb6ed test: disable warning for vm.constants.USE_MAIN_CONTEXT_DEFAULT_LOADER (#21074) (Francesco Trotta)
- 7b431a7 chore: override re2 dependency for @metascraper/helpers (#21068) (Milos Djermanovic)
- daf7791 chore: pin [email protected] (#20895) (Milos Djermanovic)
- daee8ba ci: use pnpm in eslint-flat-config-utils type integration test (#20829) (Milos Djermanovic)
- 116d4be ci: unpin Node.js 25.x in CI (#20619) (Copilot)
- Jul 10, 2026
- Date parsed from source:Jul 10, 2026
- First seen by Releasebot:Jul 10, 2026
ESLint v10.7.0 released
Eslint ships v10.7.0 with new rule options, smarter suggestions, and bug fixes. The release adds constructor callback nesting checks, custom error class handling in preserve-caught-error, and improved no-compare-neg-zero guidance, while tightening several rules and docs.
We just pushed ESLint v10.7.0, which is a minor release upgrade of ESLint. This release adds some new features and fixes several bugs found in the previous release.
Highlights
New option checkConstructorCallCallbacks in max-nested-callbacks
The max-nested-callbacks rule now supports a checkConstructorCallCallbacks option. When enabled, the rule also counts callback functions passed to constructor calls with new, such as new Promise((resolve) => {}), when calculating nesting depth.
For example, with { "max": 1, "checkConstructorCallCallbacks": true }, the rule reports the following code as exceeding the allowed callback nesting depth:
run(() => { new Promise(resolve => resolve()); });New option errorClassNames in preserve-caught-error
The preserve-caught-error rule now supports an errorClassNames option. This option lets you specify additional custom error class names that must preserve the original caught error by passing it as a cause.
For example, with { "errorClassNames": ["MyError"] }, the following code is reported because the thrown MyError does not include the original error as a cause, just like built-in error types must:
try { doSomething(); } catch (error) { throw new MyError("something went wrong"); }Suggestions for no-compare-neg-zero
The no-compare-neg-zero rule now supports suggestions. Where appropriate, it suggests replacing -0 with 0 or using Object.is() instead of operators such as === or !==. For example, for an expression such as x === -0, the rule suggests x === 0 to preserve the existing comparison behavior, and Object.is(x, -0) to distinguish -0 from +0.
Features
- cf2a9bf feat: add errorClassNames option to preserve-caught-error rule (#21032) (sethamus)
- f8b873a feat: max-nested-callbacks option for constructor callbacks (#21063) (fnx)
- 557fde8 feat: support computed Number.parseInt member access in radix rule (#21041) (Pixel)
- 0b4a73b feat: add suggestions to no-compare-neg-zero (#21034) (den$)
- 96cdd42 feat: report invalid signed numeric values in radix rule (#21030) (Pixel)
Bug Fixes
- 3e7bf15 fix: apply ignoreClassesWithImplements to class expressions (#21069) (Pixel)
- 0d7d70c fix: insert cause outside wrapping parens in preserve-caught-error (#21062) (Mahin Anowar)
- 75ec753 fix: handle static template literals in eqeqeq rule (#21058) (Pixel)
- b717a22 fix: prevent eqeqeq null option from reporting non-equality operators (#21057) (Pixel)
- e35b05f fix: avoid no-invalid-regexp false positive for shadowed RegExp (#21051) (Pixel)
- a3172b6 fix: avoid no-control-regex false positive for shadowed RegExp (#21050) (Pixel)
- d1f637e fix: parenthesize sequence expression operands in no-implicit-coercion (#21045) (spokodev)
- 8859baf fix: avoid prefer-numeric-literals false positive for shadowed globals (#21047) (한국)
- a9e5961 fix: use-isnan false positive on shadowed NaN/Number (#20958) (sethamus)
- 8a240a7 fix: avoid false positives in radix rule for spread arguments (#21044) (Pixel)
Documentation
- c30d808 docs: Update README (GitHub Actions Bot)
- 5139800 docs: document ESLint migration codemods in v9 and v10 guides (#20980) (Alex Bit)
- 04174cb docs: Update README (GitHub Actions Bot)
- 026e130 docs: update semver policy for bug fixes (#21048) (Milos Djermanovic)
- 9d42fef docs: Update README (GitHub Actions Bot)
- b230159 docs: Update README (GitHub Actions Bot)
- 0129972 docs: correct **/.js glob to **/*.js in config files guide (#21036) (EduardF1)
Chores
- 9489379 chore: update dependency @eslint/eslintrc to ^3.3.6 (#21076) (renovate[bot])
- 81a4774 chore: updates for v9.39.5 release (Jenkins)
- 9835414 chore: enable $ExpectType annotations in all TypeScript files (#21071) (Francesco Trotta)
- 72adf6b chore: restrict markdownlint-cli2 updates in renovate (#21067) (lumir)
- 833ec10 chore: update dependency prettier to v3.9.4 (#21061) (renovate[bot])
- 7ea106d chore: update ecosystem plugins (#21059) (ESLint Bot)
- 8fb550e chore: add prettier update commit to .git-blame-ignore-revs (#21056) (lumir)
- e4e1166 chore: update dependency prettier to v3.9.1 (#21055) (renovate[bot])
- 0493f53 chore: update prettier to v3.9.0 (#21054) (Pixel)
- 1056a99 chore: update dependency prettier to v3.8.5 (#21049) (renovate[bot])
- 4d4155d ci: run ecosystem tests on pull requests (#21027) (sethamus)
- 993539f chore: update dependency @eslint/json to ^2.0.1 (#21042) (renovate[bot])
- 53f8b69 test: add error locations to no-constant-binary-expression (#21039) (lumir)
- 5ab71d5 refactor: clean up radix rule internals (#21015) (Pixel)
- a80a9a4 chore: update ecosystem plugins (#21035) (ESLint Bot)
- 7c9a029 ci: add Node.js 26 to CI (#20847) (lumir)
All of your release notes in one feed
Join Releasebot and get updates from Eslint and hundreds of other software products.
- Jul 8, 2026
- Date parsed from source:Jul 8, 2026
- First seen by Releasebot:Jul 8, 2026
Announcing TypeScript 7.0
TypeScript ships its native TypeScript 7 port, bringing major speedups, lower memory use, rebuilt watch mode, parallel builds, and updated editor support for a faster, more stable development experience.
Today we are proud to announce the availability of TypeScript 7, a 10x faster native port of TypeScript!
Since its early days, TypeScript has promised to deliver on JavaScript that scales. By bringing strong type-checking and rich tooling to the world of JavaScript, TypeScript made it possible to build non-trivial high-quality apps across platforms.
Last year, our team unveiled TypeScript’s next step in scaling: making every part of the toolset an order of magnitude faster. The mission was a native port of TypeScript built in Go that could make the most of modern hardware. This port was done as faithfully as possible, writing new code while maintaining the structure and logic of the original codebase to keep results consistent and compatible between the two compilers. The key difference is that with this new codebase, TypeScript 7 brings native code speed, shared memory multithreading, and a number of new optimizations that typically yield speedups between 8x and 12x on full builds.
Just as with any other release, TypeScript 7 is available via npm:
npm install -D typescriptThat will get you the new tsc executable in your workspace (which you can run via npx tsc). Of course, a big part of the TypeScript experience is also about editor support. Your favorite code editor should easily support TypeScript 7 with its new support for the language server protocol (LSP), and its new speed and multithreading improvements. Whether you’re using something like VS Code, Visual Studio, WebStorm, or any other modern editor, TypeScript 7 should work great. Just check your editor’s documentation – for example, VS Code has a dedicated extension for TypeScript 7 that you can use today, and Visual Studio will automatically enable TypeScript 7 based on your workspace.
What Does A Faster TypeScript Mean?
A faster TypeScript sounds great on paper, but what does it mean in practice? Maybe it helps to think about where TypeScript comes up at every stage of development.
A typical day of development might involve opening your editor, opening a TypeScript file, and running an operation like find-all-references across your projects. Then as you’d start to make edits, maybe you’d expect auto-completions to pop up, and get red squiggles on the fly as you’d make edits. When you (and more recently, perhaps an AI agent) were ready to build your project, you’d run tsc, check the output for errors, and then run your generated code somehow.
A faster TypeScript means every part above is streamlined. Waiting for your editor to fully load your project will feel instantaneous. Delays on find-all-references, auto-completion, and diagnostics should take a fraction of the time they used to. And when you run tsc, maybe in --watch mode, you’ll be able to tighten your feedback loop and iterate faster than ever before.
You can see this on real-world projects. In fact, you can try comparing on a few open-source projects yourself. Here are the build times of running TypeScript 6 and 7 on some fairly large open source codebases.
Codebase | TypeScript 6 | TypeScript 7 | Speedup
vscode | 125.7s | 10.6s | 11.9x
sentry | 139.8s | 15.7s | 8.9x
bluesky | 24.3s | 2.8s | 8.7x
playwright | 12.8s | 1.47s | 8.7x
tldraw | 11.2s | 1.46s | 7.7xTypeScript 7 also typically does better while asking for less aggregate memory over the span of a build.
Codebase | TypeScript 6 | TypeScript 7 | Memory Delta
vscode | 5.2GB | 4.2GB | -18%
sentry | 4.9GB | 4.6GB | -6%
bluesky | 1.8GB | 1.3GB | -26%
playwright | 1.0GB | 0.9GB | -11%
tldraw | 0.6GB | 0.5GB | -15%Of course, there’s more to the experience than the full build. On the same computer, opening a file with an error in the VS Code codebase would previously take about 17.5 seconds from the time you opened the editor to the time you saw the first error. With TypeScript 7, it’s under 1.3 seconds – over 13x faster.
Battle-Tested and Ready for Production
The TypeScript project contains tens of thousands of tests built over more than a decade that run on every commit on our main branch. They’ve ensured every one of our releases is stable and reliable.
But TypeScript 7 is no ordinary release. Beyond our test suite, we’ve leveraged a number of different resources to make sure TypeScript 7 is solid for production use.
Over the last year we’ve worked with many large teams internally and externally to test TypeScript 7 on real-world codebases. The results have been overwhelmingly positive, with entire companies reporting that TypeScript 7 has been stable, fast, and easy to adopt. For example, the VS Code team recently highlighted their experience with TypeScript 7’s preview releases to move faster in their development cycle. We’ve also worked with Microsoft teams like Loop, Office, PowerBI, Teams, and Xbox to ensure that TypeScript is ready for the largest of codebases. Likewise, companies like Bloomberg, Canva, Figma, Google, Lattice, Linear, Miro, Notion, Sentry, Slack, Vanta, Vercel, VoidZero, and more have worked with us to test TypeScript 7 on their codebases and given us feedback to make it better.
Additionally, we’ve rebuilt much of our broader test infrastructure to run on TypeScript 7. TypeScript 6 and earlier had automated and on-demand testing for TypeScript and JavaScript projects on GitHub to detect regressions in the compiler and language service. The same testing is back, and running against TypeScript 7, finding issues in real codebases so we can find gaps in our core test suite and ship a better experience.
The combination of explicit feedback, automated crash reports, and aggressive testing has made a measurable difference in quality. In fact, our data insights have shown us that TypeScript 7.0’s new language server has actually reduced failing language server commands by over 80%, and reduced server crashes by over 60% compared to that of TypeScript 6.0.
We’ve also heard some incredible feedback from teams at scale:
- Slack engineers have told us that TypeScript 7 eliminated 40% of their merge queue time and brought type-checking time in CI from about 7.5 minutes to 1.25 minutes. Local development in the editor was previously almost “unusable” due to language server load times and engineers would typically let CI do a full type-check. TypeScript 7 has been able to load the same codebase in a few seconds and made local type-checking feasible again.
- Builds at Vanta have dramatically improved, showing a speedup of up to 9x faster on one of their biggest projects.
- Similarly, the News Services team at Microsoft told us that adopting TypeScript 7 saved them 400 hours a month waiting for CI builds.
- Last year, engineers working on PowerBI described TypeScript 7 in the editor as “life-saving” for working on their codebase. They adopted the experience as a default even before TypeScript 7 supported rename functionality in VS Code.
- Developers working on Loop’s monorepo were also ecstatic. The previous editor experience was described as unusable at their scale, whereas the TypeScript 7 experience has been “amazing” to use.
- Canva developers have told us that TypeScript 7’s language service shows dramatic speedups, going from about 58 seconds to seeing the first error in their editors to about 4.8 seconds.
Running Side-by-Side with TypeScript 6.0
While TypeScript 7.0 is here, it does not ship with an API. We expect TypeScript 7.1 to ship with a new (and different) API, but until then we have made it a priority to ensure TypeScript can be run side-by-side with TypeScript 6.0 for utilities that still need some programmatic access to the compiler (such as typescript-eslint).
As part of the 6.0/7.0 transition process, we’ve published a new compatibility package, @typescript/typescript6. This package provides an executable named tsc6, so that if needed, you can install TypeScript 7.0 (which ships its own tsc binary) side-by-side without naming conflicts. The new package also re-exports the TypeScript 6.0 API, so that you can use tsc for TypeScript 7, while other tooling can continue to rely on 6.0.
Because some tools like typescript-eslint expect to import from typescript directly via peer dependencies, we recommend achieving this via npm aliases. You should be able to run the following command
npm install -D typescript@npm:@typescript/typescript6or modify your package.json as follows:
{ "devDependencies": { "typescript": "npm:@typescript/typescript6@^6.0.2" } }Note that doing this will leave you only with a tsc6 executable. To get 7.0’s tsc, you can add another alias for TypeScript 7 and npx tsc will just work with 7.0:
{ "devDependencies": { "@typescript/native": "npm:typescript@^7.0.2", "typescript": "npm:@typescript/typescript6@^6.0.2" } }Nightly Builds and @typescript/native-preview
Until now, most developers have installed TypeScript 7 via the @typescript/native-preview package. This package shipped nightly builds of the new codebase, and has served the community well with over 8.5 million weekly downloads!
However, going forward, nightly builds will soon resume under the standard typescript package with the next tag. You can install it with:
npm install -D typescript@nextCustom Scaling: Parallelization and Controls
TypeScript 7.0 now performs many steps in parallel, including parsing, type-checking, and emitting. Some of these steps, like parsing and emitting can mostly be done independently across files. As such, parallelization automatically scales well with larger codebases with relatively little overhead. But not every step in a TypeScript build is easily parallelizable.
TypeScript 7 introduces the experimental --checkers and --builders flags to fine-tune the parallelization behavior for less-trivial steps like type-checking and project reference building. It also introduces a --singleThreaded flag to disable parallelization entirely, which can be useful for debugging or running in environments with limited resources.
Type-Checker Parallelization
Other steps, like type-checking, have more complex dependencies across files. Most files end up relying on the same type information from their dependencies and the global scope, and so running type-checkers completely independently would be wasteful – both in computation and memory. On the other hand, type-checking occasionally relies on the relative ordering of information in a program, and so type-checking from scratch must always check the same files in an identical order to ensure the same results.
To enable parallelization while avoiding these pitfalls, TypeScript 7.0 creates a fixed number of type-checker workers with their own view of the world. These type-checking workers may end up duplicating some common work, but given the same input files, they will always divide them identically and produce the same results.
The default number of type-checking workers is 4, but it can be configured with the new --checkers flag. You may find that increasing this number can further speed up builds on larger codebases where typical machines have more CPU cores, but will typically come at the cost of increased memory usage. For example, in the table above, we ran TypeScript 7 with its default of --checkers 4. Here’s what the results look like on the same machine with --checkers 8.
Codebase | TypeScript 6 | TypeScript 7 (--checkers 8) | Speedup
vscode | 125.7s | 7.51s | 16.7x
sentry | 139.8s | 12.08s | 11.6x
bluesky | 24.3s | 2.01s | 12.1x
playwright | 12.8s | 1.16s | 11x
tldraw | 11.2s | 1.06s | 10.6xAs you can see, these codebases get a better speedup from dedicating more cores, but results will differ across projects and underlying machines.
On the other hand, on machines with fewer CPU cores and less memory (e.g. CI runners) you may want to decrease this number to avoid unnecessary or incidental overhead. You can specify a value as low as --checkers 1, effectively making type-checking single-threaded and eliminating duplicate work.
In rare cases, varying the number of --checkers may surface order-dependent results. Specifying a fixed number of checkers across build environments can help ensure everyone is getting the same results, but is up to the discretion of your team.
Project Reference Builder Parallelization
TypeScript 7.0 can parallelize builds within a project, but it can now also build multiple projects at once as well. This behavior can be configured with the new --builders flag, which controls the number of parallel project reference builders that can run at once when running under --build. This can be particularly helpful for monorepos with many projects.
Like --checkers, increasing the number of builders can speed up builds, but may come at the cost of increased memory usage. It also has a multiplicative effect with --checkers, so it’s important to find the right balance for your machine and codebase. For example, building with --checkers 4 --builders 4 allows up to 16 type-checkers to run at once, which may be excessive.
Unlike --checkers, varying the number of builders should not produce different results; however, building project references is fundamentally bottlenecked by the dependency graph of projects (with the exception of type-checking on codebases that leverage --isolatedDeclarations and separate syntactic declaration file emit).
Single-Threaded Mode
In some cases, it can be helpful to enforce single-threaded operation throughout the compiler. This may be useful for debugging, comparing performance with TypeScript 6 and 7, when orchestrating parallel builds externally, or for running in environments with very limited resources. To enable single-threaded mode, you can use the new --singleThreaded flag. This will not only cap the number of type-checking workers to 1, but also ensure parsing and emitting are done in a single thread.
Improved --watch Mode
TypeScript 7 ships with a completely rebuilt --watch mode.
--watch is now powered by a new foundation based on the Parcel bundler’s file-watcher that provides efficient and stable cross-platform file watching capabilities.
When our team set out to port our file watching logic, we encountered a few challenges with cross-platform file watching in Go. The standard library doesn’t provide a built-in file watching API, and existing third-party libraries we explored had various issues with stability, performance, cross-platform support, or issues with build tooling integration. We were able to build solutions around polling periodically to check for file changes, and this worked broadly across operating systems; however it was computationally expensive, especially at larger-scale projects with many dependencies in node_modules. Even with dynamic scheduling strategies, we found that pure-polling solutions were too taxing for general use.
For many years, Visual Studio Code has relied on @parcel/watcher, and in recent years TypeScript in VS Code has relied on its file watching capabilities indirectly. While it seemed promising, one of the problems for us with Parcel’s watcher is that it’s written in C++, and in turn requires a full C++ toolchain to build. Given our positive experience with Parcel’s watcher in VS Code, we explored porting it to Go with a few minimal assembly shims to avoid introducing a new toolchain dependency.
The exploration has been a success – what started as a very direct translation from C++ to Go was further refined into idiomatic Go that still passes the ported test suite. The watcher is a self-contained package that has allowed us to keep a clean separation of concerns between what we care to watch and why. We are now seeing significant resource improvements in --watch mode across platforms, and have been hearing positive feedback from earlier users of TypeScript 7.
We’d like to extend our thanks to Devon Govett whose work on Parcel has provided immense benefits to both the Visual Studio Code and TypeScript projects. We hope this port will provide opportunities and insights for the original Parcel watcher codebase over time.
Updates Since 5.x, and New Behaviors from 6.0
TypeScript 7.0 is made to be compatible with TypeScript 6.0’s type-checking and command-line behavior. Practically any TypeScript code that compiles cleanly with TypeScript 6.0 (with the stableTypeOrdering flag on, and without any ignoreDeprecations flag set) should compile identically in TypeScript 7.0.
With that said, TypeScript 7.0 adopts 6.0’s new defaults, and provides hard errors in the face of any flags and constructs deprecated in TypeScript 6.0. This is notable as 6.0 is still relatively new, and many projects will need to adapt to its new behaviors. We encourage developers to adopt TypeScript 6.0 to make the transition to TypeScript 7.0 easier, and you can also read the TypeScript 6.0 release blog post for more details on these deprecations.
At a glance, the notable default changes to configuration are:
- strict is true by default.
- module defaults to esnext.
- target defaults to the current stable ECMAScript version immediately preceding esnext.
- noUncheckedSideEffectImports is true by default.
- libReplacement is false by default.
- stableTypeOrdering is true by default, and cannot be turned off.
- rootDir now defaults to ./, and inner source directories must be explicitly set.
- types now defaults to [], and the old behavior can be restored by setting it to ["*"] .
We believe the rootDir and types changes may be the most “surprising” changes, but they can be mitigated easily. Projects where the tsconfig.json sits outside of a directory like src will simply need to include rootDir to preserve the same directory structure.
For the types change, projects that depend on specific global declarations will need to list them explicitly. For example,
The deprecations that have turned into hard errors with no-op behavior are:
- target: es5 is no longer supported.
- downlevelIteration is no longer supported.
- moduleResolution: node/node10 are no longer supported, with nodenext and bundler being recommended instead.
- module: amd, umd, systemjs, none are no longer supported, with esnext or preserve being recommended in conjunction with bundlers or browser-based module resolution.
- baseUrl is no longer supported, and paths can be updated to be relative to the project root instead of baseUrl.
- moduleResolution: classic is no longer supported, and bundler or nodenext are the recommended replacements.
- esModuleInterop and allowSyntheticDefaultImports cannot be set to false.
- alwaysStrict is assumed to be true and can no longer be set to false.
- The module keyword cannot be used in namespace declarations.
- The asserts keyword cannot be used on imports, and must use the with keyword instead (to align with developments on ECMAScript’s import attribute syntax).
- /// directives are no longer respected under skipDefaultLibCheck.
- Command line builds cannot take file paths when the current directory contains a tsconfig.json file unless passed an explicit --ignoreConfig flag.
Template Literal Types Now Preserve Unicode Code Points
TypeScript 7.0 now treats Unicode code points more naturally when inferring from template literal types. For example:
Previously, TypeScript followed JavaScript’s UTF-16 indexing behavior here and split "😀" into two halves of a surrogate pair (\ud83d and \ude00). That was technically consistent with indexing in JavaScript (e.g. the inferred Head type was equal to "😀abc"[0]), but it usually wasn’t what people intended, and could produce string literal types containing unpaired surrogates that aren’t semantically meaningful.
This is a breaking change for type-level string manipulation that intentionally modeled UTF-16 code units, such as some string Length utilities. In practice, we expect the new behavior to be more useful and less surprising: template literal inference now follows the same intuition as iterating a string with for...of or spreading it with [...str], where "😀" is treated as one unit.
JavaScript Differences
As we ported the existing codebase, we also took the opportunity to revisit how our JavaScript support works.
TypeScript originally supported JavaScript files by using JSDoc comments and recognizing certain code patterns for analysis and type inference. Lots of the time, this was based on popular coding patterns, but occasionally it was based on whatever people might be writing that Closure and the JSDoc doc generating tool might understand. While this approach was helpful for developers with loosely-written JSDoc codebases, it required a number of compromises and special cases to work well, and diverged in a number of ways from TypeScript’s analysis in .ts files.
In TypeScript 7.0, we have reworked our JavaScript support to be more consistent with how we analyze TypeScript files. Some of the differences include:
- Values cannot be used where types are expected – instead, write typeof someValue
- @enum is not specially recognized anymore – create a @typedef on (typeof YourEnumDeclaration)[keyof typeof YourEnumDeclaration].
- A standalone ? is no longer usable as a type – use any instead.
- @class does not make a function a constructor – use a class declaration instead.
- Postfix ! is not supported – just use T.
- Type names must be defined within a @typedef tag (i.e. /** @typedef {T} TypeAliasName /), not adjacent to an identifier (i.e. /* @typedef {T} */ TypeAliasName;).
- Closure-style function syntax (e.g. function(string): void) is no longer supported – use TypeScript shorthands instead (e.g. (s: string) => void).
Additionally, some JavaScript patterns, like aliasing this and reassigning the entirety of a function’s prototype are no longer specially treated.
While some of our JS support is in flux, we have been updating this CHANGES.md file to capture the differences between TypeScript 6.0 and 7.0 in more detail.
Editor Experience
As we mentioned above, TypeScript 7.0’s performance improvements are not limited to the command line experience – they also extend to the editor experience too. For VS Code users, we have a dedicated extension for TypeScript 7. When you install this extension, it will automatically become the default experience. You can disable and re-enable it at any time with the “Disable TypeScript 7 Language Server” and “Enable TypeScript 7 Language Server” commands from the command palette. In the coming weeks support for TypeScript 7 will ship as part of VS Code itself.
For Visual Studio users, the latest version of the IDE will automatically enable TypeScript 7 based on your workspace. You won’t need to do anything differently.
Of course, TypeScript 7 should work great in any editor of your choosing. The new foundation is built on the Language Server Protocol (LSP) and is able to leverage multiple threads to serve simultaneous requests as quickly as possible.
Since it first debuted, we’ve added in missing functionality like auto-imports, expandable hovers, inlay hints, code lenses, go-to-source-definition, JSX linked editing and tag completions, and more. Missing features from TypeScript 7.0 beta, such as semantic highlighting, “sort imports”, “remove unused imports”, and more are now in.
Additionally, we’ve continued to drive performance and stability in the past few months. We’ve rebuilt much of our testing and diagnostics infrastructure to make sure the quality bar is high, in which we are able to fuzz-test the language server against the top TypeScript and JavaScript codebases on GitHub. As we’ve mentioned above, TypeScript 7’s new language server is significantly more stable than TypeScript 6’s.
TypeScript and Embedded Languages
It’s worth calling out that workflows that use Vue, MDX, Astro, Svelte, and others will likely not yet be able to leverage TypeScript 7. Similarly, specialized type-checking within templates like Angular will also likely not use TypeScript 7. This is mainly because TypeScript 7 does not yet expose a stable programmatic API, and so tools (such as Volar) which embed TypeScript into their own compilers and language services can only currently rely on TypeScript 6.0. We expect this to be a point-in-time issue, as we are committed to providing a solution here. We will be actively working with the maintainers of these projects to ensure TypeScript 7 supports these workflows.
Until then, we recommend that teams use TypeScript 7 in scenarios where language server plugins are not required. Projects using Angular can use a combination of TypeScript 7 to get fast project-wide error detection at the CLI with tsc, and TypeScript 6.0 for editor support. Projects using Vue, MDX, Astro, Svelte, and others will need to continue using TypeScript 6.0 for now. In VS Code, users can simply run the “Disable TypeScript 7 Language Server” command to revert to TypeScript 6.0.
The Road Forward
TypeScript 7.0 is a major milestone in the TypeScript project. This port has been the primary focus of our team for over a year, and with 7.0 out, we will be returning to new feature work, ergonomic improvements, more performance wins, and implementing a new API for the broader ecosystem. While that seems major, we expect a fairly similar timeline to releases prior to TypeScript 7.0, with new featureful versions published every 3-4 months. With TypeScript 7.1 on the horizon, we hope to bridge any gaps to help bring the community forward.
We also encourage you to share your experience using TypeScript 7.0 online. Feel free to follow and tag @typescriptlang.org on Bluesky or @[email protected] on Mastodon, or @typescript on Twitter, and let us and others know what you think of TypeScript 7.
We know this new release will be incredibly valuable for the TypeScript ecosystem. We hope that it makes your day-to-day coding experience more fast, fun, productive, and joyful.
Welcome to the native era of the TypeScript toolset.
Happy Hacking!
– The TypeScript Team
Original source - Jul 6, 2026
- Date parsed from source:Jul 6, 2026
- First seen by Releasebot:Jul 6, 2026
oxlint_v1.73.0: release(apps): oxlint v1.73.0 && oxfmt v0.58.0 (#24219)
Oxc releases Oxlint and Oxfmt updates with new lint rules, broader rule options, faster type-aware linting, and many bug fixes. Oxfmt also adds formatter core improvements and CSS, GraphQL, and JSON formatting refinements, plus performance gains across the toolchain.
Oxlint
🚀 Features
7db7a29 allocator: Add ReplaceWith trait (#24012) (overlookmotel)
a2c97f3 linter/unicorn: Implement explicit-timer-delay rule (#23612) (Mikhail Baev)
85735cb linter/unicorn: Implement no-confusing-array-with rule (#23638) (Shekhu☺️)
cb4fbb9 linter/eslint: Implement no-unreachable-loop rule (#23975) (Todor Andonov)
dc32112 linter/eslint/no-constant-binary-expression: Check relational comparisons (#24088) (camc314)
439c344 linter/jsdoc: Added missing options to jsdoc/require-param rule (#23364) (kapobajza)
62af717 linter/unicorn/filename-case: Add lowercase and screamingSnakeCase (#24045) (Boshen)
d963967 linter/unicorn/no-array-sort: Add allowAfterSpread option (#24043) (Boshen)
0a75682 linter: Add per-rule timings for type-aware linting (#22488) (camchenry)
743e222 linter/react: Add disallowedValues option for forbid-dom-props rule (#23970) (Mikhail Baev)
🐛 Bug Fixes
7b80010 linter: Use direct binding symbol ids (#24216) (camc314)
8f94b49 linter/import/no-duplicates: Don't flag a type-only import beside a side-effect import (#24030) (Boshen)
d8c3fee linter/react/rules-of-hooks: Flag useEffectEvent escapes (#23764) (Rayan Salhab)
0a7312b linter/no-deprecated-functions: Map require.requireActual to jest.requireActual (#23627) (Jerry Zhao)
d9e3ab3 linter/eslint/no-useless-return: Handle switch case continuation (#23984) (camc314)
0b25582 ast: Type binding node typeAnnotation as TSTypeAnnotation | null (#23113) (Boshen)
122d112 linter/eslint/no-restricted-imports: Flag dynamic import() expressions (#24029) (Boshen)
59b6b83 linter: Avoid OnceLock re-entry on cyclic export * re-exports (#23632) (Jerry Zhao)
dd09af0 linter/import/namespace: Avoid panic on destructuring of an unresolvable namespace re-export (#23626) (Jerry Zhao)
bdb51c7 linter/jest/prefer-ending-with-an-expect: Validate config patterns (#24122) (camc314)
e383843 linter/unicorn/prefer-modern-dom-apis: Skip fixer for non identifier arguments (#23630) (Jerry Zhao)
0ac4c83 linter: Detect circular config extends (#24115) (camc314)
bae1edf linter/import/namespace: Check namespace imports after named imports (#24094) (camc314)
cd8fdfe linter/eslint/no-eval: Recognize Array.from family thisArg (#24091) (camc314)
851ee43 linter/eslint/no-eval: Resolve this binding for functions returned from an IIFE (#23643) (Jerry Zhao)
002ab35 linter/unicorn: Avoid prefer-array-find rest destructuring false positive (#23654) (ColemanDunn)
01c8775 linter/unicorn/filename-case: Keep digits attached in screamingSnakeCase (#24056) (Boshen)
f256941 linter: Recognize @effect/vitest as a vitest import source (#24025) (Boshen)
73eeb1d linter/import/extensions: Honor per-extension never for explicit extensions (#24031) (Boshen)
d4ebe1f linter: Reject non-object oxlint config files (#24026) (Boshen)
45d607d linter/react/forbid-component-props: Make allow/disallow lists optional in schema (#24024) (Boshen)
54076ad linter/unicorn/no-array-for-each: Suggest entries loop for index callbacks (#24004) (camc314)
d057736 linter/jsdoc: Avoid param root underflow (#23945) (camc314)
29c76bf linter/unicorn/prefer-at: Skip object numeric-key access (#23909) (Gaurav Dubey)
⚡ Performance
657a8fc linter/oxc/bad-array-method-on-arguments: Only run on member expressions instead of all identifiers (#24164) (camchenry)
073d9e7 linter/eslint/prefer-rest-params: Run on functions instead of all identifiers (#24163) (camchenry)
e5a4162 linter/jest/no-confusing-set-timeout: Early exit fast path (#24092) (camc314)
bca7ce5 linter: Only run react-perf rules on JSX attribute nodes (#24083) (camchenry)
6881bf6 linter: Compute apply_overrides rule set lazily (#23648) (Jerry Zhao)
911c106 linter/eslint/no-obj-calls: Use resolved reference instead of scope walk (#23895) (Marius Schulz)
dc8fd9a linter/unicorn/prefer-dom-node-text-content: Change dispatch to run only on less common node types (#23897) (Connor Shea)
fdbd34d linter/eslint/no-useless-call: Fast-path static callees (#24077) (camc314)
b1be114 linter/import/extensions: Skip empty config and borrow extensions (#24075) (camc314)
4781b2d linter/eslint/no-obj-calls: Use direct global matches (#24076) (camc314)
e6cee89 linter: Avoid node-chain allocation for non-Jest calls (#23907) (Yagiz Nizipli)
30dc517 linter/typescript/no-restricted-types: O(1) banned-type lookups (#23827) (Yagiz Nizipli)
📚 Documentation
6ca9125 linter/typescript: Clarify consistent-type-imports behavior (#23972) (camc314)
Oxfmt
🚀 Features
4f4313e formatter_css: Update oxc-css-parser 0.0.5 (#24120) (leaysgur)
0ccd8a1 formatter_graphql: Update oxc-graphql-parser 0.0.5 (#24106) (leaysgur)
89ec3d9 formatter_core: Add literal line and root indention primitives (#24051) (leaysgur)
213a96b formatter_core: Add no-expand-parent for multiline text (#24050) (leaysgur)
0e5bcc9 formatter_graphql: Update oxc-graphql-parser 0.0.4 (#24039) (leaysgur)
e0b35a1 formatter_css: Update [email protected] (#23974) (leaysgur)
🐛 Bug Fixes
1fe6546 formatter: Omit unneeded ; for type members with no-semi (#24212) (leaysgur)
0ad7316 formatter: Print space for ForStatement.update only if exists (#24211) (leaysgur)
3abbed5 formatter: Print ; before jsdoc type-cast parens with no-semi (#24208) (leaysgur)
9af3833 formatter_css: Make scss formatter consistent (#24207) (leaysgur)
46d7194 formatter_css: Use fill IR for @forward members (#24206) (leaysgur)
e31038f formatter_css: Keep comment inside sass config list (#24205) (leaysgur)
d3b9591 formatter: Add parens around await/yield with <T> (#24202) (leaysgur)
2121a55 oxfmt: Reuse tinypool process during the same LSP process (#24197) (leaysgur)
9bf4b4a formatter_css: Align CSS output to Prettier 3.9.1 (#24100) (leaysgur)
cd2452e formatter_css: Align SCSS output to Prettier 3.9.1 (#24097) (leaysgur)
4ee8745 formatter_css: Keep selector value contain line-break without breaking line (#24055) (leaysgur)
e1ece97 formatter_graphql: Break implements list by print-width (#23997) (leaysgur)
0a6b16c formatter_json: Preserve key and literal value for json-stringify (#23996) (leaysgur)
903ab6e formatter_css: Preserve newlines in css-in-js selector list (#23992) (leaysgur)
ea5d095 oxfmt: Update --migrate prettier (#23963) (leaysgur)
⚡ Performance
468e1e3 formatter_core: Make printer queues cursor-based (#24098) (Boshen)
c59f2fe rust: Return impl ExactSizeIterator from slice-backed accessors (#24144) (Boshen)
c292fb2 formatter: Inline fits element dispatcher (#23982) (camc314)
Co-authored-by: Boshen [email protected]
Original source - Jul 6, 2026
- Date parsed from source:Jul 6, 2026
- First seen by Releasebot:Jul 6, 2026
oxfmt_v0.58.0: release(apps): oxlint v1.73.0 && oxfmt v0.58.0 (#24219)
Oxc releases new lint rules, bug fixes, and performance improvements, including richer React, Unicorn, ESLint, JSDoc, and import checks plus per-rule timing for type-aware linting. Oxfmt also adds formatter core updates, CSS and GraphQL parser upgrades, and multiple formatting fixes.
Oxlint
🚀 Features
7db7a29 allocator: Add ReplaceWith trait (#24012) (overlookmotel)
a2c97f3 linter/unicorn: Implement explicit-timer-delay rule (#23612) (Mikhail Baev)
85735cb linter/unicorn: Implement no-confusing-array-with rule (#23638) (Shekhu☺️)
cb4fbb9 linter/eslint: Implement no-unreachable-loop rule (#23975) (Todor Andonov)
dc32112 linter/eslint/no-constant-binary-expression: Check relational comparisons (#24088) (camc314)
439c344 linter/jsdoc: Added missing options to jsdoc/require-param rule (#23364) (kapobajza)
62af717 linter/unicorn/filename-case: Add lowercase and screamingSnakeCase (#24045) (Boshen)
d963967 linter/unicorn/no-array-sort: Add allowAfterSpread option (#24043) (Boshen)
0a75682 linter: Add per-rule timings for type-aware linting (#22488) (camchenry)
743e222 linter/react: Add disallowedValues option for forbid-dom-props rule (#23970) (Mikhail Baev)
🐛 Bug Fixes
7b80010 linter: Use direct binding symbol ids (#24216) (camc314)
8f94b49 linter/import/no-duplicates: Don't flag a type-only import beside a side-effect import (#24030) (Boshen)
d8c3fee linter/react/rules-of-hooks: Flag useEffectEvent escapes (#23764) (Rayan Salhab)
0a7312b linter/no-deprecated-functions: Map require.requireActual to jest.requireActual (#23627) (Jerry Zhao)
d9e3ab3 linter/eslint/no-useless-return: Handle switch case continuation (#23984) (camc314)
0b25582 ast: Type binding node typeAnnotation as TSTypeAnnotation | null (#23113) (Boshen)
122d112 linter/eslint/no-restricted-imports: Flag dynamic import() expressions (#24029) (Boshen)
59b6b83 linter: Avoid OnceLock re-entry on cyclic export * re-exports (#23632) (Jerry Zhao)
dd09af0 linter/import/namespace: Avoid panic on destructuring of an unresolvable namespace re-export (#23626) (Jerry Zhao)
bdb51c7 linter/jest/prefer-ending-with-an-expect: Validate config patterns (#24122) (camc314)
e383843 linter/unicorn/prefer-modern-dom-apis: Skip fixer for non identifier arguments (#23630) (Jerry Zhao)
0ac4c83 linter: Detect circular config extends (#24115) (camc314)
bae1edf linter/import/namespace: Check namespace imports after named imports (#24094) (camc314)
cd8fdfe linter/eslint/no-eval: Recognize Array.from family thisArg (#24091) (camc314)
851ee43 linter/eslint/no-eval: Resolve this binding for functions returned from an IIFE (#23643) (Jerry Zhao)
002ab35 linter/unicorn: Avoid prefer-array-find rest destructuring false positive (#23654) (ColemanDunn)
01c8775 linter/unicorn/filename-case: Keep digits attached in screamingSnakeCase (#24056) (Boshen)
f256941 linter: Recognize @effect/vitest as a vitest import source (#24025) (Boshen)
73eeb1d linter/import/extensions: Honor per-extension never for explicit extensions (#24031) (Boshen)
d4ebe1f linter: Reject non-object oxlint config files (#24026) (Boshen)
45d607d linter/react/forbid-component-props: Make allow/disallow lists optional in schema (#24024) (Boshen)
54076ad linter/unicorn/no-array-for-each: Suggest entries loop for index callbacks (#24004) (camc314)
d057736 linter/jsdoc: Avoid param root underflow (#23945) (camc314)
29c76bf linter/unicorn/prefer-at: Skip object numeric-key access (#23909) (Gaurav Dubey)
⚡ Performance
657a8fc linter/oxc/bad-array-method-on-arguments: Only run on member expressions instead of all identifiers (#24164) (camchenry)
073d9e7 linter/eslint/prefer-rest-params: Run on functions instead of all identifiers (#24163) (camchenry)
e5a4162 linter/jest/no-confusing-set-timeout: Early exit fast path (#24092) (camc314)
bca7ce5 linter: Only run react-perf rules on JSX attribute nodes (#24083) (camchenry)
6881bf6 linter: Compute apply_overrides rule set lazily (#23648) (Jerry Zhao)
911c106 linter/eslint/no-obj-calls: Use resolved reference instead of scope walk (#23895) (Marius Schulz)
dc8fd9a linter/unicorn/prefer-dom-node-text-content: Change dispatch to run only on less common node types (#23897) (Connor Shea)
fdbd34d linter/eslint/no-useless-call: Fast-path static callees (#24077) (camc314)
b1be114 linter/import/extensions: Skip empty config and borrow extensions (#24075) (camc314)
4781b2d linter/eslint/no-obj-calls: Use direct global matches (#24076) (camc314)
e6cee89 linter: Avoid node-chain allocation for non-Jest calls (#23907) (Yagiz Nizipli)
30dc517 linter/typescript/no-restricted-types: O(1) banned-type lookups (#23827) (Yagiz Nizipli)
📚 Documentation
6ca9125 linter/typescript: Clarify consistent-type-imports behavior (#23972) (camc314)
Oxfmt
🚀 Features
4f4313e formatter_css: Update oxc-css-parser 0.0.5 (#24120) (leaysgur)
0ccd8a1 formatter_graphql: Update oxc-graphql-parser 0.0.5 (#24106) (leaysgur)
89ec3d9 formatter_core: Add literal line and root indention primitives (#24051) (leaysgur)
213a96b formatter_core: Add no-expand-parent for multiline text (#24050) (leaysgur)
0e5bcc9 formatter_graphql: Update oxc-graphql-parser 0.0.4 (#24039) (leaysgur)
e0b35a1 formatter_css: Update [email protected] (#23974) (leaysgur)
🐛 Bug Fixes
1fe6546 formatter: Omit unneeded ; for type members with no-semi (#24212) (leaysgur)
0ad7316 formatter: Print space for ForStatement.update only if exists (#24211) (leaysgur)
3abbed5 formatter: Print ; before jsdoc type-cast parens with no-semi (#24208) (leaysgur)
9af3833 formatter_css: Make scss formatter consistent (#24207) (leaysgur)
46d7194 formatter_css: Use fill IR for @forward members (#24206) (leaysgur)
e31038f formatter_css: Keep comment inside sass config list (#24205) (leaysgur)
d3b9591 formatter: Add parens around await/yield with <T> (#24202) (leaysgur)
2121a55 oxfmt: Reuse tinypool process during the same LSP process (#24197) (leaysgur)
9bf4b4a formatter_css: Align CSS output to Prettier 3.9.1 (#24100) (leaysgur)
cd2452e formatter_css: Align SCSS output to Prettier 3.9.1 (#24097) (leaysgur)
4ee8745 formatter_css: Keep selector value contain line-break without breaking line (#24055) (leaysgur)
e1ece97 formatter_graphql: Break implements list by print-width (#23997) (leaysgur)
0a6b16c formatter_json: Preserve key and literal value for json-stringify (#23996) (leaysgur)
903ab6e formatter_css: Preserve newlines in css-in-js selector list (#23992) (leaysgur)
ea5d095 oxfmt: Update --migrate prettier (#23963) (leaysgur)
⚡ Performance
468e1e3 formatter_core: Make printer queues cursor-based (#24098) (Boshen)
c59f2fe rust: Return impl ExactSizeIterator from slice-backed accessors (#24144) (Boshen)
c292fb2 formatter: Inline fits element dispatcher (#23982) (camc314)
Co-authored-by: Boshen [email protected]
Original source - Jul 6, 2026
- Date parsed from source:Jul 6, 2026
- First seen by Releasebot:Jul 6, 2026
oxc crates_v0.139.0
Oxc releases a broad update with new AST and allocator traits, minifier improvements for boolean ternaries and dead code cleanup, and mangler support for reserved names. It also tightens transformer and React compiler behavior while delivering performance gains and doc updates.
Features
260425f semantic/examples: Include unresolved references (#24214) (camc314)
2d9b0b3 minifier: Fold boolean-literal ternary branches in value contexts (#24110) (Dunqing)
61fbf10 ast: Implement ReplaceWith on all AST types (#24013) (overlookmotel)
7db7a29 allocator: Add ReplaceWith trait (#24012) (overlookmotel)
4eb074e mangler: Add reserved option for names that must not be mangled (#24041) (Dunqing)
2e62012 data_structures: Add StringExt trait (#24006) (overlookmotel)
60e7160 minifier: Drop side-effect-free IIFEs whose result is unused (#23967) (Dunqing)
26dd9e2 ast: Add method to widen inherited enum ref to parent ref (#23961) (overlookmotel)
Bug Fixes
df62046 transformer: Preserve decorated class read bindings (#24231) (camc314)
ce5f40f transformer: Declare temp for renamed anonymous class (#24230) (camc314)
09bd638 transformer: Scope anonymous decorated class bindings correctly (#24229) (camc314)
4b7fa9c transformer: Preserve namespace strict mode flags (#24227) (camc314)
d8ead84 transformer: Correct scoping flags for lowered enums (#24225) (camc314)
e8b50ee transformer: Clean up semantics for stripped TypeScript syntax (#24180) (camc314)
d966d0b react_compiler: Remove clippy allows (#24168) (Boshen)
854ef8d react_compiler: Compile generic functions instead of over-bailing on type-param hoisting (#24158) (Boshen)
093586c react_compiler: Align memoization cache-slot allocation with Babel (#24157) (Boshen)
09c8f59 react_compiler: Normalize snapshot fixture paths (#24142) (camc314)
f13df97 react_compiler: Drop stray empty statement from catch bindings (#24133) (Boshen)
cb2a505 react_compiler: Codegen destructuring reassignment targets (#24131) (Boshen)
b82c394 react_compiler: Propagate codegen invariants instead of emitting empty bodies (#24128) (Boshen)
5771982 react_compiler: Render unchanged programs as source in fixture snapshots (#24129) (Boshen)
4b16e1a transformer/async-to-generator: Preserve direct eval scope flags (#24136) (camc314)
4e9194f react_compiler: Lower delete obj.prop to Property/ComputedDelete (#24123) (Boshen)
0b25582 ast: Type binding node typeAnnotation as TSTypeAnnotation | null (#23113) (Boshen)
018c0e5 transformer: Hoist lowered async declarations (#22770) (camc314)
652fbaf mangler: Keep names of destructured exported bindings (#24036) (Dunqing)
e274415 minifier: Don't drop global calls that throw despite pure arguments (#23917) (Dunqing)
59abb30 minifier: Only merge string literals in try_fold_add when the inner operator is + (#23622) (Jerry Zhao)
Performance
c5ca77b transformer: Avoid cloning refresh options (#24191) (camc314)
bf1a151 react_compiler: Compile out debug printers (#24184) (Boshen)
abb44a0 transformer: Build fixed object-rest arguments (#24190) (camc314)
a4db731 isolated_declarations: Use ReplaceWith instead of TakeIn (#24016) (overlookmotel)
ff10855 transformer: Use ReplaceWith instead of TakeIn (#24015) (overlookmotel)
bd49aff ecmascript: Avoid heap-allocating Math.min/max/imul operands (#23941) (Lawrence Lin)
e4b708b react_compiler: Skip compiled files before prefilters (#24171) (Boshen)
c59f2fe rust: Return impl ExactSizeIterator from slice-backed accessors (#24144) (Boshen)
5d6d04a codegen: SWAR-skip boring byte runs in sourcemap line/column scan (#24023) (Boshen)
a55e0be traverse: Reduce string operations in get_var_name_from_node (#24007) (overlookmotel)
e6d48e1 transformer/nullish_coalescing: Move cold path into separate function (#23989) (overlookmotel)
c4e35b5 transformer/object_rest_spread: Pre-allocate capacity in Vec (#23988) (overlookmotel)
527b8e5 transformer/decorators: Narrow type earlier (#23987) (overlookmotel)
Documentation
1589f54 semantic: Update docs for Scoping::set_symbol_name (#24223) (camc314)
30d17f5 allocator: Clarify docs for TakeIn::take_in_box (#24093) (overlookmotel)
675e6a8 ast: Correct doc comment for PrivateFieldExpression (#24008) (overlookmotel)
e4c30e6 minifier: Explain what dce mode means (#23994) (Dunqing)
37cbf88 ast_macros: Document fields of StructDetails (#23959) (overlookmotel)
4de3e54 ast: Correct doc comment (#23948) (overlookmotel)
Original source - Jul 6, 2026
- Date parsed from source:Jul 6, 2026
- First seen by Releasebot:Jul 6, 2026
oxlint v1.73.0 & oxfmt v0.58.0
Oxc ships Oxlint v1.73.0 and Oxfmt v0.58.0 with new lint rules, broader formatter support, bug fixes, and performance gains. The release also adds per-rule timing for type-aware linting and updates CSS, GraphQL, and JSON formatting behavior.
Table of Contents
Oxlint v1.73.0
Oxfmt v0.58.0
Oxlint v1.73.0
🚀 Features
7db7a29 allocator: Add ReplaceWith trait (#24012) (overlookmotel)
a2c97f3 linter/unicorn: Implement explicit-timer-delay rule (#23612) (Mikhail Baev)
85735cb linter/unicorn: Implement no-confusing-array-with rule (#23638) (Shekhu☺️)
cb4fbb9 linter/eslint: Implement no-unreachable-loop rule (#23975) (Todor Andonov)
dc32112 linter/eslint/no-constant-binary-expression: Check relational comparisons (#24088) (camc314)
439c344 linter/jsdoc: Added missing options to jsdoc/require-param rule (#23364) (kapobajza)
62af717 linter/unicorn/filename-case: Add lowercase and screamingSnakeCase (#24045) (Boshen)
d963967 linter/unicorn/no-array-sort: Add allowAfterSpread option (#24043) (Boshen)
0a75682 linter: Add per-rule timings for type-aware linting (#22488) (camchenry)
743e222 linter/react: Add disallowedValues option for forbid-dom-props rule (#23970) (Mikhail Baev)
🐛 Bug Fixes
7b80010 linter: Use direct binding symbol ids (#24216) (camc314)
8f94b49 linter/import/no-duplicates: Don't flag a type-only import beside a side-effect import (#24030) (Boshen)
d8c3fee linter/react/rules-of-hooks: Flag useEffectEvent escapes (#23764) (Rayan Salhab)
0a7312b linter/no-deprecated-functions: Map require.requireActual to jest.requireActual (#23627) (Jerry Zhao)
d9e3ab3 linter/eslint/no-useless-return: Handle switch case continuation (#23984) (camc314)
0b25582 ast: Type binding node typeAnnotation as TSTypeAnnotation | null (#23113) (Boshen)
122d112 linter/eslint/no-restricted-imports: Flag dynamic import() expressions (#24029) (Boshen)
59b6b83 linter: Avoid OnceLock re-entry on cyclic export * re-exports (#23632) (Jerry Zhao)
dd09af0 linter/import/namespace: Avoid panic on destructuring of an unresolvable namespace re-export (#23626) (Jerry Zhao)
bdb51c7 linter/jest/prefer-ending-with-an-expect: Validate config patterns (#24122) (camc314)
e383843 linter/unicorn/prefer-modern-dom-apis: Skip fixer for non identifier arguments (#23630) (Jerry Zhao)
0ac4c83 linter: Detect circular config extends (#24115) (camc314)
bae1edf linter/import/namespace: Check namespace imports after named imports (#24094) (camc314)
cd8fdfe linter/eslint/no-eval: Recognize Array.from family thisArg (#24091) (camc314)
851ee43 linter/eslint/no-eval: Resolve this binding for functions returned from an IIFE (#23643) (Jerry Zhao)
002ab35 linter/unicorn: Avoid prefer-array-find rest destructuring false positive (#23654) (ColemanDunn)
01c8775 linter/unicorn/filename-case: Keep digits attached in screamingSnakeCase (#24056) (Boshen)
f256941 linter: Recognize @effect/vitest as a vitest import source (#24025) (Boshen)
73eeb1d linter/import/extensions: Honor per-extension never for explicit extensions (#24031) (Boshen)
d4ebe1f linter: Reject non-object oxlint config files (#24026) (Boshen)
45d607d linter/react/forbid-component-props: Make allow/disallow lists optional in schema (#24024) (Boshen)
54076ad linter/unicorn/no-array-for-each: Suggest entries loop for index callbacks (#24004) (camc314)
d057736 linter/jsdoc: Avoid param root underflow (#23945) (camc314)
29c76bf linter/unicorn/prefer-at: Skip object numeric-key access (#23909) (Gaurav Dubey)
⚡ Performance
657a8fc linter/oxc/bad-array-method-on-arguments: Only run on member expressions instead of all identifiers (#24164) (camchenry)
073d9e7 linter/eslint/prefer-rest-params: Run on functions instead of all identifiers (#24163) (camchenry)
e5a4162 linter/jest/no-confusing-set-timeout: Early exit fast path (#24092) (camc314)
bca7ce5 linter: Only run react-perf rules on JSX attribute nodes (#24083) (camchenry)
6881bf6 linter: Compute apply_overrides rule set lazily (#23648) (Jerry Zhao)
911c106 linter/eslint/no-obj-calls: Use resolved reference instead of scope walk (#23895) (Marius Schulz)
dc8fd9a linter/unicorn/prefer-dom-node-text-content: Change dispatch to run only on less common node types (#23897) (Connor Shea)
fdbd34d linter/eslint/no-useless-call: Fast-path static callees (#24077) (camc314)
b1be114 linter/import/extensions: Skip empty config and borrow extensions (#24075) (camc314)
4781b2d linter/eslint/no-obj-calls: Use direct global matches (#24076) (camc314)
e6cee89 linter: Avoid node-chain allocation for non-Jest calls (#23907) (Yagiz Nizipli)
30dc517 linter/typescript/no-restricted-types: O(1) banned-type lookups (#23827) (Yagiz Nizipli)
📚 Documentation
6ca9125 linter/typescript: Clarify consistent-type-imports behavior (#23972) (camc314)
Oxfmt v0.58.0
🚀 Features
4f4313e formatter_css: Update oxc-css-parser 0.0.5 (#24120) (leaysgur)
0ccd8a1 formatter_graphql: Update oxc-graphql-parser 0.0.5 (#24106) (leaysgur)
89ec3d9 formatter_core: Add literal line and root indention primitives (#24051) (leaysgur)
213a96b formatter_core: Add no-expand-parent for multiline text (#24050) (leaysgur)
0e5bcc9 formatter_graphql: Update oxc-graphql-parser 0.0.4 (#24039) (leaysgur)
e0b35a1 formatter_css: Update [email protected] (#23974) (leaysgur)
🐛 Bug Fixes
1fe6546 formatter: Omit unneeded ; for type members with no-semi (#24212) (leaysgur)
0ad7316 formatter: Print space for ForStatement.update only if exists (#24211) (leaysgur)
3abbed5 formatter: Print ; before jsdoc type-cast parens with no-semi (#24208) (leaysgur)
9af3833 formatter_css: Make scss formatter consistent (#24207) (leaysgur)
46d7194 formatter_css: Use fill IR for @forward members (#24206) (leaysgur)
e31038f formatter_css: Keep comment inside sass config list (#24205) (leaysgur)
d3b9591 formatter: Add parens around await/yield with <T> (#24202) (leaysgur)
2121a55 oxfmt: Reuse tinypool process during the same LSP process (#24197) (leaysgur)
9bf4b4a formatter_css: Align CSS output to Prettier 3.9.1 (#24100) (leaysgur)
cd2452e formatter_css: Align SCSS output to Prettier 3.9.1 (#24097) (leaysgur)
4ee8745 formatter_css: Keep selector value contain line-break without breaking line (#24055) (leaysgur)
e1ece97 formatter_graphql: Break implements list by print-width (#23997) (leaysgur)
0a6b16c formatter_json: Preserve key and literal value for json-stringify (#23996) (leaysgur)
903ab6e formatter_css: Preserve newlines in css-in-js selector list (#23992) (leaysgur)
ea5d095 oxfmt: Update --migrate prettier (#23963) (leaysgur)
⚡ Performance
468e1e3 formatter_core: Make printer queues cursor-based (#24098) (Boshen)
c59f2fe rust: Return impl ExactSizeIterator from slice-backed accessors (#24144) (Boshen)
c292fb2 formatter: Inline fits element dispatcher (#23982) (camc314)
Original source - Jul 6, 2026
- Date parsed from source:Jul 6, 2026
- First seen by Releasebot:Jul 6, 2026
v8.63.0
typescript-eslint releases 8.63.0 with new eslint-plugin checks for async sync-dispose misuse, plus fixes for method signature style, optional-chained overloaded calls, shadowed String() calls, and an exported ClassStaticBlockScope.
8.63.0 (2026-07-06)
🚀 Features
eslint-plugin: [no-misused-promises] detect async usage of a sync dispose usage (#12426)
🩹 Fixes
eslint-plugin: [method-signature-style] suggest converting readonly function properties instead of emitting invalid syntax (#12447, #12446)
eslint-plugin: [no-unnecessary-type-assertion] handle optional-chained calls to overloaded functions (#12491, #12485)
eslint-plugin: [no-base-to-string] don't flag a shadowed String() call (#12492)
scope-manager: export ClassStaticBlockScope (#12460)
❤️ Thank You
Evyatar Daud @StyleShit
Kristjan @KristjanTammekivi
Michael Naumov @mnaoumov
Serhii Leniv @Serhii-Leniv
송재욱
See GitHub Releases for more information.
You can read about our versioning strategy and releases on our website.
Original source - Jun 29, 2026
- Date parsed from source:Jun 29, 2026
- First seen by Releasebot:Jun 30, 2026
oxlint_v1.72.0: release(apps): oxlint v1.72.0 && oxfmt v0.57.0 (#23935)
Oxc ships major Oxlint and Oxfmt updates with breaking changes, new CSS and GraphQL formatter support, a unified AST builder, fresh lint rules, autofixes, and broad performance and bug fixes across the toolchain.
Oxlint
💥 BREAKING CHANGES
- 88f4455 str: [BREAKING] Str and Ident methods take
&GetAllocator (#23781) (overlookmotel)
🚀 Features
- f2091b3 ast: Unify old and new AstBuilders (#23875) (overlookmotel)
- 1c8f50c linter: Add schema for eslint/no-restricted-import (#23642)
(Sysix)
🐛 Bug Fixes
- 7cb85c4 linter/eslint/no-negated-condition: Add autofix for negated
conditions (#23825) (Yagiz Nizipli) - f7d1f50 oxlint, oxfmt: Enable disable_old_builder Cargo feature for
oxc_ast crate (#23886) (overlookmotel) - d891990 linter/jsx-a11y/role-supports-aria-props: Ignore nullish prop
values (#23865) (Mikhail Baev) - 94b6599 linter: Deduplicate missing plugin errors (#23853) (camc314)
- eff3eff linter/oxc/branches-sharing-code: Avoid else-if false
positives (#23843) (camc314) - 2a2d3b9 linter/eslint/prefer-destructuring: Skip
AssignmentExpression autofixes (#23818) (camc314) - ddc24ae linter/eslint/id-length: Respect checkGeneric for mapped type
keys (#23802) (bab) - cd89202 linter/react/exhaustive-deps: Skip wrapper expression when
analyzing hook initializers (#23793) (camc314) - 20e8285 linter/unicorn/prefer-native-coercion-function: Allow ts type
predicates (#23774) (camc314) - d86f60b lsp: Normalize user config path to watch pattern (#23723)
(Sysix) - 52032cf linter: Newline-terminate tsgolint errors (#23762) (Mikhail
Baev) - 368fda7 linter/eslint/no-warning-comments: Avoid dropping generated
regex patterns (#23741) (camc314) - ce44fbd linter/valid-title: Escape disallowed words regex (#23742)
(camc314) - 3100d11 linter/prefer-called-exactly-once-with: Avoid out-of-bounds
slice panic at end of file (#23625) (Jerry Zhao) - 742be36 refactor/node/handle-callback-err: Reject invalid regex config
(#23740) (camc314) - d7be179 linter/eslint/no-restricted-globals: Handle shadowed locals
(#23736) (camc314) - b3b1ff8 linter/vitest/expect-expect: Handle global vitest detection
correctly (#23734) (camc314)
⚡ Performance
- 68f9472 linter/jsx-a11y: Skip lowercasing non-aria attribute names
(#23906) (Lawrence Lin) - b9312b4 linter/unicorn/prefer-export-from: Use keyed binding lookup
(#23893) (Marius Schulz) - cd5204e linter/typescript/no-unsafe-declaration-merging: Use keyed
binding lookup (#23894) (Marius Schulz) - e948498 linter/eslint/prefer-named-capture-group: Only dispatch for
relevant node types (#23868) (Connor Shea) - 4ac7a8e linter/eslint/max-depth: Derive node types (#23896) (Connor
Shea) - daeed09 linter/eslint/no-restricted-globals: Only scan unresolved
references (#23890) (camc314) - e808514 linter/jest-vitest: Speed up no-standalone-expect (#23883)
(camc314) - 8b165e5 linter/react/exhaustive-deps: Skip non-reactive calls early
(#23882) (camc314) - 54005e7 linter/eslint/no-unused-vars: Precompute exported bindings
(#23881) (camc314) - 9bc2f8c linter/unicorn/prefer-number-properties: Speed up global
checks (#23880) (camc314) - 4ff104f linter: Optimize require-hook and prefer-mock-* rules to
run on specific node types (#23871) (Connor Shea) - cc2213b linter: Run no-underscore-dangle only when relevant node
types are present (#23867) (Connor Shea) - 3e55c21 linter/promise/always-return: Narrow to function node types
(#23878) (Connor Shea) - 7136182 linter/jest-vitest: Speed up no-commented-out-tests (#23864)
(camc314) - f138264 linter/eslint/no-script-url: Match javascript: prefix without
allocating (#23861) (Lawrence Lin) - 7ef6895 linter/react/no-array-index-key: Delay index symbol lookup
(#23857) (camc314) - 26bc171 linter/react/no-array-index-key: Match callback methods
directly (#23856) (camc314) - 44fbbda linter/jsx-a11y/interactive-supports-focus: Check cheap
conditions first (#23854) (camc314) - 84a5aa3 linter/eslint/no-extend-native: Skip lowercase references
early (#23851) (camc314) - 88a74b2 linter/eslint/no-nonoctal-decimal-escape: Scan decimal escapes
as bytes (#23850) (camc314) - fca69a8 linter: Skip traversal without this expressions (#23845)
(camc314) - 838fd63 linter: Reduce preallocation for per-file diagnostics Vec
(#23705) (Marius Schulz) - 417b506 linter/typescript/array-type: Remove full source text clone
(#23751) (Marius Schulz)
📚 Documentation
- 57e4469 linter/unicorn: Update prefer-dom-node-text-content rationale
(#23933) (Mikhail Baev) - 3d61dea all: Correct capitalization in comments (#23887)
(overlookmotel)
🛡️ Security
- 3cdd18f deps: Update npm packages (#23690) (renovate[bot])
Oxfmt
💥 BREAKING CHANGES
- 259e0cd oxfmt,formatter_graphql: [BREAKING] Support draft syntax
with removing prettier fallback (#23326) (leaysgur) - accbc49 oxfmt: [BREAKING] Format parser:css,less,scss files +
css-in-js by oxc_formatter_css (#23321) (leaysgur)
🚀 Features
- dffa4b3 formatter_css: Implement oxc_formatter_css (#23320)
(leaysgur) - 01de9ec oxfmt: Format parser:graphql files by
oxc_formatter_graphql (#23318) (leaysgur) - 4e66212 formatter_graphql: Implement oxc_formatter_graphql (#23317)
(leaysgur)
🐛 Bug Fixes
- 67325ae formatter_css: Handle frontmatter language (#23819) (leaysgur)
- 3f355e5 formatter_graphql: Improve major prettier diffs (#23419)
(leaysgur) - 48e2d78 formatter_css: Improve major prettier diffs (#23327)
(leaysgur) - 8c07cad all: Enable disable_old_builder Cargo feature for oxc_ast
crate in tests (#23888) (overlookmotel) - f7d1f50 oxlint, oxfmt: Enable disable_old_builder Cargo feature for
oxc_ast crate (#23886) (overlookmotel) - d86f60b lsp: Normalize user config path to watch pattern (#23723)
(Sysix)
⚡ Performance
- 4ddcba0 formatter_core: Add printable-ASCII fast path to TextWidth
(#23913) (Lawrence Lin)
📚 Documentation
- b4d0dc9 oxfmt,formatter,formatter_css,formatter_core: Update AGENTS.md
(#23814) (leaysgur)
Co-authored-by: Boshen [email protected]
Co-authored-by: Cameron [email protected]
Original source - Jun 29, 2026
- Date parsed from source:Jun 29, 2026
- First seen by Releasebot:Jun 30, 2026
oxfmt_v0.57.0: release(apps): oxlint v1.72.0 && oxfmt v0.57.0 (#23935)
Oxc releases major updates to Oxlint and Oxfmt with breaking AST and formatter changes, new CSS and GraphQL formatting support, a new eslint/no-restricted-import schema, broad lint rule fixes, and performance improvements across linting and formatting.
Oxlint
💥 BREAKING CHANGES
88f4455 str: [BREAKING] Str and Ident methods take
&GetAllocator (#23781) (overlookmotel)🚀 Features
f2091b3 ast: Unify old and new AstBuilders (#23875) (overlookmotel)
1c8f50c linter: Add schema for eslint/no-restricted-import (#23642)
(Sysix)🐛 Bug Fixes
7cb85c4 linter/eslint/no-negated-condition: Add autofix for negated
conditions (#23825) (Yagiz Nizipli)f7d1f50 oxlint, oxfmt: Enable disable_old_builder Cargo feature for
oxc_ast crate (#23886) (overlookmotel)d891990 linter/jsx-a11y/role-supports-aria-props: Ignore nullish prop
values (#23865) (Mikhail Baev)94b6599 linter: Deduplicate missing plugin errors (#23853) (camc314)
eff3eff linter/oxc/branches-sharing-code: Avoid else-if false
positives (#23843) (camc314)2a2d3b9 linter/eslint/prefer-destructuring: Skip
AssignmentExpression autofixes (#23818) (camc314)ddc24ae linter/eslint/id-length: Respect checkGeneric for mapped type
keys (#23802) (bab)cd89202 linter/react/exhaustive-deps: Skip wrapper expression when
analyzing hook initializers (#23793) (camc314)20e8285 linter/unicorn/prefer-native-coercion-function: Allow ts type
predicates (#23774) (camc314)d86f60b lsp: Normalize user config path to watch pattern (#23723)
(Sysix)52032cf linter: Newline-terminate tsgolint errors (#23762) (Mikhail
Baev)368fda7 linter/eslint/no-warning-comments: Avoid dropping generated
regex patterns (#23741) (camc314)ce44fbd linter/valid-title: Escape disallowed words regex (#23742)
(camc314)3100d11 linter/prefer-called-exactly-once-with: Avoid out-of-bounds
slice panic at end of file (#23625) (Jerry Zhao)742be36 refactor/node/handle-callback-err: Reject invalid regex config
(#23740) (camc314)d7be179 linter/eslint/no-restricted-globals: Handle shadowed locals
(#23736) (camc314)b3b1ff8 linter/vitest/expect-expect: Handle global vitest detection
correctly (#23734) (camc314)⚡ Performance
68f9472 linter/jsx-a11y: Skip lowercasing non-aria attribute names
(#23906) (Lawrence Lin)b9312b4 linter/unicorn/prefer-export-from: Use keyed binding lookup
(#23893) (Marius Schulz)cd5204e linter/typescript/no-unsafe-declaration-merging: Use keyed
binding lookup (#23894) (Marius Schulz)e948498 linter/eslint/prefer-named-capture-group: Only dispatch for
relevant node types (#23868) (Connor Shea)4ac7a8e linter/eslint/max-depth: Derive node types (#23896) (Connor
Shea)daeed09 linter/eslint/no-restricted-globals: Only scan unresolved
references (#23890) (camc314)e808514 linter/jest-vitest: Speed up no-standalone-expect (#23883)
(camc314)8b165e5 linter/react/exhaustive-deps: Skip non-reactive calls early
(#23882) (camc314)54005e7 linter/eslint/no-unused-vars: Precompute exported bindings
(#23881) (camc314)9bc2f8c linter/unicorn/prefer-number-properties: Speed up global
checks (#23880) (camc314)4ff104f linter: Optimize require-hook and prefer-mock-* rules to
run on specific node types (#23871) (Connor Shea)cc2213b linter: Run no-underscore-dangle only when relevant node
types are present (#23867) (Connor Shea)3e55c21 linter/promise/always-return: Narrow to function node types
(#23878) (Connor Shea)7136182 linter/jest-vitest: Speed up no-commented-out-tests (#23864)
(camc314)f138264 linter/eslint/no-script-url: Match javascript: prefix without
allocating (#23861) (Lawrence Lin)7ef6895 linter/react/no-array-index-key: Delay index symbol lookup
(#23857) (camc314)26bc171 linter/react/no-array-index-key: Match callback methods
directly (#23856) (camc314)44fbbda linter/jsx-a11y/interactive-supports-focus: Check cheap
conditions first (#23854) (camc314)84a5aa3 linter/eslint/no-extend-native: Skip lowercase references
early (#23851) (camc314)88a74b2 linter/eslint/no-nonoctal-decimal-escape: Scan decimal escapes
as bytes (#23850) (camc314)fca69a8 linter: Skip traversal without this expressions (#23845)
(camc314)838fd63 linter: Reduce preallocation for per-file diagnostics Vec
(#23705) (Marius Schulz)417b506 linter/typescript/array-type: Remove full source text clone
(#23751) (Marius Schulz)📚 Documentation
57e4469 linter/unicorn: Update prefer-dom-node-text-content rationale
(#23933) (Mikhail Baev)3d61dea all: Correct capitalization in comments (#23887)
(overlookmotel)🛡️ Security
3cdd18f deps: Update npm packages (#23690) (renovate[bot])
Oxfmt
💥 BREAKING CHANGES
259e0cd oxfmt,formatter_graphql: [BREAKING] Support draft syntax
with removing prettier fallback (#23326) (leaysgur)accbc49 oxfmt: [BREAKING] Format parser:css,less,scss files +
css-in-js by oxc_formatter_css (#23321) (leaysgur)🚀 Features
dffa4b3 formatter_css: Implement oxc_formatter_css (#23320)
(leaysgur)01de9ec oxfmt: Format parser:graphql files by
oxc_formatter_graphql (#23318) (leaysgur)4e66212 formatter_graphql: Implement oxc_formatter_graphql (#23317)
(leaysgur)🐛 Bug Fixes
67325ae formatter_css: Handle frontmatter language (#23819) (leaysgur)
3f355e5 formatter_graphql: Improve major prettier diffs (#23419)
(leaysgur)48e2d78 formatter_css: Improve major prettier diffs (#23327)
(leaysgur)8c07cad all: Enable disable_old_builder Cargo feature for oxc_ast
crate in tests (#23888) (overlookmotel)f7d1f50 oxlint, oxfmt: Enable disable_old_builder Cargo feature for
oxc_ast crate (#23886) (overlookmotel)d86f60b lsp: Normalize user config path to watch pattern (#23723)
(Sysix)⚡ Performance
4ddcba0 formatter_core: Add printable-ASCII fast path to TextWidth
(#23913) (Lawrence Lin)📚 Documentation
b4d0dc9 oxfmt,formatter,formatter_css,formatter_core: Update AGENTS.md
(#23814) (leaysgur)Co-authored-by: Boshen [email protected]
Co-authored-by: Cameron [email protected]
Original source