@@ -22,6 +22,7 @@ import {
2222 fetchPackageManifest ,
2323 fetchPackageMetadata ,
2424} from '../utilities/package-metadata' ;
25+ import { Spinner } from '../utilities/spinner' ;
2526import { Schema as AddCommandSchema } from './add' ;
2627
2728const npa = require ( 'npm-package-arg' ) ;
@@ -79,12 +80,18 @@ export class AddCommand extends SchematicCommand<AddCommandSchema> {
7980 }
8081 }
8182
83+ const spinner = new Spinner ( ) ;
84+
85+ spinner . start ( 'Determining package manager...' ) ;
8286 const packageManager = await getPackageManager ( this . context . root ) ;
8387 const usingYarn = packageManager === PackageManager . Yarn ;
88+ spinner . info ( `Using package manager: ${ colors . grey ( packageManager ) } ` ) ;
8489
8590 if ( packageIdentifier . type === 'tag' && ! packageIdentifier . rawSpec ) {
8691 // only package name provided; search for viable version
8792 // plus special cases for packages that did not have peer deps setup
93+ spinner . start ( 'Searching for compatible package version...' ) ;
94+
8895 let packageMetadata ;
8996 try {
9097 packageMetadata = await fetchPackageMetadata ( packageIdentifier . name , this . logger , {
@@ -93,7 +100,7 @@ export class AddCommand extends SchematicCommand<AddCommandSchema> {
93100 verbose : options . verbose ,
94101 } ) ;
95102 } 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 ) ;
97104
98105 return 1 ;
99106 }
@@ -111,7 +118,10 @@ export class AddCommand extends SchematicCommand<AddCommandSchema> {
111118 ) {
112119 packageIdentifier = npa . resolve ( '@angular/pwa' , '0.12' ) ;
113120 }
121+ } else {
122+ packageIdentifier = npa . resolve ( latestManifest . name , latestManifest . version ) ;
114123 }
124+ spinner . succeed ( `Found compatible package version: ${ colors . grey ( packageIdentifier ) } .` ) ;
115125 } else if ( ! latestManifest || ( await this . hasMismatchedPeer ( latestManifest ) ) ) {
116126 // 'latest' is invalid so search for most recent matching package
117127 const versionManifests = Object . values ( packageMetadata . versions ) . filter (
@@ -129,17 +139,22 @@ export class AddCommand extends SchematicCommand<AddCommandSchema> {
129139 }
130140
131141 if ( ! newIdentifier ) {
132- this . logger . warn ( "Unable to find compatible package. Using 'latest'." ) ;
142+ spinner . warn ( "Unable to find compatible package. Using 'latest'." ) ;
133143 } else {
134144 packageIdentifier = newIdentifier ;
145+ spinner . succeed ( `Found compatible package version: ${ colors . grey ( packageIdentifier ) } .` ) ;
135146 }
147+ } else {
148+ packageIdentifier = npa . resolve ( latestManifest . name , latestManifest . version ) ;
149+ spinner . succeed ( `Found compatible package version: ${ colors . grey ( packageIdentifier ) } .` ) ;
136150 }
137151 }
138152
139153 let collectionName = packageIdentifier . name ;
140154 let savePackage : NgAddSaveDepedency | undefined ;
141155
142156 try {
157+ spinner . start ( 'Loading package information from registry...' ) ;
143158 const manifest = await fetchPackageManifest ( packageIdentifier , this . logger , {
144159 registry : options . registry ,
145160 verbose : options . verbose ,
@@ -150,41 +165,51 @@ export class AddCommand extends SchematicCommand<AddCommandSchema> {
150165 collectionName = manifest . name ;
151166
152167 if ( await this . hasMismatchedPeer ( manifest ) ) {
153- this . logger . warn (
168+ spinner . warn (
154169 'Package has unmet peer dependencies. Adding the package may not succeed.' ,
155170 ) ;
171+ } else {
172+ spinner . succeed ( `Package information loaded.` ) ;
156173 }
157174 } 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 } ` ) ;
159176
160177 return 1 ;
161178 }
162179
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+ ) ;
178197
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 ;
188213 }
189214
190215 return this . executeSchematic ( collectionName , options [ '--' ] ) ;
0 commit comments