-
-
Notifications
You must be signed in to change notification settings - Fork 197
/
Copy pathupdate-controller-base.ts
85 lines (71 loc) · 3.37 KB
/
update-controller-base.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import * as path from "path";
import * as semver from "semver";
export class UpdateControllerBase {
protected getPackageManifest: Function;
constructor(protected $fs: IFileSystem,
protected $platformCommandHelper: IPlatformCommandHelper,
protected $platformsDataService: IPlatformsDataService,
protected $packageInstallationManager: IPackageInstallationManager,
protected $packageManager: IPackageManager,
protected $pacoteService: IPacoteService) {
this.getPackageManifest = _.memoize(this._getPackageManifest, (...args) => {
return args.join("@");
});
}
protected restoreBackup(folders: string[], backupDir: string, projectDir: string): void {
for (const folder of folders) {
this.$fs.deleteDirectory(path.join(projectDir, folder));
const folderToCopy = path.join(backupDir, folder);
if (this.$fs.exists(folderToCopy)) {
this.$fs.copyFile(folderToCopy, projectDir);
}
}
}
protected backup(folders: string[], backupDir: string, projectDir: string): void {
this.$fs.deleteDirectory(backupDir);
this.$fs.createDirectory(backupDir);
for (const folder of folders) {
const folderToCopy = path.join(projectDir, folder);
if (this.$fs.exists(folderToCopy)) {
this.$fs.copyFile(folderToCopy, backupDir);
}
}
}
protected hasDependency(dependency: IDependency, projectData: IProjectData): boolean {
const devDependencies = projectData.devDependencies;
const dependencies = projectData.dependencies;
return (dependencies && dependencies[dependency.packageName]) || (devDependencies && devDependencies[dependency.packageName]);
}
protected hasRuntimeDependency({ platform, projectData }: { platform: string, projectData: IProjectData }): boolean {
const lowercasePlatform = platform.toLowerCase();
const currentPlatformVersion = this.$platformCommandHelper.getCurrentPlatformVersion(lowercasePlatform, projectData);
return !!currentPlatformVersion;
}
protected async getMaxRuntimeVersion({ platform, projectData }: { platform: string, projectData: IProjectData }) {
const lowercasePlatform = platform.toLowerCase();
const currentPlatformVersion = this.$platformCommandHelper.getCurrentPlatformVersion(lowercasePlatform, projectData);
const platformData = this.$platformsDataService.getPlatformData(lowercasePlatform, projectData);
if (currentPlatformVersion) {
return await this.getMaxDependencyVersion(platformData.frameworkPackageName, currentPlatformVersion) || currentPlatformVersion;
}
}
protected async getMaxDependencyVersion(dependency: string, version: string): Promise<string> {
let maxDependencyVersion;
if (semver.valid(version)) {
maxDependencyVersion = version;
} else if (semver.validRange(version)) {
maxDependencyVersion = await this.$packageInstallationManager.maxSatisfyingVersion(dependency, version);
} else {
maxDependencyVersion = await this.$packageManager.getTagVersion(dependency, version);
}
return maxDependencyVersion;
}
private async _getPackageManifest(templateName: string, version: string): Promise<any> {
const packageVersion = semver.valid(version) || await this.$packageManager.getTagVersion(templateName, version);
if (packageVersion && semver.valid(packageVersion)) {
return await this.$pacoteService.manifest(`${templateName}@${packageVersion}`, { fullMetadata: true });
} else {
throw new Error(`Failed to get information for package: ${templateName}@${version}`);
}
}
}