diff --git a/.changeset/smooth-zoos-rush.md b/.changeset/smooth-zoos-rush.md new file mode 100644 index 0000000000..7ddc8b4020 --- /dev/null +++ b/.changeset/smooth-zoos-rush.md @@ -0,0 +1,5 @@ +--- +"@pnpm/global-bin-dir": patch +--- + +When searching for a suitable global bin directory, search for symlinked node, npm, pnpm commands, not only command files. diff --git a/packages/global-bin-dir/src/index.ts b/packages/global-bin-dir/src/index.ts index 9fdd206e0b..956aaf0327 100644 --- a/packages/global-bin-dir/src/index.ts +++ b/packages/global-bin-dir/src/index.ts @@ -62,7 +62,8 @@ const NODE_RELATED_COMMANDS = new Set(['pnpm', 'npm', 'node']) function dirHasNodeRelatedCommand (dir: string) { try { return fs.readdirSync(dir, { withFileTypes: true }) - .filter((entry) => entry.isFile()) + // We are searching for files or symlinks, not directories + .filter((entry) => !entry.isDirectory()) .map(({ name }) => name.toLowerCase()) .some((file) => NODE_RELATED_COMMANDS.has(file.split('.')[0])) } catch (err) { diff --git a/packages/global-bin-dir/test/index.ts b/packages/global-bin-dir/test/index.ts index f546587a7d..1655a8000f 100644 --- a/packages/global-bin-dir/test/index.ts +++ b/packages/global-bin-dir/test/index.ts @@ -11,15 +11,15 @@ const makePath = : (...paths: string[]) => `/${path.join(...paths)}` let canWriteToDir!: typeof _canWriteToDir -let readdirSync = (dir: string) => [] as Array<{ name: string, isFile: () => boolean }> +let readdirSync = (dir: string) => [] as Array<{ name: string, isDirectory: () => boolean }> const FAKE_PATH = 'FAKE_PATH' function makeFileEntry (name: string) { - return { name, isFile: () => true } + return { name, isDirectory: () => false } } function makeDirEntry (name: string) { - return { name, isFile: () => false } + return { name, isDirectory: () => true } } const globalBinDir = proxiquire('../lib/index.js', {