diff --git a/.changeset/flat-rabbits-smile.md b/.changeset/flat-rabbits-smile.md new file mode 100644 index 00000000000..bf1cbae6f1d --- /dev/null +++ b/.changeset/flat-rabbits-smile.md @@ -0,0 +1,6 @@ +--- +"@pnpm/default-reporter": patch +"pnpm": patch +--- + +The update notifier should suggest using the standalone script, when pnpm was installed using a standalone script. diff --git a/cli/default-reporter/src/index.ts b/cli/default-reporter/src/index.ts index 1c2bbba527b..a292f34dce1 100644 --- a/cli/default-reporter/src/index.ts +++ b/cli/default-reporter/src/index.ts @@ -28,6 +28,7 @@ export function initDefaultReporter ( argv: string[] config?: Config env?: NodeJS.ProcessEnv + process?: NodeJS.Process } } ): () => void { @@ -95,6 +96,7 @@ export function toOutput$ ( argv: string[] config?: Config env?: NodeJS.ProcessEnv + process?: NodeJS.Process } } ): Rx.Observable { @@ -235,6 +237,7 @@ export function toOutput$ ( cmd: opts.context.argv[0], config: opts.context.config, env: opts.context.env ?? process.env, + process: opts.context.process ?? process, isRecursive: opts.context.config?.['recursive'] === true, logLevel: opts.reportingOptions?.logLevel, pnpmConfig: opts.context.config, diff --git a/cli/default-reporter/src/reporterForClient/index.ts b/cli/default-reporter/src/reporterForClient/index.ts index 439873c7ff8..309fd12f26d 100644 --- a/cli/default-reporter/src/reporterForClient/index.ts +++ b/cli/default-reporter/src/reporterForClient/index.ts @@ -57,6 +57,7 @@ export function reporterForClient ( cmd: string config?: Config env: NodeJS.ProcessEnv + process: NodeJS.Process isRecursive: boolean logLevel?: LogLevel pnpmConfig?: Config diff --git a/cli/default-reporter/src/reporterForClient/reportUpdateCheck.ts b/cli/default-reporter/src/reporterForClient/reportUpdateCheck.ts index bb663c473fd..525626325cf 100644 --- a/cli/default-reporter/src/reporterForClient/reportUpdateCheck.ts +++ b/cli/default-reporter/src/reporterForClient/reportUpdateCheck.ts @@ -7,12 +7,14 @@ import semver from 'semver' export function reportUpdateCheck (log$: Rx.Observable, opts: { env: NodeJS.ProcessEnv + process: NodeJS.Process }) { return log$.pipe( take(1), filter((log) => semver.gt(log.latestVersion, log.currentVersion)), map((log) => { - const updateCommand = renderUpdateCommand({ + const updateMessage = renderUpdateMessage({ + currentPkgIsExecutable: detectIfCurrentPkgIsExecutable(opts.process), latestVersion: log.latestVersion, env: opts.env, }) @@ -20,7 +22,7 @@ export function reportUpdateCheck (log$: Rx.Observable, opts: { msg: boxen(`\ Update available! ${chalk.red(log.currentVersion)} → ${chalk.green(log.latestVersion)}. ${chalk.magenta('Changelog:')} https://github.com/pnpm/pnpm/releases/tag/v${log.latestVersion} -Run "${chalk.magenta(updateCommand)}" to update. +${updateMessage} Follow ${chalk.magenta('@pnpmjs')} for updates: https://twitter.com/pnpmjs`, { @@ -36,10 +38,28 @@ Follow ${chalk.magenta('@pnpmjs')} for updates: https://twitter.com/pnpmjs`, ) } -function renderUpdateCommand (opts: { env: NodeJS.ProcessEnv, latestVersion: string }) { +interface UpdateOptions { + currentPkgIsExecutable: boolean + env: NodeJS.ProcessEnv + latestVersion: string +} + +function renderUpdateMessage (opts: UpdateOptions) { + if (opts.currentPkgIsExecutable && opts.env.PNPM_HOME) { + return 'Run one of the standalone scripts from: https://pnpm.io/installation' + } + const updateCommand = renderUpdateCommand(opts) + return `Run "${chalk.magenta(updateCommand)}" to update.` +} + +function renderUpdateCommand (opts: UpdateOptions & { currentPkgIsExecutable: boolean }) { if (opts.env.COREPACK_ROOT) { return `corepack prepare pnpm@${opts.latestVersion} --activate` } - const pkgName = process['pkg'] != null ? '@pnpm/exe' : 'pnpm' + const pkgName = opts.currentPkgIsExecutable ? '@pnpm/exe' : 'pnpm' return `pnpm add -g ${pkgName}` } + +function detectIfCurrentPkgIsExecutable (process: NodeJS.Process) { + return process['pkg'] != null +} diff --git a/cli/default-reporter/test/__snapshots__/reportingUpdateCheck.ts.snap b/cli/default-reporter/test/__snapshots__/reportingUpdateCheck.ts.snap index f27a568fa6d..b29e6cea0f0 100644 --- a/cli/default-reporter/test/__snapshots__/reportingUpdateCheck.ts.snap +++ b/cli/default-reporter/test/__snapshots__/reportingUpdateCheck.ts.snap @@ -27,3 +27,17 @@ exports[`print update notification if the latest version is greater than the cur ╰──────────────────────────────────────────────────────────────────╯ " `; + +exports[`print update notification that suggests to use the standalone scripts for the upgrade 1`] = ` +" + ╭──────────────────────────────────────────────────────────────────────────╮ + │ │ + │ Update available! 10.0.0 → 11.0.0. │ + │ Changelog: https://github.com/pnpm/pnpm/releases/tag/v11.0.0 │ + │ Run one of the standalone scripts from: https://pnpm.io/installation │ + │ │ + │ Follow @pnpmjs for updates: https://twitter.com/pnpmjs │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────╯ +" +`; diff --git a/cli/default-reporter/test/reportingUpdateCheck.ts b/cli/default-reporter/test/reportingUpdateCheck.ts index 594f5741398..13bee83996f 100644 --- a/cli/default-reporter/test/reportingUpdateCheck.ts +++ b/cli/default-reporter/test/reportingUpdateCheck.ts @@ -86,3 +86,34 @@ test('print update notification for Corepack if the latest version is greater th }, }) }) + +test('print update notification that suggests to use the standalone scripts for the upgrade', (done) => { + const output$ = toOutput$({ + context: { + argv: ['install'], + config: { recursive: true } as Config, + env: { + PNPM_HOME: '/home/user/.local/share/pnpm', + }, + process: { + pkg: true, + } as any, // eslint-disable-line + }, + streamParser: createStreamParser(), + }) + + updateCheckLogger.debug({ + currentVersion: '10.0.0', + latestVersion: '11.0.0', + }) + + expect.assertions(1) + + output$.pipe(take(1)).subscribe({ + complete: () => done(), + error: done, + next: output => { + expect(stripAnsi(output)).toMatchSnapshot() + }, + }) +})