diff --git a/package.json b/package.json index 6c9bdee60a..76c88c7bd1 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "lib/" ], "peerDependencies": { - "pnpm-logger": "^0.5.3" + "pnpm-logger": "^0.5.4" }, "dependencies": { "@types/byline": "^4.2.31", @@ -80,7 +80,7 @@ "cz-conventional-changelog": "^2.0.0", "husky": "^0.13.2", "npm-scripts-info": "^0.3.6", - "pnpm-logger": "^0.5.3", + "pnpm-logger": "^0.5.4", "rimraf": "^2.5.4", "tslint": "^5.4.2", "typescript": "^2.4.1", diff --git a/shrinkwrap.yaml b/shrinkwrap.yaml index 398e5ba886..9e099bbd3b 100644 --- a/shrinkwrap.yaml +++ b/shrinkwrap.yaml @@ -60,7 +60,7 @@ devDependencies: cz-conventional-changelog: 2.0.0 husky: 0.13.4 npm-scripts-info: 0.3.6 - pnpm-logger: 0.5.3 + pnpm-logger: 0.5.4 tslint: 5.5.0 typescript: 2.4.2 validate-commit-msg: 2.14.0 @@ -1595,14 +1595,14 @@ packages: bole: 3.0.2 resolution: integrity: sha1-6uzqWgN/BTpkxQvafto8uH9e1mE= - /pnpm-logger/0.5.3: + /pnpm-logger/0.5.4: dependencies: '@types/node': 8.0.17 bole: 3.0.2 ndjson: 1.5.0 dev: true resolution: - integrity: sha512-uIDVA3VrDtzYPWuBRBR+/PVj2GqL7srSbT8V1fX7MVVHYzXLOfKrCGkY2rcWThn6lpBvq65BVebU5kFvxaEKaw== + integrity: sha512-4qWj8oOPmzkAR395KInwnQU7/0MvPIz4Oz7tJa7v+VKDsUCL1sd7AEnvwgNQ2ZJ3NaELAsnkI6bNOsP4nT6mhg== /pnpm-shrinkwrap/3.1.0: dependencies: '@types/node': 7.0.39 @@ -2257,7 +2257,7 @@ specifiers: path-exists: ^3.0.0 path-name: ^1.0.0 pnpm-install-checks: ^1.1.0 - pnpm-logger: ^0.5.3 + pnpm-logger: ^0.5.4 pnpm-shrinkwrap: ^3.1.0 proper-lockfile: ^2.0.0 ramda: ^0.24.1 diff --git a/src/api/removeOrphanPkgs.ts b/src/api/removeOrphanPkgs.ts index 6af30b34b3..90a6bc0078 100644 --- a/src/api/removeOrphanPkgs.ts +++ b/src/api/removeOrphanPkgs.ts @@ -24,7 +24,13 @@ export default async function removeOrphanPkgs ( const removedTopDeps: [string, string][] = R.difference(oldPkgs, newPkgs) as [string, string][] const rootModules = path.join(opts.prefix, 'node_modules') - await Promise.all(removedTopDeps.map(depName => removeTopDependency(depName[0], rootModules))) + await Promise.all(removedTopDeps.map(depName => { + return removeTopDependency({ + name: depName[0], + dev: Boolean(opts.oldShrinkwrap.devDependencies && opts.oldShrinkwrap.devDependencies[depName[0]]), + optional: Boolean(opts.oldShrinkwrap.optionalDependencies && opts.oldShrinkwrap.optionalDependencies[depName[0]]), + }, rootModules) + })) const oldPkgIds = R.keys(opts.oldShrinkwrap.packages).map(depPath => dp.resolve(opts.oldShrinkwrap.registry, depPath)) const newPkgIds = R.keys(opts.newShrinkwrap.packages).map(depPath => dp.resolve(opts.newShrinkwrap.registry, depPath)) diff --git a/src/api/uninstall.ts b/src/api/uninstall.ts index 3669727df8..8b7484a5ce 100644 --- a/src/api/uninstall.ts +++ b/src/api/uninstall.ts @@ -96,9 +96,14 @@ async function removeOuterLinks ( storePath: string, } ) { + // These packages are not in package.json, they were just linked in not installed for (const pkgToUninstall of pkgsToUninstall) { if (!await safeIsInnerLink(modules, pkgToUninstall, opts)) { - await removeTopDependency(pkgToUninstall, modules) + await removeTopDependency({ + name: pkgToUninstall, + dev: false, + optional: false, + }, modules) } } } diff --git a/src/link/index.ts b/src/link/index.ts index 1722946037..d23f4a2a99 100644 --- a/src/link/index.ts +++ b/src/link/index.ts @@ -91,6 +91,7 @@ export default async function ( id: pkg.id, name: pkg.name, version: pkg.version, + dependencyType: pkg.dev && 'dev' || pkg.optional && 'optional' || 'prod', }, }) } diff --git a/src/removeTopDependency.ts b/src/removeTopDependency.ts index fe1e4faf28..e079942863 100644 --- a/src/removeTopDependency.ts +++ b/src/removeTopDependency.ts @@ -4,17 +4,25 @@ import binify from './binify' import {fromDir as safeReadPkgFromDir} from './fs/safeReadPkg' import {rootLogger} from 'pnpm-logger' -export default async function removeTopDependency (dependencyName: string, modules: string) { +export default async function removeTopDependency ( + dependency: { + name: string, + dev: boolean, + optional: boolean, + }, + modules: string +) { const results = await Promise.all([ - removeBins(dependencyName, modules), - rimraf(path.join(modules, dependencyName)), + removeBins(dependency.name, modules), + rimraf(path.join(modules, dependency.name)), ]) const uninstalledPkg = results[0] rootLogger.info({ removed: { - name: dependencyName, + name: dependency.name, version: uninstalledPkg && uninstalledPkg.version, + dependencyType: dependency.dev && 'dev' || dependency.optional && 'optional' || 'prod' }, }) } diff --git a/test/install/misc.ts b/test/install/misc.ts index f645ff5d29..9793c8e7a6 100644 --- a/test/install/misc.ts +++ b/test/install/misc.ts @@ -66,6 +66,7 @@ test('no dependencies (lodash)', async (t: tape.Test) => { added: { name: 'lodash', version: '4.0.0', + dependencyType: 'prod', }, }), 'added to root') @@ -139,6 +140,7 @@ test('update a package when installing with a dist-tag', async function (t: tape removed: { name: 'dep-of-pkg-with-1-dep', version: '100.0.0', + dependencyType: 'dev', }, }), 'reported old version removed from the root') @@ -148,6 +150,7 @@ test('update a package when installing with a dist-tag', async function (t: tape added: { name: 'dep-of-pkg-with-1-dep', version: '100.1.0', + dependencyType: 'dev', }, }), 'reported new version added to the root') @@ -202,6 +205,7 @@ test('idempotency (rimraf)', async (t: tape.Test) => { added: { name: 'rimraf', version: '2.5.1', + dependencyType: 'prod', }, }), 'reported that rimraf added to the root') @@ -215,6 +219,7 @@ test('idempotency (rimraf)', async (t: tape.Test) => { added: { name: 'rimraf', version: '2.5.1', + dependencyType: 'prod', }, }), 'did not reported that rimraf was added because it was already there') @@ -238,6 +243,7 @@ test('reporting adding root package', async (t: tape.Test) => { added: { name: 'flatten', version: '1.0.2', + dependencyType: 'prod', }, }), 'reported that flatten added to the root') }) diff --git a/test/uninstall.ts b/test/uninstall.ts index 6eb865d645..e2d4631cf8 100644 --- a/test/uninstall.ts +++ b/test/uninstall.ts @@ -42,6 +42,7 @@ test('uninstall package with no dependencies', async (t: tape.Test) => { removed: { name: 'is-negative', version: '2.1.0', + dependencyType: 'prod', }, }), 'removing root dependency reported')