diff --git a/packages/vite/src/node/__tests__/cli.spec.ts b/packages/vite/src/node/__tests__/cli.spec.ts new file mode 100644 index 00000000000000..e399816c4f204e --- /dev/null +++ b/packages/vite/src/node/__tests__/cli.spec.ts @@ -0,0 +1,20 @@ +import { describe, expect, test } from 'vitest' +import { checkNodeVersion } from '../cli' + +describe('CLI Node.js version checking', () => { + test.each([ + // Unsupported versions + ['18.20.0', false], + ['20.18.5', false], + ['22.11.0', false], + // Supported versions + ['20.19.0', true], + ['20.20.1', true], + ['22.12.0', true], + ['22.13.1', true], + ['23.0.0', true], + ])('should return %1 for Node.js version %0', (version, expected) => { + const result = checkNodeVersion(version) + expect(result).toBe(expected) + }) +}) diff --git a/packages/vite/src/node/cli.ts b/packages/vite/src/node/cli.ts index b4ee86420de45c..58dfa270ed4b10 100644 --- a/packages/vite/src/node/cli.ts +++ b/packages/vite/src/node/cli.ts @@ -12,6 +12,26 @@ import { createLogger } from './logger' import { resolveConfig } from './config' import type { InlineConfig } from './config' +export function checkNodeVersion(nodeVersion: string): boolean { + const currentVersion = nodeVersion.split('.') + const major = parseInt(currentVersion[0], 10) + const minor = parseInt(currentVersion[1], 10) + const isSupported = + (major === 20 && minor >= 19) || (major === 22 && minor >= 12) || major > 22 + return isSupported +} + +if (!checkNodeVersion(process.versions.node)) { + // eslint-disable-next-line no-console + console.warn( + colors.yellow( + `You are using Node.js ${process.versions.node}. ` + + `Vite requires Node.js version 20.19+ or 22.12+. ` + + `Please upgrade your Node.js version.`, + ), + ) +} + const cli = cac('vite') // global options