diff --git a/lib/path.js b/lib/path.js index 95cb3201bf2fe08..a99f1fb6704db43 100644 --- a/lib/path.js +++ b/lib/path.js @@ -48,6 +48,8 @@ const { validateString, } = require('internal/validators'); +const platformIsWin32 = (process.platform === 'win32'); + function isPathSeparator(code) { return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; } @@ -1011,6 +1013,22 @@ const win32 = { posix: null }; +const posixCwd = (() => { + if (platformIsWin32) { + // Converts Windows' backslash path separators to POSIX forward slashes + // and truncates any drive indicator + const regexp = /\\\\/g; + return () => { + const cwd = StringPrototypeReplace(process.cwd(), regexp, '/'); + return StringPrototypeSlice(cwd, StringPrototypeIndexOf(cwd, '/')); + }; + } + + // We're already on POSIX, no need for any transformations + return () => process.cwd(); +})(); + +const regexp = /\\\\/g; const posix = { // path.resolve([from ...], to) resolve(...args) { @@ -1018,17 +1036,7 @@ const posix = { let resolvedAbsolute = false; for (let i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) { - let path; - if (i >= 0) { - path = args[i]; - } else { - const _ = StringPrototypeReplace( - process.cwd(), - new RegExp(`\\${module.exports.sep}`, 'g'), - posix.sep - ); - path = StringPrototypeSlice(_, StringPrototypeIndexOf(_, posix.sep)); - } + const path = i >= 0 ? args[i] : posixCwd(); validateString(path, 'path'); @@ -1431,4 +1439,4 @@ posix.posix = win32.posix = posix; win32._makeLong = win32.toNamespacedPath; posix._makeLong = posix.toNamespacedPath; -module.exports = process.platform === 'win32' ? win32 : posix; +module.exports = platformIsWin32 ? win32 : posix;