@@ -22,6 +22,7 @@ import {
22
22
fetchPackageManifest ,
23
23
fetchPackageMetadata ,
24
24
} from '../utilities/package-metadata' ;
25
+ import { Spinner } from '../utilities/spinner' ;
25
26
import { Schema as AddCommandSchema } from './add' ;
26
27
27
28
const npa = require ( 'npm-package-arg' ) ;
@@ -79,12 +80,18 @@ export class AddCommand extends SchematicCommand<AddCommandSchema> {
79
80
}
80
81
}
81
82
83
+ const spinner = new Spinner ( ) ;
84
+
85
+ spinner . start ( 'Determining package manager...' ) ;
82
86
const packageManager = await getPackageManager ( this . context . root ) ;
83
87
const usingYarn = packageManager === PackageManager . Yarn ;
88
+ spinner . info ( `Using package manager: ${ colors . grey ( packageManager ) } ` ) ;
84
89
85
90
if ( packageIdentifier . type === 'tag' && ! packageIdentifier . rawSpec ) {
86
91
// only package name provided; search for viable version
87
92
// plus special cases for packages that did not have peer deps setup
93
+ spinner . start ( 'Searching for compatible package version...' ) ;
94
+
88
95
let packageMetadata ;
89
96
try {
90
97
packageMetadata = await fetchPackageMetadata ( packageIdentifier . name , this . logger , {
@@ -93,7 +100,7 @@ export class AddCommand extends SchematicCommand<AddCommandSchema> {
93
100
verbose : options . verbose ,
94
101
} ) ;
95
102
} catch ( e ) {
96
- this . logger . error ( 'Unable to fetch package metadata : ' + e . message ) ;
103
+ spinner . fail ( 'Unable to load package information from registry : ' + e . message ) ;
97
104
98
105
return 1 ;
99
106
}
@@ -111,7 +118,10 @@ export class AddCommand extends SchematicCommand<AddCommandSchema> {
111
118
) {
112
119
packageIdentifier = npa . resolve ( '@angular/pwa' , '0.12' ) ;
113
120
}
121
+ } else {
122
+ packageIdentifier = npa . resolve ( latestManifest . name , latestManifest . version ) ;
114
123
}
124
+ spinner . succeed ( `Found compatible package version: ${ colors . grey ( packageIdentifier ) } .` ) ;
115
125
} else if ( ! latestManifest || ( await this . hasMismatchedPeer ( latestManifest ) ) ) {
116
126
// 'latest' is invalid so search for most recent matching package
117
127
const versionManifests = Object . values ( packageMetadata . versions ) . filter (
@@ -129,17 +139,22 @@ export class AddCommand extends SchematicCommand<AddCommandSchema> {
129
139
}
130
140
131
141
if ( ! newIdentifier ) {
132
- this . logger . warn ( "Unable to find compatible package. Using 'latest'." ) ;
142
+ spinner . warn ( "Unable to find compatible package. Using 'latest'." ) ;
133
143
} else {
134
144
packageIdentifier = newIdentifier ;
145
+ spinner . succeed ( `Found compatible package version: ${ colors . grey ( packageIdentifier ) } .` ) ;
135
146
}
147
+ } else {
148
+ packageIdentifier = npa . resolve ( latestManifest . name , latestManifest . version ) ;
149
+ spinner . succeed ( `Found compatible package version: ${ colors . grey ( packageIdentifier ) } .` ) ;
136
150
}
137
151
}
138
152
139
153
let collectionName = packageIdentifier . name ;
140
154
let savePackage : NgAddSaveDepedency | undefined ;
141
155
142
156
try {
157
+ spinner . start ( 'Loading package information from registry...' ) ;
143
158
const manifest = await fetchPackageManifest ( packageIdentifier , this . logger , {
144
159
registry : options . registry ,
145
160
verbose : options . verbose ,
@@ -150,41 +165,51 @@ export class AddCommand extends SchematicCommand<AddCommandSchema> {
150
165
collectionName = manifest . name ;
151
166
152
167
if ( await this . hasMismatchedPeer ( manifest ) ) {
153
- this . logger . warn (
168
+ spinner . warn (
154
169
'Package has unmet peer dependencies. Adding the package may not succeed.' ,
155
170
) ;
171
+ } else {
172
+ spinner . succeed ( `Package information loaded.` ) ;
156
173
}
157
174
} catch ( e ) {
158
- this . logger . error ( ' Unable to fetch package manifest: ' + e . message ) ;
175
+ spinner . fail ( ` Unable to fetch package information for ' ${ packageIdentifier } ': ${ e . message } ` ) ;
159
176
160
177
return 1 ;
161
178
}
162
179
163
- if ( savePackage === false ) {
164
- // Temporary packages are located in a different directory
165
- // Hence we need to resolve them using the temp path
166
- const tempPath = installTempPackage (
167
- packageIdentifier . raw ,
168
- this . logger ,
169
- packageManager ,
170
- options . registry ? [ `--registry="${ options . registry } "` ] : undefined ,
171
- ) ;
172
- const resolvedCollectionPath = require . resolve (
173
- join ( collectionName , 'package.json' ) ,
174
- {
175
- paths : [ tempPath ] ,
176
- } ,
177
- ) ;
180
+ try {
181
+ spinner . start ( 'Installing package...' ) ;
182
+ if ( savePackage === false ) {
183
+ // Temporary packages are located in a different directory
184
+ // Hence we need to resolve them using the temp path
185
+ const tempPath = installTempPackage (
186
+ packageIdentifier . raw ,
187
+ undefined ,
188
+ packageManager ,
189
+ options . registry ? [ `--registry="${ options . registry } "` ] : undefined ,
190
+ ) ;
191
+ const resolvedCollectionPath = require . resolve (
192
+ join ( collectionName , 'package.json' ) ,
193
+ {
194
+ paths : [ tempPath ] ,
195
+ } ,
196
+ ) ;
178
197
179
- collectionName = dirname ( resolvedCollectionPath ) ;
180
- } else {
181
- installPackage (
182
- packageIdentifier . raw ,
183
- this . logger ,
184
- packageManager ,
185
- savePackage ,
186
- options . registry ? [ `--registry="${ options . registry } "` ] : undefined ,
187
- ) ;
198
+ collectionName = dirname ( resolvedCollectionPath ) ;
199
+ } else {
200
+ installPackage (
201
+ packageIdentifier . raw ,
202
+ undefined ,
203
+ packageManager ,
204
+ savePackage ,
205
+ options . registry ? [ `--registry="${ options . registry } "` ] : undefined ,
206
+ ) ;
207
+ }
208
+ spinner . succeed ( 'Package successfully installed.' ) ;
209
+ } catch ( error ) {
210
+ spinner . fail ( `Package installation failed: ${ error . message } ` ) ;
211
+
212
+ return 1 ;
188
213
}
189
214
190
215
return this . executeSchematic ( collectionName , options [ '--' ] ) ;
0 commit comments