@@ -13,14 +13,29 @@ export class NodePackageManager implements INodePackageManager {
1313 private static NPM_LOAD_FAILED = "Failed to retrieve data from npm. Please try again a little bit later." ;
1414 private static NPM_REGISTRY_URL = "http://registry.npmjs.org/" ;
1515
16+ private versionsCache : IDictionary < string [ ] > ;
17+ private isLoaded : boolean ;
18+
1619 constructor ( private $logger : ILogger ,
1720 private $errors : IErrors ,
1821 private $httpClient : Server . IHttpClient ,
1922 private $staticConfig : IStaticConfig ,
20- private $fs : IFileSystem ) { }
23+ private $fs : IFileSystem ) {
24+ this . versionsCache = { } ;
25+ }
2126
22- public get cache ( ) : string {
23- return npm . cache ;
27+ public getCacheRootPath ( ) : IFuture < string > {
28+ return ( ( ) => {
29+ this . load ( ) . wait ( ) ;
30+ return npm . cache ;
31+ } ) . future < string > ( ) ( ) ;
32+ }
33+
34+ public addToCache ( packageName : string ) : IFuture < void > {
35+ return ( ( ) => {
36+ this . load ( ) . wait ( ) ;
37+ this . addToCacheCore ( packageName ) . wait ( ) ;
38+ } ) . future < void > ( ) ( ) ;
2439 }
2540
2641 public load ( config ?: any ) : IFuture < void > {
@@ -39,6 +54,7 @@ export class NodePackageManager implements INodePackageManager {
3954 return ( ( ) => {
4055 try {
4156 this . load ( ) . wait ( ) ; // It's obligatory to execute load before whatever npm function
57+
4258 var packageToInstall = packageName ;
4359 var pathToSave = ( opts && opts . pathToSave ) || npm . cache ;
4460 var version = ( opts && opts . version ) || null ;
@@ -62,6 +78,14 @@ export class NodePackageManager implements INodePackageManager {
6278 } ) . future < string > ( ) ( ) ;
6379 }
6480
81+ public getLatestVersion ( packageName : string ) : IFuture < string > {
82+ return ( ( ) => {
83+ var versions = this . getAvailableVersions ( packageName ) . wait ( ) ;
84+ versions = _ . sortBy ( versions , ( ver : string ) => { return ver ; } ) ;
85+ return versions . reverse ( ) [ 0 ] ;
86+ } ) . future < string > ( ) ( ) ;
87+ }
88+
6589 private installCore ( packageName : string , pathToSave : string , isSemanticVersioningDisabled : boolean ) : IFuture < void > {
6690 var currentVersion = this . $staticConfig . version ;
6791 if ( ! semver . valid ( currentVersion ) ) {
@@ -89,12 +113,28 @@ export class NodePackageManager implements INodePackageManager {
89113 return future ;
90114 }
91115
116+ private addToCacheCore ( packageName : string ) : IFuture < void > {
117+ var future = new Future < void > ( ) ;
118+ npm . commands [ "cache" ] . add ( packageName , ( err : Error , data : any ) => {
119+ if ( err ) {
120+ future . throw ( err ) ;
121+ } else {
122+ future . return ( ) ;
123+ }
124+ } ) ;
125+ return future ;
126+ }
127+
92128 private getAvailableVersions ( packageName : string ) : IFuture < string [ ] > {
93129 return ( ( ) => {
94- var url = NodePackageManager . NPM_REGISTRY_URL + packageName ;
95- var response = this . $httpClient . httpRequest ( url ) . wait ( ) . body ;
96- var json = JSON . parse ( response ) ;
97- return _ . keys ( json . versions ) ;
130+ if ( ! this . versionsCache [ packageName ] ) {
131+ var url = NodePackageManager . NPM_REGISTRY_URL + packageName ;
132+ var response = this . $httpClient . httpRequest ( url ) . wait ( ) . body ;
133+ var json = JSON . parse ( response ) ;
134+ this . versionsCache [ packageName ] = _ . keys ( json . versions ) ;
135+ }
136+
137+ return this . versionsCache [ packageName ] ;
98138 } ) . future < string [ ] > ( ) ( ) ;
99139 }
100140
0 commit comments