Skip to content

Commit 9de0c55

Browse files
FatmeFatme Havaluova
authored and
Fatme Havaluova
committed
Fix ENOENT error when add ios platform
1 parent 7211fc7 commit 9de0c55

File tree

6 files changed

+137
-4
lines changed

6 files changed

+137
-4
lines changed

lib/declarations.ts

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ interface INpmInstallationManager {
1515
cacheUnpack(packageName: string, version: string, unpackTarget?: string): IFuture<void>;
1616
install(packageName: string, options?: INpmInstallOptions): IFuture<string>;
1717
getLatestVersion(packageName: string): IFuture<string>;
18+
getLatestCompatibleVersion(packageName: string): IFuture<string>;
1819
getCachedPackagePath(packageName: string, version: string): string;
1920
addCleanCopyToCache(packageName: string, version: string): IFuture<void>;
2021
}

lib/npm-installation-manager.ts

+35-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ import semver = require("semver");
66
import * as npm from "npm";
77
import * as constants from "./constants";
88

9+
interface IVersionData {
10+
major: string;
11+
minor: string;
12+
patch: string;
13+
}
14+
915
export class NpmInstallationManager implements INpmInstallationManager {
1016
private static NPM_LOAD_FAILED = "Failed to retrieve data from npm. Please try again a little bit later.";
1117
private versionsCache: IDictionary<string[]>;
@@ -20,7 +26,8 @@ export class NpmInstallationManager implements INpmInstallationManager {
2026
private $lockfile: ILockFile,
2127
private $errors: IErrors,
2228
private $options: IOptions,
23-
private $fs: IFileSystem) {
29+
private $fs: IFileSystem,
30+
private $staticConfig: IStaticConfig) {
2431
this.versionsCache = {};
2532
this.$npm.load().wait();
2633
}
@@ -63,6 +70,27 @@ export class NpmInstallationManager implements INpmInstallationManager {
6370
}).future<string>()();
6471
}
6572

73+
public getLatestCompatibleVersion(packageName: string): IFuture<string> {
74+
return (() => {
75+
let latestVersion = this.getLatestVersion(packageName).wait();
76+
let data = this.$npm.view(packageName, "versions").wait();
77+
let versions: string[] = data[latestVersion].versions;
78+
79+
let versionData = this.getVersionData(this.$staticConfig.version);
80+
81+
let compatibleVersions = _(versions)
82+
.map(ver => this.getVersionData(ver))
83+
.filter(verData => versionData.major === verData.major && versionData.minor === verData.minor)
84+
.sortBy(verData => verData.patch)
85+
.value();
86+
87+
let result = _.last(compatibleVersions);
88+
89+
let latestCompatibleVersion = `${result.major}.${result.minor}.${result.patch}`;
90+
return latestCompatibleVersion;
91+
}).future<string>()();
92+
}
93+
6694
public install(packageName: string, opts?: INpmInstallOptions): IFuture<string> {
6795
return (() => {
6896
this.$lockfile.lock().wait();
@@ -131,7 +159,7 @@ export class NpmInstallationManager implements INpmInstallationManager {
131159
}
132160
return this.$options.frameworkPath;
133161
} else {
134-
version = version || this.getLatestVersion(packageName).wait();
162+
version = version || this.getLatestCompatibleVersion(packageName).wait();
135163
let packagePath = this.getCachedPackagePath(packageName, version);
136164
this.addToCache(packageName, version).wait();
137165
return packagePath;
@@ -163,5 +191,10 @@ export class NpmInstallationManager implements INpmInstallationManager {
163191
return this.$fs.exists(directory).wait() && this.$fs.enumerateFilesInDirectorySync(directory).length > 0;
164192
}).future<boolean>()();
165193
}
194+
195+
private getVersionData(version: string): IVersionData {
196+
let [ major, minor, patch ] = version.split(".");
197+
return { major, minor, patch };
198+
}
166199
}
167200
$injector.register("npmInstallationManager", NpmInstallationManager);

