From 438d7257c31eb95c3c5c1c0b88d8fdd1e389ac37 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 18 Aug 2025 06:47:39 +0000 Subject: [PATCH 1/8] Initial plan From 0ca7060628f247c9435267d8b14bc55bdae07e1a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 18 Aug 2025 06:56:45 +0000 Subject: [PATCH 2/8] Add Node.js version warning to Vite CLI Co-authored-by: sapphi-red <49056869+sapphi-red@users.noreply.github.com> --- packages/vite/src/node/__tests__/cli.spec.ts | 101 +++++++++++++++++++ packages/vite/src/node/cli.ts | 29 ++++++ 2 files changed, 130 insertions(+) create mode 100644 packages/vite/src/node/__tests__/cli.spec.ts 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..d183063201c1c4 --- /dev/null +++ b/packages/vite/src/node/__tests__/cli.spec.ts @@ -0,0 +1,101 @@ +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' +import { checkNodeVersion } from '../cli' + +describe('CLI Node.js version checking', () => { + let originalNodeVersion: string + let consoleSpy: any + + beforeEach(() => { + originalNodeVersion = process.versions.node + consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}) + }) + + afterEach(() => { + // Restore original version + Object.defineProperty(process.versions, 'node', { + value: originalNodeVersion, + writable: true, + }) + consoleSpy.mockRestore() + }) + + function mockNodeVersion(version: string) { + Object.defineProperty(process.versions, 'node', { + value: version, + writable: true, + }) + } + + test('should warn for Node.js version < 20.19.0', () => { + mockNodeVersion('18.20.0') + + checkNodeVersion() + + expect(consoleSpy).toHaveBeenCalledWith( + expect.stringContaining('You are using Node.js 18.20.0'), + ) + expect(consoleSpy).toHaveBeenCalledWith( + expect.stringContaining('Vite requires Node.js version 20.19+ or 22.12+'), + ) + }) + + test('should warn for Node.js version 20.18.x', () => { + mockNodeVersion('20.18.5') + + checkNodeVersion() + + expect(consoleSpy).toHaveBeenCalledWith( + expect.stringContaining('You are using Node.js 20.18.5'), + ) + }) + + test('should warn for Node.js version 22.11.x', () => { + mockNodeVersion('22.11.0') + + checkNodeVersion() + + expect(consoleSpy).toHaveBeenCalledWith( + expect.stringContaining('You are using Node.js 22.11.0'), + ) + }) + + test('should not warn for Node.js version 20.19.0', () => { + mockNodeVersion('20.19.0') + + checkNodeVersion() + + expect(consoleSpy).not.toHaveBeenCalled() + }) + + test('should not warn for Node.js version 20.20.x', () => { + mockNodeVersion('20.20.1') + + checkNodeVersion() + + expect(consoleSpy).not.toHaveBeenCalled() + }) + + test('should not warn for Node.js version 22.12.0', () => { + mockNodeVersion('22.12.0') + + checkNodeVersion() + + expect(consoleSpy).not.toHaveBeenCalled() + }) + + test('should not warn for Node.js version 22.13.x', () => { + mockNodeVersion('22.13.1') + + checkNodeVersion() + + expect(consoleSpy).not.toHaveBeenCalled() + }) + + test('should not warn for Node.js version 23.x.x', () => { + mockNodeVersion('23.0.0') + + checkNodeVersion() + + expect(consoleSpy).not.toHaveBeenCalled() + }) +}) diff --git a/packages/vite/src/node/cli.ts b/packages/vite/src/node/cli.ts index b4ee86420de45c..a044b9d04affc9 100644 --- a/packages/vite/src/node/cli.ts +++ b/packages/vite/src/node/cli.ts @@ -12,6 +12,35 @@ import { createLogger } from './logger' import { resolveConfig } from './config' import type { InlineConfig } from './config' +/** + * Check if the current Node.js version is supported + */ +export function checkNodeVersion(): void { + const currentVersion = process.versions.node.split('.') + const major = parseInt(currentVersion[0], 10) + const minor = parseInt(currentVersion[1], 10) + const patch = parseInt(currentVersion[2], 10) + + const isSupported = + (major === 20 && (minor > 19 || (minor === 19 && patch >= 0))) || + (major === 22 && minor >= 12) || + major > 22 + + if (!isSupported) { + const logger = createLogger('warn') + logger.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.`, + ), + ) + } +} + +// Check Node.js version before proceeding +checkNodeVersion() + const cli = cac('vite') // global options From fa0ff096df2b44646f91a8e52e823aca1a1daf5a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 18 Aug 2025 07:18:05 +0000 Subject: [PATCH 3/8] refactor(cli): return boolean from checkNodeVersion function - Modified checkNodeVersion() to return boolean indicating version support - Updated unit tests to check return value instead of mocking console output - Simplified test code by removing need for console spy mocking - Maintains backward compatibility with existing warning behavior Co-authored-by: sapphi-red <49056869+sapphi-red@users.noreply.github.com> --- packages/vite/src/node/__tests__/cli.spec.ts | 62 ++++++++------------ packages/vite/src/node/cli.ts | 5 +- 2 files changed, 29 insertions(+), 38 deletions(-) diff --git a/packages/vite/src/node/__tests__/cli.spec.ts b/packages/vite/src/node/__tests__/cli.spec.ts index d183063201c1c4..6354c5bf776f24 100644 --- a/packages/vite/src/node/__tests__/cli.spec.ts +++ b/packages/vite/src/node/__tests__/cli.spec.ts @@ -1,13 +1,11 @@ -import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' +import { afterEach, beforeEach, describe, expect, test } from 'vitest' import { checkNodeVersion } from '../cli' describe('CLI Node.js version checking', () => { let originalNodeVersion: string - let consoleSpy: any beforeEach(() => { originalNodeVersion = process.versions.node - consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}) }) afterEach(() => { @@ -16,7 +14,6 @@ describe('CLI Node.js version checking', () => { value: originalNodeVersion, writable: true, }) - consoleSpy.mockRestore() }) function mockNodeVersion(version: string) { @@ -26,76 +23,67 @@ describe('CLI Node.js version checking', () => { }) } - test('should warn for Node.js version < 20.19.0', () => { + test('should return false for Node.js version < 20.19.0', () => { mockNodeVersion('18.20.0') - checkNodeVersion() + const result = checkNodeVersion() - expect(consoleSpy).toHaveBeenCalledWith( - expect.stringContaining('You are using Node.js 18.20.0'), - ) - expect(consoleSpy).toHaveBeenCalledWith( - expect.stringContaining('Vite requires Node.js version 20.19+ or 22.12+'), - ) + expect(result).toBe(false) }) - test('should warn for Node.js version 20.18.x', () => { + test('should return false for Node.js version 20.18.x', () => { mockNodeVersion('20.18.5') - checkNodeVersion() + const result = checkNodeVersion() - expect(consoleSpy).toHaveBeenCalledWith( - expect.stringContaining('You are using Node.js 20.18.5'), - ) + expect(result).toBe(false) }) - test('should warn for Node.js version 22.11.x', () => { + test('should return false for Node.js version 22.11.x', () => { mockNodeVersion('22.11.0') - checkNodeVersion() + const result = checkNodeVersion() - expect(consoleSpy).toHaveBeenCalledWith( - expect.stringContaining('You are using Node.js 22.11.0'), - ) + expect(result).toBe(false) }) - test('should not warn for Node.js version 20.19.0', () => { + test('should return true for Node.js version 20.19.0', () => { mockNodeVersion('20.19.0') - checkNodeVersion() + const result = checkNodeVersion() - expect(consoleSpy).not.toHaveBeenCalled() + expect(result).toBe(true) }) - test('should not warn for Node.js version 20.20.x', () => { + test('should return true for Node.js version 20.20.x', () => { mockNodeVersion('20.20.1') - checkNodeVersion() + const result = checkNodeVersion() - expect(consoleSpy).not.toHaveBeenCalled() + expect(result).toBe(true) }) - test('should not warn for Node.js version 22.12.0', () => { + test('should return true for Node.js version 22.12.0', () => { mockNodeVersion('22.12.0') - checkNodeVersion() + const result = checkNodeVersion() - expect(consoleSpy).not.toHaveBeenCalled() + expect(result).toBe(true) }) - test('should not warn for Node.js version 22.13.x', () => { + test('should return true for Node.js version 22.13.x', () => { mockNodeVersion('22.13.1') - checkNodeVersion() + const result = checkNodeVersion() - expect(consoleSpy).not.toHaveBeenCalled() + expect(result).toBe(true) }) - test('should not warn for Node.js version 23.x.x', () => { + test('should return true for Node.js version 23.x.x', () => { mockNodeVersion('23.0.0') - checkNodeVersion() + const result = checkNodeVersion() - expect(consoleSpy).not.toHaveBeenCalled() + expect(result).toBe(true) }) }) diff --git a/packages/vite/src/node/cli.ts b/packages/vite/src/node/cli.ts index a044b9d04affc9..61d54fbf1554dd 100644 --- a/packages/vite/src/node/cli.ts +++ b/packages/vite/src/node/cli.ts @@ -14,8 +14,9 @@ import type { InlineConfig } from './config' /** * Check if the current Node.js version is supported + * @returns true if the version is supported, false otherwise */ -export function checkNodeVersion(): void { +export function checkNodeVersion(): boolean { const currentVersion = process.versions.node.split('.') const major = parseInt(currentVersion[0], 10) const minor = parseInt(currentVersion[1], 10) @@ -36,6 +37,8 @@ export function checkNodeVersion(): void { ), ) } + + return isSupported } // Check Node.js version before proceeding From 06e320c843e5f86e86f1a118a29fa3b831ece062 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 18 Aug 2025 08:07:13 +0000 Subject: [PATCH 4/8] refactor(cli): use console.warn and move warning outside checkNodeVersion function Co-authored-by: sapphi-red <49056869+sapphi-red@users.noreply.github.com> --- packages/vite/src/node/cli.ts | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/packages/vite/src/node/cli.ts b/packages/vite/src/node/cli.ts index 61d54fbf1554dd..77d005bdd47375 100644 --- a/packages/vite/src/node/cli.ts +++ b/packages/vite/src/node/cli.ts @@ -27,22 +27,20 @@ export function checkNodeVersion(): boolean { (major === 22 && minor >= 12) || major > 22 - if (!isSupported) { - const logger = createLogger('warn') - logger.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.`, - ), - ) - } - return isSupported } // Check Node.js version before proceeding -checkNodeVersion() +if (!checkNodeVersion()) { + // 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') From 758b37d4bce0ea4703b0d84563d8d971468780c7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 18 Aug 2025 08:18:38 +0000 Subject: [PATCH 5/8] refactor(cli): use parameter for node version and table-based tests Co-authored-by: sapphi-red <49056869+sapphi-red@users.noreply.github.com> --- packages/vite/src/node/__tests__/cli.spec.ts | 99 +++----------------- packages/vite/src/node/cli.ts | 7 +- 2 files changed, 19 insertions(+), 87 deletions(-) diff --git a/packages/vite/src/node/__tests__/cli.spec.ts b/packages/vite/src/node/__tests__/cli.spec.ts index 6354c5bf776f24..84fc5626848e02 100644 --- a/packages/vite/src/node/__tests__/cli.spec.ts +++ b/packages/vite/src/node/__tests__/cli.spec.ts @@ -1,89 +1,20 @@ -import { afterEach, beforeEach, describe, expect, test } from 'vitest' +import { describe, expect, test } from 'vitest' import { checkNodeVersion } from '../cli' describe('CLI Node.js version checking', () => { - let originalNodeVersion: string - - beforeEach(() => { - originalNodeVersion = process.versions.node - }) - - afterEach(() => { - // Restore original version - Object.defineProperty(process.versions, 'node', { - value: originalNodeVersion, - writable: true, - }) - }) - - function mockNodeVersion(version: string) { - Object.defineProperty(process.versions, 'node', { - value: version, - writable: true, - }) - } - - test('should return false for Node.js version < 20.19.0', () => { - mockNodeVersion('18.20.0') - - const result = checkNodeVersion() - - expect(result).toBe(false) - }) - - test('should return false for Node.js version 20.18.x', () => { - mockNodeVersion('20.18.5') - - const result = checkNodeVersion() - - expect(result).toBe(false) - }) - - test('should return false for Node.js version 22.11.x', () => { - mockNodeVersion('22.11.0') - - const result = checkNodeVersion() - - expect(result).toBe(false) - }) - - test('should return true for Node.js version 20.19.0', () => { - mockNodeVersion('20.19.0') - - const result = checkNodeVersion() - - expect(result).toBe(true) - }) - - test('should return true for Node.js version 20.20.x', () => { - mockNodeVersion('20.20.1') - - const result = checkNodeVersion() - - expect(result).toBe(true) - }) - - test('should return true for Node.js version 22.12.0', () => { - mockNodeVersion('22.12.0') - - const result = checkNodeVersion() - - expect(result).toBe(true) - }) - - test('should return true for Node.js version 22.13.x', () => { - mockNodeVersion('22.13.1') - - const result = checkNodeVersion() - - expect(result).toBe(true) - }) - - test('should return true for Node.js version 23.x.x', () => { - mockNodeVersion('23.0.0') - - const result = checkNodeVersion() - - expect(result).toBe(true) + 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 %p for Node.js version %s', (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 77d005bdd47375..5682561643aa97 100644 --- a/packages/vite/src/node/cli.ts +++ b/packages/vite/src/node/cli.ts @@ -14,10 +14,11 @@ import type { InlineConfig } from './config' /** * Check if the current Node.js version is supported + * @param nodeVersion - The Node.js version string (e.g., '20.19.0') * @returns true if the version is supported, false otherwise */ -export function checkNodeVersion(): boolean { - const currentVersion = process.versions.node.split('.') +export function checkNodeVersion(nodeVersion: string): boolean { + const currentVersion = nodeVersion.split('.') const major = parseInt(currentVersion[0], 10) const minor = parseInt(currentVersion[1], 10) const patch = parseInt(currentVersion[2], 10) @@ -31,7 +32,7 @@ export function checkNodeVersion(): boolean { } // Check Node.js version before proceeding -if (!checkNodeVersion()) { +if (!checkNodeVersion(process.versions.node)) { // eslint-disable-next-line no-console console.warn( colors.yellow( From 103e2e4bc607e37fe1a89a076a077fdefb0404e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0?= Date: Mon, 18 Aug 2025 20:54:05 +0900 Subject: [PATCH 6/8] chore: update --- packages/vite/src/node/__tests__/cli.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/__tests__/cli.spec.ts b/packages/vite/src/node/__tests__/cli.spec.ts index 84fc5626848e02..e399816c4f204e 100644 --- a/packages/vite/src/node/__tests__/cli.spec.ts +++ b/packages/vite/src/node/__tests__/cli.spec.ts @@ -13,7 +13,7 @@ describe('CLI Node.js version checking', () => { ['22.12.0', true], ['22.13.1', true], ['23.0.0', true], - ])('should return %p for Node.js version %s', (version, expected) => { + ])('should return %1 for Node.js version %0', (version, expected) => { const result = checkNodeVersion(version) expect(result).toBe(expected) }) From 1981efc144bc1c1f6198e2b6be37d52e32fd96b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0?= Date: Mon, 18 Aug 2025 20:55:01 +0900 Subject: [PATCH 7/8] chore: update --- packages/vite/src/node/cli.ts | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/packages/vite/src/node/cli.ts b/packages/vite/src/node/cli.ts index 5682561643aa97..a17d0816facab1 100644 --- a/packages/vite/src/node/cli.ts +++ b/packages/vite/src/node/cli.ts @@ -12,26 +12,17 @@ import { createLogger } from './logger' import { resolveConfig } from './config' import type { InlineConfig } from './config' -/** - * Check if the current Node.js version is supported - * @param nodeVersion - The Node.js version string (e.g., '20.19.0') - * @returns true if the version is supported, false otherwise - */ export function checkNodeVersion(nodeVersion: string): boolean { const currentVersion = nodeVersion.split('.') const major = parseInt(currentVersion[0], 10) const minor = parseInt(currentVersion[1], 10) - const patch = parseInt(currentVersion[2], 10) - const isSupported = - (major === 20 && (minor > 19 || (minor === 19 && patch >= 0))) || + (major === 20 && minor >= 19) || (major === 22 && minor >= 12) || major > 22 - return isSupported } -// Check Node.js version before proceeding if (!checkNodeVersion(process.versions.node)) { // eslint-disable-next-line no-console console.warn( From 5e40ad4912ea8cf897a4242b33fe43cf6c61779b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0?= Date: Mon, 18 Aug 2025 21:08:00 +0900 Subject: [PATCH 8/8] chore: format --- packages/vite/src/node/cli.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/vite/src/node/cli.ts b/packages/vite/src/node/cli.ts index a17d0816facab1..58dfa270ed4b10 100644 --- a/packages/vite/src/node/cli.ts +++ b/packages/vite/src/node/cli.ts @@ -17,9 +17,7 @@ export function checkNodeVersion(nodeVersion: string): boolean { const major = parseInt(currentVersion[0], 10) const minor = parseInt(currentVersion[1], 10) const isSupported = - (major === 20 && minor >= 19) || - (major === 22 && minor >= 12) || - major > 22 + (major === 20 && minor >= 19) || (major === 22 && minor >= 12) || major > 22 return isSupported }