@@ -25,8 +25,15 @@ export class NodePackageManager implements INodePackageManager {
25
25
try {
26
26
let subDirsBefore :Array < string > = this . $fs . exists ( path . join ( pathToSave , "node_modules" ) ) . wait ( ) ? this . $fs . readDirectory ( path . join ( pathToSave , "node_modules" ) ) . wait ( ) : [ ] ;
27
27
28
- let flags = this . getFlagsString ( config ) ;
29
- this . $childProcess . exec ( `npm install ${ packageName } ${ flags } ` , { cwd : pathToSave } ) . wait ( ) ;
28
+ let flags = this . getFlagsString ( config , true ) ;
29
+ let params = [ "install" , packageName ] ;
30
+ for ( let index in flags ) {
31
+ params . push ( flags [ index ] ) ;
32
+ }
33
+ let res = this . $childProcess . spawnFromEvent ( "npm" , params , "close" , { } , { throwError : false } ) . wait ( ) ;
34
+ if ( res . stderr ) {
35
+ throw { stderr : res . stderr } ;
36
+ }
30
37
31
38
let subDirsAfter = this . $fs . readDirectory ( path . join ( pathToSave , "node_modules" ) ) . wait ( ) ;
32
39
@@ -43,7 +50,7 @@ export class NodePackageManager implements INodePackageManager {
43
50
44
51
return diff ;
45
52
} catch ( err ) {
46
- if ( err . code === "EPEERINVALID" || err . code === 1 ) {
53
+ if ( err . stderr && err . stderr . indexOf ( "EPEERINVALID" ) !== - 1 ) {
47
54
// Not installed peer dependencies are treated by npm 2 as errors, but npm 3 treats them as warnings.
48
55
// We'll show them as warnings and let the user install them in case they are needed.
49
56
// The strucutre of the error object in such case is:
@@ -63,7 +70,7 @@ export class NodePackageManager implements INodePackageManager {
63
70
// '@ngrx/[email protected] ': '^2.0.0',
64
71
// '@ngrx/[email protected] ': '^2.0.0',
65
72
// '[email protected] ': '~2.0.0' } }
66
- this . $logger . warn ( err . message ) ;
73
+ this . $logger . warn ( err . stderr ) ;
67
74
} else {
68
75
// All other errors should be handled by the caller code.
69
76
throw err ;
@@ -72,7 +79,7 @@ export class NodePackageManager implements INodePackageManager {
72
79
}
73
80
74
81
public uninstall ( packageName : string , config ?: any , path ?: string ) : IFuture < any > {
75
- let flags = this . getFlagsString ( config ) ;
82
+ let flags = this . getFlagsString ( config , false ) ;
76
83
return this . $childProcess . exec ( `npm uninstall ${ packageName } ${ flags } ` , { cwd : path } ) ;
77
84
}
78
85
@@ -82,23 +89,27 @@ export class NodePackageManager implements INodePackageManager {
82
89
}
83
90
84
91
public view ( packageName : string , config : any ) : IFuture < any > {
85
- let flags = this . getFlagsString ( config ) ;
92
+ let flags = this . getFlagsString ( config , false ) ;
86
93
let viewResult = this . $childProcess . exec ( `npm view ${ packageName } ${ flags } ` ) . wait ( ) ;
87
94
return JSON . parse ( viewResult ) ;
88
95
}
89
96
90
- private getFlagsString ( config : any ) : string {
91
- let flagsString = "" ;
97
+ private getFlagsString ( config : any , asArray : boolean ) : any {
98
+ let array : Array < string > = [ ] ;
92
99
for ( let flag in config ) {
93
100
if ( config [ flag ] ) {
94
101
if ( flag === "dist-tags" || flag === "versions" ) {
95
- flagsString += ` ${ flag } ` ;
102
+ array . push ( ` ${ flag } ` )
96
103
continue ;
97
104
}
98
- flagsString += ` --${ flag } `;
105
+ array . push ( ` --${ flag } `)
99
106
}
100
107
}
101
- return flagsString ;
108
+ if ( asArray ) {
109
+ return array ;
110
+ }
111
+
112
+ return array . join ( " " ) ;
102
113
}
103
114
}
104
115
$injector . register ( "npm" , NodePackageManager ) ;
0 commit comments