lib/services/init-service.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ export class InitService implements IInitService {
9999

100100
private getVersionData(packageName: string): IFuture<IStringDictionary> {
101101
return (() => {
102-
let latestVersion = this.$npmInstallationManager.getLatestVersion(packageName).wait();
102+
let latestVersion = this.$npmInstallationManager.getLatestCompatibleVersion(packageName).wait();
103103
if(this.useDefaultValue) {
104104
return this.buildVersionData(latestVersion);
105105
}

test/npm-installation-manager.ts

+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/// <reference path=".d.ts" />
2+
"use strict";
3+
4+
import {assert} from "chai";
5+
import * as ConfigLib from "../lib/config";
6+
import * as ErrorsLib from "../lib/common/errors";
7+
import * as FsLib from "../lib/common/file-system";
8+
import * as HostInfoLib from "../lib/common/host-info";
9+
import * as LoggerLib from "../lib/common/logger";
10+
import * as NpmInstallationManagerLib from "../lib/npm-installation-manager";
11+
import * as OptionsLib from "../lib/options";
12+
import * as StaticConfigLib from "../lib/config";
13+
14+
import Future = require("fibers/future");
15+
import yok = require("../lib/common/yok");
16+
17+
function createTestInjector(): IInjector {
18+
let testInjector = new yok.Yok();
19+
20+
testInjector.register("config", ConfigLib.Configuration);
21+
testInjector.register("logger", LoggerLib.Logger);
22+
testInjector.register("lockfile", { });
23+
testInjector.register("errors", ErrorsLib.Errors);
24+
testInjector.register("options", OptionsLib.Options);
25+
testInjector.register("fs", FsLib.FileSystem);
26+
testInjector.register("hostInfo", HostInfoLib.HostInfo);
27+
testInjector.register("staticConfig", StaticConfigLib.StaticConfig);
28+
29+
testInjector.register("npmInstallationManager", NpmInstallationManagerLib.NpmInstallationManager);
30+
31+
return testInjector;
32+
}
33+
34+
function mockNpm(testInjector: IInjector, versions: string[], latestVersion: string) {
35+
testInjector.register("npm", {
36+
view: (packageName: string, propertyName: string) => {
37+
return (() => {
38+
if(propertyName === "versions") {
39+
let result = Object.create(null);
40+
result[latestVersion] = {
41+
"versions": versions
42+
};
43+
44+
return result;
45+
}
46+
47+
throw new Error(`Unable to find propertyName ${propertyName}.`);
48+
}).future<any>()();
49+
},
50+
load: () => Future.fromResult()
51+
});
52+
}
53+
54+
describe("Npm installation manager tests", () => {
55+
it("returns correct latest compatible version when only one exists", () => {
56+
let testInjector = createTestInjector();
57+
58+
let versions = ["1.4.0"];
59+
let latestVersion = "1.4.0";
60+
61+
mockNpm(testInjector, versions, latestVersion);
62+
63+
// Mock staticConfig.version
64+
let staticConfig = testInjector.resolve("staticConfig");
65+
staticConfig.version = "1.4.0";
66+
67+
// Mock npmInstallationManager.getLatestVersion
68+
let npmInstallationManager = testInjector.resolve("npmInstallationManager");
69+
npmInstallationManager.getLatestVersion = (packageName: string) => Future.fromResult(latestVersion);
70+
71+
let actualLatestCompatibleVersion = npmInstallationManager.getLatestCompatibleVersion("").wait();
72+
let expectedLatestCompatibleVersion = "1.4.0";
73+
assert.equal(actualLatestCompatibleVersion, expectedLatestCompatibleVersion);
74+
});
75+
it("returns correct latest compatible version", () => {
76+
let testInjector = createTestInjector();
77+
78+
let versions = ["1.2.0", "1.3.0", "1.3.1", "1.3.2", "1.3.3", "1.4.0"];
79+
let latestVersion = "1.3.3";
80+
81+
mockNpm(testInjector, versions, latestVersion);
82+
83+
// Mock staticConfig.version
84+
let staticConfig = testInjector.resolve("staticConfig");
85+
staticConfig.version = "1.3.0";
86+
87+
// Mock npmInstallationManager.getLatestVersion
88+
let npmInstallationManager = testInjector.resolve("npmInstallationManager");
89+
npmInstallationManager.getLatestVersion = (packageName: string) => Future.fromResult(latestVersion);
90+
91+
let actualLatestCompatibleVersion = npmInstallationManager.getLatestCompatibleVersion("").wait();
92+
let expectedLatestCompatibleVersion = "1.3.3";
93+
assert.equal(actualLatestCompatibleVersion, expectedLatestCompatibleVersion);
94+
});
95+
});

test/stubs.ts

+4
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,10 @@ export class NpmInstallationManagerStub implements INpmInstallationManager {
223223
return Future.fromResult("");
224224
}
225225

226+
getLatestCompatibleVersion(packageName: string): IFuture<string> {
227+
return Future.fromResult("");
228+
}
229+
226230
getCachedPackagePath(packageName: string, version: string): string {
227231
return "";
228232
}

0 commit comments

Comments
 (0)