Merge pull request #2851 from olaservo/fix-wsl-path-conversion
Resolve filesystem issue where WSL paths are incorrectly converted to Windows format
This commit is contained in:
commit
d2eb945c4d
2 changed files with 238 additions and 45 deletions
|
|
@ -10,14 +10,25 @@ describe('Path Utilities', () => {
|
||||||
.toBe('/home/user/some path');
|
.toBe('/home/user/some path');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('converts WSL paths to Windows format', () => {
|
it('never converts WSL paths (they work correctly in WSL with Node.js fs)', () => {
|
||||||
|
// WSL paths should NEVER be converted, regardless of platform
|
||||||
|
// They are valid Linux paths that work with Node.js fs operations inside WSL
|
||||||
expect(convertToWindowsPath('/mnt/c/NS/MyKindleContent'))
|
expect(convertToWindowsPath('/mnt/c/NS/MyKindleContent'))
|
||||||
.toBe('C:\\NS\\MyKindleContent');
|
.toBe('/mnt/c/NS/MyKindleContent');
|
||||||
|
expect(convertToWindowsPath('/mnt/d/Documents'))
|
||||||
|
.toBe('/mnt/d/Documents');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('converts Unix-style Windows paths to Windows format', () => {
|
it('converts Unix-style Windows paths only on Windows platform', () => {
|
||||||
expect(convertToWindowsPath('/c/NS/MyKindleContent'))
|
// On Windows, /c/ style paths should be converted
|
||||||
.toBe('C:\\NS\\MyKindleContent');
|
if (process.platform === 'win32') {
|
||||||
|
expect(convertToWindowsPath('/c/NS/MyKindleContent'))
|
||||||
|
.toBe('C:\\NS\\MyKindleContent');
|
||||||
|
} else {
|
||||||
|
// On Linux, leave them unchanged
|
||||||
|
expect(convertToWindowsPath('/c/NS/MyKindleContent'))
|
||||||
|
.toBe('/c/NS/MyKindleContent');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it('leaves Windows paths unchanged but ensures backslashes', () => {
|
it('leaves Windows paths unchanged but ensures backslashes', () => {
|
||||||
|
|
@ -34,11 +45,20 @@ describe('Path Utilities', () => {
|
||||||
.toBe('C:\\Program Files\\Some App');
|
.toBe('C:\\Program Files\\Some App');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('handles uppercase and lowercase drive letters', () => {
|
it('handles drive letter paths based on platform', () => {
|
||||||
|
// WSL paths should never be converted
|
||||||
expect(convertToWindowsPath('/mnt/d/some/path'))
|
expect(convertToWindowsPath('/mnt/d/some/path'))
|
||||||
.toBe('D:\\some\\path');
|
.toBe('/mnt/d/some/path');
|
||||||
expect(convertToWindowsPath('/d/some/path'))
|
|
||||||
.toBe('D:\\some\\path');
|
if (process.platform === 'win32') {
|
||||||
|
// On Windows, Unix-style paths like /d/ should be converted
|
||||||
|
expect(convertToWindowsPath('/d/some/path'))
|
||||||
|
.toBe('D:\\some\\path');
|
||||||
|
} else {
|
||||||
|
// On Linux, /d/ is just a regular Unix path
|
||||||
|
expect(convertToWindowsPath('/d/some/path'))
|
||||||
|
.toBe('/d/some/path');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -67,21 +87,33 @@ describe('Path Utilities', () => {
|
||||||
.toBe('C:\\NS\\MyKindleContent');
|
.toBe('C:\\NS\\MyKindleContent');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('handles WSL paths', () => {
|
it('always preserves WSL paths (they work correctly in WSL)', () => {
|
||||||
|
// WSL paths should ALWAYS be preserved, regardless of platform
|
||||||
|
// This is the fix for issue #2795
|
||||||
expect(normalizePath('/mnt/c/NS/MyKindleContent'))
|
expect(normalizePath('/mnt/c/NS/MyKindleContent'))
|
||||||
.toBe('C:\\NS\\MyKindleContent');
|
.toBe('/mnt/c/NS/MyKindleContent');
|
||||||
|
expect(normalizePath('/mnt/d/Documents'))
|
||||||
|
.toBe('/mnt/d/Documents');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('handles Unix-style Windows paths', () => {
|
it('handles Unix-style Windows paths', () => {
|
||||||
expect(normalizePath('/c/NS/MyKindleContent'))
|
// On Windows, /c/ paths should be converted
|
||||||
.toBe('C:\\NS\\MyKindleContent');
|
if (process.platform === 'win32') {
|
||||||
|
expect(normalizePath('/c/NS/MyKindleContent'))
|
||||||
|
.toBe('C:\\NS\\MyKindleContent');
|
||||||
|
} else if (process.platform === 'linux') {
|
||||||
|
// On Linux, /c/ is just a regular Unix path
|
||||||
|
expect(normalizePath('/c/NS/MyKindleContent'))
|
||||||
|
.toBe('/c/NS/MyKindleContent');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it('handles paths with spaces and mixed slashes', () => {
|
it('handles paths with spaces and mixed slashes', () => {
|
||||||
expect(normalizePath('C:/NS/My Kindle Content'))
|
expect(normalizePath('C:/NS/My Kindle Content'))
|
||||||
.toBe('C:\\NS\\My Kindle Content');
|
.toBe('C:\\NS\\My Kindle Content');
|
||||||
|
// WSL paths should always be preserved
|
||||||
expect(normalizePath('/mnt/c/NS/My Kindle Content'))
|
expect(normalizePath('/mnt/c/NS/My Kindle Content'))
|
||||||
.toBe('C:\\NS\\My Kindle Content');
|
.toBe('/mnt/c/NS/My Kindle Content');
|
||||||
expect(normalizePath('C:\\Program Files (x86)\\App Name'))
|
expect(normalizePath('C:\\Program Files (x86)\\App Name'))
|
||||||
.toBe('C:\\Program Files (x86)\\App Name');
|
.toBe('C:\\Program Files (x86)\\App Name');
|
||||||
expect(normalizePath('"C:\\Program Files\\App Name"'))
|
expect(normalizePath('"C:\\Program Files\\App Name"'))
|
||||||
|
|
@ -91,10 +123,19 @@ describe('Path Utilities', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('preserves spaces in all path formats', () => {
|
it('preserves spaces in all path formats', () => {
|
||||||
|
// WSL paths should always be preserved
|
||||||
expect(normalizePath('/mnt/c/Program Files/App Name'))
|
expect(normalizePath('/mnt/c/Program Files/App Name'))
|
||||||
.toBe('C:\\Program Files\\App Name');
|
.toBe('/mnt/c/Program Files/App Name');
|
||||||
expect(normalizePath('/c/Program Files/App Name'))
|
|
||||||
.toBe('C:\\Program Files\\App Name');
|
if (process.platform === 'win32') {
|
||||||
|
// On Windows, Unix-style paths like /c/ should be converted
|
||||||
|
expect(normalizePath('/c/Program Files/App Name'))
|
||||||
|
.toBe('C:\\Program Files\\App Name');
|
||||||
|
} else {
|
||||||
|
// On Linux, /c/ is just a regular Unix path
|
||||||
|
expect(normalizePath('/c/Program Files/App Name'))
|
||||||
|
.toBe('/c/Program Files/App Name');
|
||||||
|
}
|
||||||
expect(normalizePath('C:/Program Files/App Name'))
|
expect(normalizePath('C:/Program Files/App Name'))
|
||||||
.toBe('C:\\Program Files\\App Name');
|
.toBe('C:\\Program Files\\App Name');
|
||||||
});
|
});
|
||||||
|
|
@ -105,15 +146,16 @@ describe('Path Utilities', () => {
|
||||||
.toBe('C:\\NS\\Sub&Folder');
|
.toBe('C:\\NS\\Sub&Folder');
|
||||||
expect(normalizePath('C:/NS/Sub&Folder'))
|
expect(normalizePath('C:/NS/Sub&Folder'))
|
||||||
.toBe('C:\\NS\\Sub&Folder');
|
.toBe('C:\\NS\\Sub&Folder');
|
||||||
|
// WSL paths should always be preserved
|
||||||
expect(normalizePath('/mnt/c/NS/Sub&Folder'))
|
expect(normalizePath('/mnt/c/NS/Sub&Folder'))
|
||||||
.toBe('C:\\NS\\Sub&Folder');
|
.toBe('/mnt/c/NS/Sub&Folder');
|
||||||
|
|
||||||
// Test tilde in path (short names in Windows)
|
// Test tilde in path (short names in Windows)
|
||||||
expect(normalizePath('C:\\NS\\MYKIND~1'))
|
expect(normalizePath('C:\\NS\\MYKIND~1'))
|
||||||
.toBe('C:\\NS\\MYKIND~1');
|
.toBe('C:\\NS\\MYKIND~1');
|
||||||
expect(normalizePath('/Users/NEMANS~1/FOLDER~2/SUBFO~1/Public/P12PST~1'))
|
expect(normalizePath('/Users/NEMANS~1/FOLDER~2/SUBFO~1/Public/P12PST~1'))
|
||||||
.toBe('/Users/NEMANS~1/FOLDER~2/SUBFO~1/Public/P12PST~1');
|
.toBe('/Users/NEMANS~1/FOLDER~2/SUBFO~1/Public/P12PST~1');
|
||||||
|
|
||||||
// Test other special characters
|
// Test other special characters
|
||||||
expect(normalizePath('C:\\Path with #hash'))
|
expect(normalizePath('C:\\Path with #hash'))
|
||||||
.toBe('C:\\Path with #hash');
|
.toBe('C:\\Path with #hash');
|
||||||
|
|
@ -128,10 +170,19 @@ describe('Path Utilities', () => {
|
||||||
it('capitalizes lowercase drive letters for Windows paths', () => {
|
it('capitalizes lowercase drive letters for Windows paths', () => {
|
||||||
expect(normalizePath('c:/windows/system32'))
|
expect(normalizePath('c:/windows/system32'))
|
||||||
.toBe('C:\\windows\\system32');
|
.toBe('C:\\windows\\system32');
|
||||||
expect(normalizePath('/mnt/d/my/folder')) // WSL path with lowercase drive
|
// WSL paths should always be preserved
|
||||||
.toBe('D:\\my\\folder');
|
expect(normalizePath('/mnt/d/my/folder'))
|
||||||
expect(normalizePath('/e/another/folder')) // Unix-style Windows path with lowercase drive
|
.toBe('/mnt/d/my/folder');
|
||||||
.toBe('E:\\another\\folder');
|
|
||||||
|
if (process.platform === 'win32') {
|
||||||
|
// On Windows, Unix-style paths should be converted and capitalized
|
||||||
|
expect(normalizePath('/e/another/folder'))
|
||||||
|
.toBe('E:\\another\\folder');
|
||||||
|
} else {
|
||||||
|
// On Linux, /e/ is just a regular Unix path
|
||||||
|
expect(normalizePath('/e/another/folder'))
|
||||||
|
.toBe('/e/another/folder');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it('handles UNC paths correctly', () => {
|
it('handles UNC paths correctly', () => {
|
||||||
|
|
@ -172,4 +223,132 @@ describe('Path Utilities', () => {
|
||||||
expect(expandHome('C:/test')).toBe('C:/test');
|
expect(expandHome('C:/test')).toBe('C:/test');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('WSL path handling (issue #2795 fix)', () => {
|
||||||
|
// Save original platform
|
||||||
|
const originalPlatform = process.platform;
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
// Restore platform after each test
|
||||||
|
Object.defineProperty(process, 'platform', {
|
||||||
|
value: originalPlatform,
|
||||||
|
writable: true,
|
||||||
|
configurable: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should NEVER convert WSL paths - they work correctly in WSL with Node.js fs', () => {
|
||||||
|
// The key insight: When running `wsl npx ...`, Node.js runs INSIDE WSL (process.platform === 'linux')
|
||||||
|
// and /mnt/c/ paths work correctly with Node.js fs operations in that environment.
|
||||||
|
// Converting them to C:\ format breaks fs operations because Windows paths don't work inside WSL.
|
||||||
|
|
||||||
|
// Mock Linux platform (inside WSL)
|
||||||
|
Object.defineProperty(process, 'platform', {
|
||||||
|
value: 'linux',
|
||||||
|
writable: true,
|
||||||
|
configurable: true
|
||||||
|
});
|
||||||
|
|
||||||
|
// WSL paths should NOT be converted, even inside WSL
|
||||||
|
expect(normalizePath('/mnt/c/Users/username/folder'))
|
||||||
|
.toBe('/mnt/c/Users/username/folder');
|
||||||
|
|
||||||
|
expect(normalizePath('/mnt/d/Documents/project'))
|
||||||
|
.toBe('/mnt/d/Documents/project');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should also preserve WSL paths when running on Windows', () => {
|
||||||
|
// Mock Windows platform
|
||||||
|
Object.defineProperty(process, 'platform', {
|
||||||
|
value: 'win32',
|
||||||
|
writable: true,
|
||||||
|
configurable: true
|
||||||
|
});
|
||||||
|
|
||||||
|
// WSL paths should still be preserved (though they wouldn't be accessible from Windows Node.js)
|
||||||
|
expect(normalizePath('/mnt/c/Users/username/folder'))
|
||||||
|
.toBe('/mnt/c/Users/username/folder');
|
||||||
|
|
||||||
|
expect(normalizePath('/mnt/d/Documents/project'))
|
||||||
|
.toBe('/mnt/d/Documents/project');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should convert Unix-style Windows paths (/c/) only when running on Windows (win32)', () => {
|
||||||
|
// Mock process.platform to be 'win32' (Windows)
|
||||||
|
Object.defineProperty(process, 'platform', {
|
||||||
|
value: 'win32',
|
||||||
|
writable: true,
|
||||||
|
configurable: true
|
||||||
|
});
|
||||||
|
|
||||||
|
// Unix-style Windows paths like /c/ should be converted on Windows
|
||||||
|
expect(normalizePath('/c/Users/username/folder'))
|
||||||
|
.toBe('C:\\Users\\username\\folder');
|
||||||
|
|
||||||
|
expect(normalizePath('/d/Documents/project'))
|
||||||
|
.toBe('D:\\Documents\\project');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should NOT convert Unix-style paths (/c/) when running inside WSL (linux)', () => {
|
||||||
|
// Mock process.platform to be 'linux' (WSL/Linux)
|
||||||
|
Object.defineProperty(process, 'platform', {
|
||||||
|
value: 'linux',
|
||||||
|
writable: true,
|
||||||
|
configurable: true
|
||||||
|
});
|
||||||
|
|
||||||
|
// When on Linux, /c/ is just a regular Unix directory, not a drive letter
|
||||||
|
expect(normalizePath('/c/some/path'))
|
||||||
|
.toBe('/c/some/path');
|
||||||
|
|
||||||
|
expect(normalizePath('/d/another/path'))
|
||||||
|
.toBe('/d/another/path');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should preserve regular Unix paths on all platforms', () => {
|
||||||
|
// Test on Linux
|
||||||
|
Object.defineProperty(process, 'platform', {
|
||||||
|
value: 'linux',
|
||||||
|
writable: true,
|
||||||
|
configurable: true
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(normalizePath('/home/user/documents'))
|
||||||
|
.toBe('/home/user/documents');
|
||||||
|
|
||||||
|
expect(normalizePath('/var/log/app'))
|
||||||
|
.toBe('/var/log/app');
|
||||||
|
|
||||||
|
// Test on Windows (though these paths wouldn't work on Windows)
|
||||||
|
Object.defineProperty(process, 'platform', {
|
||||||
|
value: 'win32',
|
||||||
|
writable: true,
|
||||||
|
configurable: true
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(normalizePath('/home/user/documents'))
|
||||||
|
.toBe('/home/user/documents');
|
||||||
|
|
||||||
|
expect(normalizePath('/var/log/app'))
|
||||||
|
.toBe('/var/log/app');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('reproduces exact scenario from issue #2795', () => {
|
||||||
|
// Simulate running inside WSL: wsl npx @modelcontextprotocol/server-filesystem /mnt/c/Users/username/folder
|
||||||
|
Object.defineProperty(process, 'platform', {
|
||||||
|
value: 'linux',
|
||||||
|
writable: true,
|
||||||
|
configurable: true
|
||||||
|
});
|
||||||
|
|
||||||
|
// This is the exact path from the issue
|
||||||
|
const inputPath = '/mnt/c/Users/username/folder';
|
||||||
|
const result = normalizePath(inputPath);
|
||||||
|
|
||||||
|
// Should NOT convert to C:\Users\username\folder
|
||||||
|
expect(result).toBe('/mnt/c/Users/username/folder');
|
||||||
|
expect(result).not.toContain('C:');
|
||||||
|
expect(result).not.toContain('\\');
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -8,14 +8,15 @@ import os from 'os';
|
||||||
*/
|
*/
|
||||||
export function convertToWindowsPath(p: string): string {
|
export function convertToWindowsPath(p: string): string {
|
||||||
// Handle WSL paths (/mnt/c/...)
|
// Handle WSL paths (/mnt/c/...)
|
||||||
|
// NEVER convert WSL paths - they are valid Linux paths that work with Node.js fs operations in WSL
|
||||||
|
// Converting them to Windows format (C:\...) breaks fs operations inside WSL
|
||||||
if (p.startsWith('/mnt/')) {
|
if (p.startsWith('/mnt/')) {
|
||||||
const driveLetter = p.charAt(5).toUpperCase();
|
return p; // Leave WSL paths unchanged
|
||||||
const pathPart = p.slice(6).replace(/\//g, '\\');
|
|
||||||
return `${driveLetter}:${pathPart}`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle Unix-style Windows paths (/c/...)
|
// Handle Unix-style Windows paths (/c/...)
|
||||||
if (p.match(/^\/[a-zA-Z]\//)) {
|
// Only convert when running on Windows
|
||||||
|
if (p.match(/^\/[a-zA-Z]\//) && process.platform === 'win32') {
|
||||||
const driveLetter = p.charAt(1).toUpperCase();
|
const driveLetter = p.charAt(1).toUpperCase();
|
||||||
const pathPart = p.slice(2).replace(/\//g, '\\');
|
const pathPart = p.slice(2).replace(/\//g, '\\');
|
||||||
return `${driveLetter}:${pathPart}`;
|
return `${driveLetter}:${pathPart}`;
|
||||||
|
|
@ -38,21 +39,29 @@ export function convertToWindowsPath(p: string): string {
|
||||||
export function normalizePath(p: string): string {
|
export function normalizePath(p: string): string {
|
||||||
// Remove any surrounding quotes and whitespace
|
// Remove any surrounding quotes and whitespace
|
||||||
p = p.trim().replace(/^["']|["']$/g, '');
|
p = p.trim().replace(/^["']|["']$/g, '');
|
||||||
|
|
||||||
// Check if this is a Unix path (starts with / but not a Windows or WSL path)
|
// Check if this is a Unix path that should not be converted
|
||||||
const isUnixPath = p.startsWith('/') &&
|
// WSL paths (/mnt/) should ALWAYS be preserved as they work correctly in WSL with Node.js fs
|
||||||
!p.match(/^\/mnt\/[a-z]\//i) &&
|
// Regular Unix paths should also be preserved
|
||||||
!p.match(/^\/[a-zA-Z]\//);
|
const isUnixPath = p.startsWith('/') && (
|
||||||
|
// Always preserve WSL paths (/mnt/c/, /mnt/d/, etc.)
|
||||||
|
p.match(/^\/mnt\/[a-z]\//i) ||
|
||||||
|
// On non-Windows platforms, treat all absolute paths as Unix paths
|
||||||
|
(process.platform !== 'win32') ||
|
||||||
|
// On Windows, preserve Unix paths that aren't Unix-style Windows paths (/c/, /d/, etc.)
|
||||||
|
(process.platform === 'win32' && !p.match(/^\/[a-zA-Z]\//))
|
||||||
|
);
|
||||||
|
|
||||||
if (isUnixPath) {
|
if (isUnixPath) {
|
||||||
// For Unix paths, just normalize without converting to Windows format
|
// For Unix paths, just normalize without converting to Windows format
|
||||||
// Replace double slashes with single slashes and remove trailing slashes
|
// Replace double slashes with single slashes and remove trailing slashes
|
||||||
return p.replace(/\/+/g, '/').replace(/\/+$/, '');
|
return p.replace(/\/+/g, '/').replace(/\/+$/, '');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert WSL or Unix-style Windows paths to Windows format
|
// Convert Unix-style Windows paths (/c/, /d/) to Windows format if on Windows
|
||||||
|
// This function will now leave /mnt/ paths unchanged
|
||||||
p = convertToWindowsPath(p);
|
p = convertToWindowsPath(p);
|
||||||
|
|
||||||
// Handle double backslashes, preserving leading UNC \\
|
// Handle double backslashes, preserving leading UNC \\
|
||||||
if (p.startsWith('\\\\')) {
|
if (p.startsWith('\\\\')) {
|
||||||
// For UNC paths, first normalize any excessive leading backslashes to exactly \\
|
// For UNC paths, first normalize any excessive leading backslashes to exactly \\
|
||||||
|
|
@ -67,15 +76,15 @@ export function normalizePath(p: string): string {
|
||||||
// For non-UNC paths, normalize all double backslashes
|
// For non-UNC paths, normalize all double backslashes
|
||||||
p = p.replace(/\\\\/g, '\\');
|
p = p.replace(/\\\\/g, '\\');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use Node's path normalization, which handles . and .. segments
|
// Use Node's path normalization, which handles . and .. segments
|
||||||
let normalized = path.normalize(p);
|
let normalized = path.normalize(p);
|
||||||
|
|
||||||
// Fix UNC paths after normalization (path.normalize can remove a leading backslash)
|
// Fix UNC paths after normalization (path.normalize can remove a leading backslash)
|
||||||
if (p.startsWith('\\\\') && !normalized.startsWith('\\\\')) {
|
if (p.startsWith('\\\\') && !normalized.startsWith('\\\\')) {
|
||||||
normalized = '\\' + normalized;
|
normalized = '\\' + normalized;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle Windows paths: convert slashes and ensure drive letter is capitalized
|
// Handle Windows paths: convert slashes and ensure drive letter is capitalized
|
||||||
if (normalized.match(/^[a-zA-Z]:/)) {
|
if (normalized.match(/^[a-zA-Z]:/)) {
|
||||||
let result = normalized.replace(/\//g, '\\');
|
let result = normalized.replace(/\//g, '\\');
|
||||||
|
|
@ -85,10 +94,15 @@ export function normalizePath(p: string): string {
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// For all other paths (including relative paths), convert forward slashes to backslashes
|
// On Windows, convert forward slashes to backslashes for relative paths
|
||||||
// This ensures relative paths like "some/relative/path" become "some\\relative\\path"
|
// On Linux/Unix, preserve forward slashes
|
||||||
return normalized.replace(/\//g, '\\');
|
if (process.platform === 'win32') {
|
||||||
|
return normalized.replace(/\//g, '\\');
|
||||||
|
}
|
||||||
|
|
||||||
|
// On non-Windows platforms, keep the normalized path as-is
|
||||||
|
return normalized;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue