From 846887de323c1c68e5a583ae8fa060efbeb41ac1 Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Wed, 23 Sep 2020 11:12:54 +0300 Subject: [PATCH] fix: finding global bin directory When searching for a global bin directory, also look for symlinked commands. close #2888 PR #2889 --- .changeset/smooth-zoos-rush.md | 5 +++++ packages/global-bin-dir/src/index.ts | 3 ++- packages/global-bin-dir/test/index.ts | 6 +++--- 3 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 .changeset/smooth-zoos-rush.md 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', {