# What changed in tsx

> 39 changes in tsx 4 from its official release notes, upgrade guides and advisories. Each one cited. Sources checked 2026-10-17. HTML: https://unstale.sh/npm/tsx/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## tsx 4

### Performance

- The CLI loads esbuild lazily, improving CLI startup performance. (4.23.1) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.1)
- Node TypeScript formats are mapped directly for improved performance. (4.23.1) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.1)
- Synchronous module hooks are used on Node v22.22.3 and newer. (4.23.1) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.1)
- The transform cache is indexed lazily, improving startup or cache-related performance. (4.23.1) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.1)
- Avoids redundant filesystem probes during module resolution, improving resolution efficiency. (4.23.0) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.0)

### Fixes and other changes

- Bare builtins are excluded from namespace inheritance. (4.23.15) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.15)
- Namespaced register overloads are portable for declaration emit. (4.23.15) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.15)
- require.cache and require.extensions are exposed to tsImport CommonJS modules. (4.23.15) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.15)
- Restores the CJS bridge namespace for Node 24 require(esm) when using tsImport. (4.23.14) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.14)
- Shared transform cache memory is now bounded, preventing unbounded cache growth. (4.23.13) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.13)
- Fixes shimming import.meta when tokens are split by comments or newlines. (4.23.12) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.12)
- Preserves the async ESM require fallback behavior for developers using tsx. (4.23.11) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.11)
- tsx now supports nyc coverage discovery, improving coverage collection when using nyc. (4.23.10) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.10)
- Node test locations are mapped correctly, improving location reporting for developers running tests. (4.23.9) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.9)
- tsImport now supports data URLs, allowing TypeScript imports from data URL sources. (4.23.9) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.9)
- Package subpath resolution is preserved, preventing incorrect module resolution for package subpaths. (4.23.8) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.8)
- Typeless ESM dependency exports are preserved, improving compatibility when resolving ESM dependencies without an explicit type. (4.23.8) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.8)
- Prevents cache collisions in tsImport. (4.23.7) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.7)
- Node resolution is preserved when allowJs is enabled. (4.23.6) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.6)
- Resolver URL metadata is now composed correctly. (4.23.6) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.6)
- Resolver URL metadata is now preserved. (4.23.6) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.6)
- Detects when the Node inspector is enabled through NODE_OPTIONS. (4.23.5) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.5)
- Async process.once() signal handlers are now allowed to finish when using the CLI. (4.23.4) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.4)
- Preserves listenerCount overload semantics for developers using the API. (4.23.3) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.3)
- Watch mode exits with 128 plus the signal number when interrupted. (4.23.2) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.2)
- tsImport now works after a global preload. (4.23.1) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.1)
- Watch mode no longer clears piped output. (4.23.1) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.1)
- Watch mode now treats script and dependency paths literally. (4.23.1) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.23.1)
- Hook state is now isolated per async module.register() registration, preventing state from being shared across registrations. (4.22.5) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.22.5)
- CommonJS directory requires inside dependencies are now resolved correctly. (4.22.4) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.22.4)
- Typed loader source is decoded correctly during tsx execution. (4.22.3) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.22.3)
- Entrypoints are preserved when TypeScript preload hooks are used. (4.22.3) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.22.3)
- Preserves CommonJS JSON require behavior when using ESM hooks. (4.22.2) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.22.2)
- Adds support for require and ESM interoperability involving module.exports. (4.22.2) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.22.2)
- Preserves named exports from CommonJS TypeScript modules. (4.22.2) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.22.2)
- Resolves tsconfig path aliases containing a colon correctly. (4.22.1) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.22.1)
- Import.meta paths are supported on Node 20.11 and 21.2. (4.21.1) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.21.1)
- Adds support for Node.js 24.15.0. (4.21.1) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.21.1)
- Adds support for Node.js 26.1.0 and 25.9.0. (4.21.1) — [release notes](https://github.com/privatenumber/tsx/releases/tag/v4.21.1)
