From 08efa8507f05dc7bfc9c5bece5bdc7044f3ac8a8 Mon Sep 17 00:00:00 2001 From: zkochan Date: Thu, 22 Jun 2017 10:25:23 +0300 Subject: [PATCH] fix: uninstall w/o type argument should find dependency --- src/api/uninstall.ts | 40 ++++++++++++++++++---------------------- src/removeDeps.ts | 25 ++++++++++++++++++------- test/uninstall.ts | 13 +++++++++++++ 3 files changed, 49 insertions(+), 29 deletions(-) diff --git a/src/api/uninstall.ts b/src/api/uninstall.ts index fdaa9ae85b..037fd78d34 100644 --- a/src/api/uninstall.ts +++ b/src/api/uninstall.ts @@ -29,8 +29,6 @@ export default async function uninstallCmd (pkgsToUninstall: string[], maybeOpts throw new Error('No package.json found - cannot uninstall') } - const pkg = ctx.pkg - if (opts.lock === false) { return run() } @@ -38,32 +36,30 @@ export default async function uninstallCmd (pkgsToUninstall: string[], maybeOpts return lock(ctx.storePath, run, {stale: opts.lockStaleDuration}) function run () { - return uninstallInContext(pkgsToUninstall, pkg, ctx, opts) + return uninstallInContext(pkgsToUninstall, ctx, opts) } }, {stale: opts.lockStaleDuration}) } -export async function uninstallInContext (pkgsToUninstall: string[], pkg: Package, ctx: PnpmContext, opts: StrictPnpmOptions) { - const saveType = getSaveType(opts) || 'dependencies' - if (saveType) { - const pkgJsonPath = path.join(ctx.root, 'package.json') - const pkg = await removeDeps(pkgJsonPath, pkgsToUninstall, saveType) - for (let depName in ctx.shrinkwrap.dependencies) { - if (!isDependentOn(pkg, depName)) { - delete ctx.shrinkwrap.dependencies[depName] - delete ctx.shrinkwrap.specifiers[depName] - } +export async function uninstallInContext (pkgsToUninstall: string[], ctx: PnpmContext, opts: StrictPnpmOptions) { + const pkgJsonPath = path.join(ctx.root, 'package.json') + const saveType = getSaveType(opts) + const pkg = await removeDeps(pkgJsonPath, pkgsToUninstall, saveType) + for (let depName in ctx.shrinkwrap.dependencies) { + if (!isDependentOn(pkg, depName)) { + delete ctx.shrinkwrap.dependencies[depName] + delete ctx.shrinkwrap.specifiers[depName] } - const newShr = await pruneShrinkwrap(ctx.shrinkwrap, pkg) - const removedPkgIds = await removeOrphanPkgs(ctx.privateShrinkwrap, newShr, ctx.root, ctx.storePath) - await saveShrinkwrap(ctx.root, newShr) - await saveModules(path.join(ctx.root, 'node_modules'), { - packageManager: `${pnpmPkgJson.name}@${pnpmPkgJson.version}`, - storePath: ctx.storePath, - skipped: Array.from(ctx.skipped).filter(pkgId => removedPkgIds.indexOf(pkgId) === -1), - }) - await removeOuterLinks(pkgsToUninstall, path.join(ctx.root, 'node_modules'), {storePath: ctx.storePath}) } + const newShr = await pruneShrinkwrap(ctx.shrinkwrap, pkg) + const removedPkgIds = await removeOrphanPkgs(ctx.privateShrinkwrap, newShr, ctx.root, ctx.storePath) + await saveShrinkwrap(ctx.root, newShr) + await saveModules(path.join(ctx.root, 'node_modules'), { + packageManager: `${pnpmPkgJson.name}@${pnpmPkgJson.version}`, + storePath: ctx.storePath, + skipped: Array.from(ctx.skipped).filter(pkgId => removedPkgIds.indexOf(pkgId) === -1), + }) + await removeOuterLinks(pkgsToUninstall, path.join(ctx.root, 'node_modules'), {storePath: ctx.storePath}) } function isDependentOn (pkg: Package, depName: string): boolean { diff --git a/src/removeDeps.ts b/src/removeDeps.ts index ca55d160e1..1d5c35a07e 100644 --- a/src/removeDeps.ts +++ b/src/removeDeps.ts @@ -1,21 +1,32 @@ import loadJsonFile = require('load-json-file') import writePkg = require('write-pkg') -import {DependenciesType} from './getSaveType' +import {DependenciesType, dependenciesTypes} from './getSaveType' import {Package} from './types' export default async function ( pkgJsonPath: string, removedPackages: string[], - saveType: DependenciesType + saveType?: DependenciesType ): Promise { const packageJson = await loadJsonFile(pkgJsonPath) - packageJson[saveType] = packageJson[saveType] - if (!packageJson[saveType]) return packageJson + if (saveType) { + packageJson[saveType] = packageJson[saveType] - removedPackages.forEach(dependency => { - delete packageJson[saveType][dependency] - }) + if (!packageJson[saveType]) return packageJson + + removedPackages.forEach(dependency => { + delete packageJson[saveType][dependency] + }) + } else { + dependenciesTypes + .filter(deptype => packageJson[deptype]) + .forEach(deptype => { + removedPackages.forEach(dependency => { + delete packageJson[deptype][dependency] + }) + }) + } await writePkg(pkgJsonPath, packageJson) return packageJson diff --git a/test/uninstall.ts b/test/uninstall.ts index 2e88f66f2d..d83701da0f 100644 --- a/test/uninstall.ts +++ b/test/uninstall.ts @@ -35,6 +35,19 @@ test('uninstall package with no dependencies', async function (t) { t.equal(pkgJson.dependencies, undefined, 'is-negative has been removed from dependencies') }) +test('uninstall package and remove from appropriate property', async function (t: tape.Test) { + const project = prepare(t) + await installPkgs(['is-negative@2.1.0'], testDefaults({ saveDev: true })) + await uninstall(['is-negative'], testDefaults()) + + await project.storeHasNot('is-negative', '2.1.0') + + await project.hasNot('is-negative') + + const pkgJson = await readPkg() + t.equal(pkgJson.dependencies, undefined, 'is-negative has been removed from dependencies') +}) + test('uninstall scoped package', async function (t) { const project = prepare(t) await installPkgs(['@zkochan/logger@0.1.0'], testDefaults({ save: true }))