From f676b5fff3a4482d33e6f5d2b2c5fbdc5d8d6eca Mon Sep 17 00:00:00 2001 From: lvqq Date: Mon, 19 Sep 2022 09:50:51 +0800 Subject: [PATCH 1/2] fix: error in pnpm --dir link --global --- .changeset/stale-rice-nail.md | 5 +++++ packages/plugin-commands-installation/src/link.ts | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/stale-rice-nail.md diff --git a/.changeset/stale-rice-nail.md b/.changeset/stale-rice-nail.md new file mode 100644 index 00000000000..d00ba5526a2 --- /dev/null +++ b/.changeset/stale-rice-nail.md @@ -0,0 +1,5 @@ +--- +"@pnpm/plugin-commands-installation": patch +--- + +fix error in pnpm --dir link --global diff --git a/packages/plugin-commands-installation/src/link.ts b/packages/plugin-commands-installation/src/link.ts index d4915303e80..187eb39d277 100644 --- a/packages/plugin-commands-installation/src/link.ts +++ b/packages/plugin-commands-installation/src/link.ts @@ -7,7 +7,7 @@ import { tryReadProjectManifest, } from '@pnpm/cli-utils' import { UNIVERSAL_OPTIONS } from '@pnpm/common-cli-options-help' -import { Config, types as allTypes } from '@pnpm/config' +import { CliOptions, Config, types as allTypes } from '@pnpm/config' import PnpmError from '@pnpm/error' import findWorkspaceDir from '@pnpm/find-workspace-dir' import findWorkspacePackages, { arrayOfWorkspacePackagesToMap } from '@pnpm/find-workspace-packages' @@ -116,7 +116,7 @@ export async function handler ( const { manifest, writeProjectManifest } = await tryReadProjectManifest(opts.dir, opts) const newManifest = await addDependenciesToPackage( manifest ?? {}, - [`link:${cwd}`], + [`link:${(opts.cliOptions as CliOptions)?.dir ?? cwd}`], linkOpts ) await writeProjectManifest(newManifest) From 8daa80bd4e549572dc63a606b7dafb8dc00763b2 Mon Sep 17 00:00:00 2001 From: chlorine Date: Tue, 20 Sep 2022 06:22:01 +0000 Subject: [PATCH 2/2] fix: add path join and add test case for pnpm --dir link global --- .changeset/orange-apes-scream.md | 5 ++++ .../plugin-commands-installation/src/link.ts | 4 +-- .../plugin-commands-installation/test/link.ts | 26 +++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 .changeset/orange-apes-scream.md diff --git a/.changeset/orange-apes-scream.md b/.changeset/orange-apes-scream.md new file mode 100644 index 00000000000..a778928f502 --- /dev/null +++ b/.changeset/orange-apes-scream.md @@ -0,0 +1,5 @@ +--- +"@pnpm/plugin-commands-installation": patch +--- + +add path join and add test case for pnpm --dir link global diff --git a/packages/plugin-commands-installation/src/link.ts b/packages/plugin-commands-installation/src/link.ts index 187eb39d277..8972ccca7a5 100644 --- a/packages/plugin-commands-installation/src/link.ts +++ b/packages/plugin-commands-installation/src/link.ts @@ -7,7 +7,7 @@ import { tryReadProjectManifest, } from '@pnpm/cli-utils' import { UNIVERSAL_OPTIONS } from '@pnpm/common-cli-options-help' -import { CliOptions, Config, types as allTypes } from '@pnpm/config' +import { Config, types as allTypes } from '@pnpm/config' import PnpmError from '@pnpm/error' import findWorkspaceDir from '@pnpm/find-workspace-dir' import findWorkspacePackages, { arrayOfWorkspacePackagesToMap } from '@pnpm/find-workspace-packages' @@ -116,7 +116,7 @@ export async function handler ( const { manifest, writeProjectManifest } = await tryReadProjectManifest(opts.dir, opts) const newManifest = await addDependenciesToPackage( manifest ?? {}, - [`link:${(opts.cliOptions as CliOptions)?.dir ?? cwd}`], + [`link:${opts.cliOptions?.dir ? path.join(cwd, opts.cliOptions.dir) : cwd}`], linkOpts ) await writeProjectManifest(newManifest) diff --git a/packages/plugin-commands-installation/test/link.ts b/packages/plugin-commands-installation/test/link.ts index cd2cdd69cb0..fe6c62eb8dd 100644 --- a/packages/plugin-commands-installation/test/link.ts +++ b/packages/plugin-commands-installation/test/link.ts @@ -72,6 +72,32 @@ test('link global bin', async function () { await isExecutable((value) => expect(value).toBeTruthy(), path.join(globalBin, 'package-with-bin')) }) +test('link --dir global bin', async function () { + prepare() + process.chdir('..') + + const globalDir = path.resolve('global') + const globalBin = path.join(globalDir, 'bin') + const oldPath = process.env[PATH] + process.env[PATH] = `${globalBin}${path.delimiter}${oldPath ?? ''}` + await fs.mkdir(globalBin, { recursive: true }) + + await writePkg('./dir/package-with-bin-in-dir', { name: 'package-with-bin-in-dir', version: '1.0.0', bin: 'bin.js' }) + await fs.writeFile('./dir/package-with-bin-in-dir/bin.js', '#!/usr/bin/env node\nconsole.log(/hi/)\n', 'utf8') + + await link.handler({ + ...DEFAULT_OPTS, + cliOptions: { + dir: './dir/package-with-bin-in-dir', + }, + bin: globalBin, + dir: globalDir, + }) + process.env[PATH] = oldPath + + await isExecutable((value) => expect(value).toBeTruthy(), path.join(globalBin, 'package-with-bin-in-dir')) +}) + test('relative link', async () => { const project = prepare({ dependencies: {