vitest doesn't support TypeScript 5.2's using feature
Describe the bug
TypeScript 5.2 supports an upcoming ES feature, using: https://devblogs.microsoft.com/typescript/announcing-typescript-5-2/
The syntax doesn't get transpiled by vitest, and then tests fail with the following error:
Error: Parse failure: Unexpected token (6:10)
At file: /home/projects/vitest-dev-vitest-uk35mv/test/basic.test.ts
Contents of line 6: using disposable = {
When I run the files that use the using syntax with https://github.com/esbuild-kit/tsx, it works just fine.
Reproduction
https://stackblitz.com/edit/vitest-dev-vitest-uk35mv?file=tsconfig.json,test%2Fbasic.test.ts&initialPath=vitest/
System Info
System:
OS: macOS 13.4
CPU: (12) arm64 Apple M2 Max
Memory: 2.24 GB / 64.00 GB
Shell: 5.9 - /opt/homebrew/bin/zsh
Binaries:
Node: 20.7.0 - ~/Workspace/letschurch/lets.church/bin/node
Yarn: 1.22.19 - /opt/homebrew/bin/yarn
npm: 10.1.0 - ~/Workspace/letschurch/lets.church/bin/npm
pnpm: 8.7.4 - /opt/homebrew/bin/pnpm
Browsers:
Chrome: 116.0.5845.187
Chrome Canary: 117.0.5863.0
Safari: 16.5
npmPackages:
vitest: ^0.34.5 => 0.34.5
Used Package Manager
npm
Validations
- [X] Follow our Code of Conduct
- [X] Read the Contributing Guidelines.
- [X] Read the docs.
- [X] Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
- [X] Check that this is a concrete bug. For Q&A open a GitHub Discussion or join our Discord Chat Server.
- [X] The provided reproduction is a minimal reproducible example of the bug.
Vitest just uses Vite which uses esbuild. Until esbuild is updated in their dependencies (maybe it already is, and you just need to update versions?) you can use the resolutions/overrides field:
For pnpm:
{
"overrides": {
"esbuild": "^0.19.3"
}
}
For yarn:
{
"resolutions": {
"esbuild": "^0.19.3",
}
}
I thought esbuild was only used for dependencies, not for application code? In any case, that override doesn't appear to fix the issue. Also, tsx uses an older version of esbuild than that override and the using syntax works just fine in tsx.
Vitest uses rollup for application code, and rollup uses acorn.
https://github.com/rollup/rollup/issues/5113
I fixed this issue by setting esbuild's target to es2022:
import { defineConfig } from 'vitest/config';
export default defineConfig({
esbuild: { target: 'es2022' },
});
The current workaround is to use @nedsalk's config. The issue should be fixed when Vitest 1.0 is released.
Has there been any progress on this issue?