diff --git a/__test__/common.spec.js b/__test__/common.spec.js index 612f793..805a297 100644 --- a/__test__/common.spec.js +++ b/__test__/common.spec.js @@ -9,16 +9,16 @@ jest.mock('mkdirp'); describe('common', () => { describe('getInstallationPath()', () => { - let callback, env; + let callback, _process; beforeEach(() => { callback = jest.fn(); - env = { ...process.env }; + _process = { ...global.process, env: { ...process.env } }; }); afterEach(() => { - process.env = env; + global.process = _process; }); it('should get binaries path from `npm bin`', () => { @@ -29,9 +29,21 @@ describe('common', () => { expect(callback).toHaveBeenCalledWith(null, path.sep + path.join('usr', 'local', 'bin')); }); - it('should get binaries path from env', () => { + it('should get binaries path from env on windows platform', () => { + childProcess.exec.mockImplementationOnce((_cmd, cb) => cb(new Error())); + + process.platform = 'win32'; + process.env.npm_config_prefix = String.raw`C:\Users\John Smith\AppData\npm`; + + common.getInstallationPath(callback); + + expect(callback).toHaveBeenCalledWith(null, path.win32.join('C:', 'Users', 'John Smith', 'AppData', 'npm')); + }); + + it('should get binaries path from env on platform different than windows', () => { childProcess.exec.mockImplementationOnce((_cmd, cb) => cb(new Error())); + process.platform = 'linux'; process.env.npm_config_prefix = '/usr/local'; common.getInstallationPath(callback); diff --git a/src/common.js b/src/common.js index d7d7434..1cd8550 100644 --- a/src/common.js +++ b/src/common.js @@ -39,7 +39,13 @@ function getInstallationPath(callback) { const packageManager = usedPM(); if (env && env.npm_config_prefix) { - dir = join(env.npm_config_prefix, 'bin'); + if (process.platform === 'win32') { + // On Windows, use the installation directory itself instead of the `bin` folder. + // See: https://docs.npmjs.com/cli/v6/configuring-npm/folders#executables + dir = env.npm_config_prefix; + } else { + dir = join(env.npm_config_prefix, 'bin'); + } } else if (env && env.npm_config_local_prefix) { dir = join(env.npm_config_local_prefix, join('node_modules', '.bin')); } else if (packageManager.name.toLowerCase() === 'pnpm') {