diff --git a/packages/vite/src/node/__tests__/plugins/esbuild.spec.ts b/packages/vite/src/node/__tests__/plugins/esbuild.spec.ts index 7956b35e4668f9..8992000da101a5 100644 --- a/packages/vite/src/node/__tests__/plugins/esbuild.spec.ts +++ b/packages/vite/src/node/__tests__/plugins/esbuild.spec.ts @@ -378,6 +378,11 @@ describe('transformWithEsbuild', () => { }) expect(actual).toBe(defineForClassFieldsTrueTransformedCode) }) + + test('target: es2022 and tsconfig.target: undefined => false', async () => { + const actual = await transformClassCode('es2022', {}) + expect(actual).toBe(defineForClassFieldsFalseTransformedCode) + }) }) }) diff --git a/packages/vite/src/node/plugins/esbuild.ts b/packages/vite/src/node/plugins/esbuild.ts index adcc90f83582d8..fedb39d9d844a1 100644 --- a/packages/vite/src/node/plugins/esbuild.ts +++ b/packages/vite/src/node/plugins/esbuild.ts @@ -132,6 +132,16 @@ export async function transformWithEsbuild( ...tsconfigRaw?.compilerOptions, } + // esbuild uses `useDefineForClassFields: true` when `tsconfig.compilerOptions.target` isn't declared + // but we want `useDefineForClassFields: false` when `tsconfig.compilerOptions.target` isn't declared + // to align with the TypeScript's behavior + if ( + compilerOptions.useDefineForClassFields === undefined && + compilerOptions.target === undefined + ) { + compilerOptions.useDefineForClassFields = false + } + // esbuild uses tsconfig fields when both the normal options and tsconfig was set // but we want to prioritize the normal options if (options) {