Skip to content

Commit b6823f7

Browse files
petekanevrosen-vladimirov
authored andcommitted
implement package.json rollback if npm installation fails (#2536)
throw error when npm-installation-manager install fails
1 parent fab5a22 commit b6823f7

File tree

3 files changed

+8
-5
lines changed

3 files changed

+8
-5
lines changed

lib/node-package-manager.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ export class NodePackageManager implements INodePackageManager {
2424
config["ignore-scripts"] = true;
2525
}
2626

27-
let jsonContentBefore = this.$fs.readJson(path.join(pathToSave, "package.json"));
27+
let packageJsonPath = path.join(pathToSave, "package.json");
28+
let jsonContentBefore = this.$fs.readJson(packageJsonPath);
2829
let dependenciesBefore = _.keys(jsonContentBefore.dependencies).concat(_.keys(jsonContentBefore.devDependencies));
2930

3031
let flags = this.getFlagsString(config, true);
@@ -54,6 +55,8 @@ export class NodePackageManager implements INodePackageManager {
5455
this.$logger.warn(err.message);
5556
} else {
5657
// All other errors should be handled by the caller code.
58+
// Revert package.json contents to preserve valid state
59+
this.$fs.writeJson(packageJsonPath, jsonContentBefore);
5760
throw err;
5861
}
5962
}

lib/npm-installation-manager.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ import * as semver from "semver";
33
import * as constants from "./constants";
44

55
export class NpmInstallationManager implements INpmInstallationManager {
6-
private static NPM_LOAD_FAILED = "Failed to retrieve data from npm. Please try again a little bit later.";
7-
86
constructor(private $npm: INodePackageManager,
97
private $childProcess: IChildProcess,
108
private $logger: ILogger,
@@ -52,7 +50,8 @@ export class NpmInstallationManager implements INpmInstallationManager {
5250
return this.installCore(packageToInstall, pathToSave, version, dependencyType).wait();
5351
} catch (error) {
5452
this.$logger.debug(error);
55-
this.$errors.fail("%s. Error: %s", NpmInstallationManager.NPM_LOAD_FAILED, error);
53+
54+
throw new Error(error);
5655
}
5756

5857
}).future<string>()();

lib/services/platform-service.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,10 @@ export class PlatformService implements IPlatformService {
9494
}
9595

9696
let spinner = new clui.Spinner("Installing " + packageToInstall);
97+
let projectDir = this.$projectData.projectDir;
9798
try {
9899
spinner.start();
99-
let downloadedPackagePath = this.$npmInstallationManager.install(packageToInstall, this.$projectData.projectDir, npmOptions).wait();
100+
let downloadedPackagePath = this.$npmInstallationManager.install(packageToInstall, projectDir, npmOptions).wait();
100101
let frameworkDir = path.join(downloadedPackagePath, constants.PROJECT_FRAMEWORK_FOLDER_NAME);
101102
frameworkDir = path.resolve(frameworkDir);
102103

0 commit comments

Comments
 (0)