From 7ec32acce84925d8d20e200fcb270dec0688cabc Mon Sep 17 00:00:00 2001 From: Yao Ding Date: Tue, 10 Mar 2020 12:46:22 -0400 Subject: [PATCH] feat: print a warning if a globally installed package has no bins PR #2402 close #2309 Co-Authored-By: Zoltan Kochan --- packages/link-bins/src/index.ts | 4 ++- .../supi/src/install/extendInstallOptions.ts | 2 ++ packages/supi/src/install/index.ts | 14 +++++++--- packages/supi/test/install/misc.ts | 27 +++++++++++++++++++ 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/packages/link-bins/src/index.ts b/packages/link-bins/src/index.ts index efd219ac9d..f15b54463b 100644 --- a/packages/link-bins/src/index.ts +++ b/packages/link-bins/src/index.ts @@ -81,7 +81,7 @@ async function linkBins ( warn: (msg: string) => void, }, ) { - if (!allCmds.length) return + if (!allCmds.length) return [] as string[] await makeDir(binPath) @@ -105,6 +105,8 @@ async function linkBins ( throw result.reason } } + + return allCmds.map(cmd => cmd.pkgName) } async function isFromModules (filename: string) { diff --git a/packages/supi/src/install/extendInstallOptions.ts b/packages/supi/src/install/extendInstallOptions.ts index c0fd9cbe81..b90b7ff49f 100644 --- a/packages/supi/src/install/extendInstallOptions.ts +++ b/packages/supi/src/install/extendInstallOptions.ts @@ -74,6 +74,8 @@ export interface StrictInstallOptions { independentLeaves: boolean, forceIndependentLeaves: boolean, + + global: boolean, } export type InstallOptions = Partial & diff --git a/packages/supi/src/install/index.ts b/packages/supi/src/install/index.ts index 60becbf3a7..018a776a09 100644 --- a/packages/supi/src/install/index.ts +++ b/packages/supi/src/install/index.ts @@ -837,9 +837,17 @@ async function installInContext ( }) } - if (!opts.lockfileOnly) { - await Promise.all(projectsToLink.map(linkBinsOfImporter)) - } + await Promise.all(projectsToLink.map(async (project, index) => { + const linkedPackages = await linkBinsOfImporter(project) + const projectToInstall = projects[index] + if (opts.global && projectToInstall.mutation.includes('install')) { + projectToInstall.wantedDependencies.forEach(pkg => { + if (!linkedPackages?.includes(pkg.alias)) { + logger.warn({ message: `${pkg.alias} has no binaries`, prefix: opts.lockfileDir }) + } + }) + } + })) } // waiting till the skipped packages are downloaded to the store diff --git a/packages/supi/test/install/misc.ts b/packages/supi/test/install/misc.ts index 63288a0069..ad2e64e808 100644 --- a/packages/supi/test/install/misc.ts +++ b/packages/supi/test/install/misc.ts @@ -1162,3 +1162,30 @@ test('fail if none of the available resolvers support a version spec', async (t: ], ) }) + +test('globally installed package which don\'t have bins should log warning message', async (t: tape.Test) => { + const project = prepareEmpty(t) + const reporter = sinon.spy() + + const opts = await testDefaults({ global: true, reporter }) + + await mutateModules([ + { + buildIndex: 0, + manifest: { + dependencies: { + 'is-positive': '1.0.0', + }, + }, + mutation: 'install', + rootDir: process.cwd(), + }, + ], opts) + + t.ok(reporter.calledWithMatch({ + message: 'is-positive has no binaries', + prefix: process.cwd(), + })) + + t.end() +})