Skip to content

Commit 1d1a894

Browse files
committed
ensure transitive dependencies are removed when doing kpm uninstall - fixes #74
1 parent d9aebcd commit 1d1a894

File tree

1 file changed

+31
-9
lines changed

1 file changed

+31
-9
lines changed

src/cli/commands/uninstall.js

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,12 @@ export async function run(
4949

5050
// install all modules to ensure we have a consistent state
5151
reporter.step(++step, totalSteps, "Installing modules");
52-
await runInstall();
52+
let install = await runInstall();
5353

5454
// remove
5555
for (let name of args) {
5656
let loc = path.join("node_modules", name);
57+
let range;
5758
reporter.step(++step, totalSteps, `Removing module ${name}`);
5859

5960
// check that it's there
@@ -67,24 +68,45 @@ export async function run(
6768
await fs.unlink(path.join("node_modules", ".bin", binName));
6869
}
6970

70-
// remove entire package
71-
await fs.unlink(loc);
72-
7371
// remove from `package.json`
7472
for (let type of ["devDependencies", "dependencies", "optionalDependencies"]) {
7573
let deps = json[type];
76-
if (deps) delete deps[name];
74+
if (deps) {
75+
range = deps[name];
76+
delete deps[name];
77+
}
7778
}
78-
}
7979

80-
// TODO remove packages from mirror, this is tricky since we'd also want transitive
81-
// dependencies
80+
// remove entire package
81+
let locs = [];
82+
if (range) {
83+
// add all transitive dependencies locations
84+
addSub(`${name}@${range}`);
85+
86+
function addSub(pattern) {
87+
let pkg = install.resolver.getResolvedPattern(pattern);
88+
if (!pkg) return; // TODO could possibly throw an error?
89+
90+
locs.push(config.generateHardModulePath(pkg.reference));
91+
92+
for (let key in pkg.dependencies) {
93+
addSub(`${key}@${pkg.dependencies[key]}`);
94+
}
95+
}
96+
} else {
97+
// doesn't look like this was in package.json so we don't have a pattern to seed
98+
// the search
99+
locs.push(loc);
100+
}
101+
102+
for (let loc of locs) await fs.unlink(loc);
103+
}
82104

83105
// save package.json
84106
await fs.writeFile(jsonLoc, stringify(json) + "\n");
85107

86108
// reinstall so we can get the updated lockfile
87-
reporter.step(++step, totalSteps, "Regenerating lockfile");
109+
reporter.step(++step, totalSteps, "Regenerating lockfile and installing missing dependencies");
88110
await runInstall();
89111

90112
//

0 commit comments

Comments
 (0)