import { ServiceManager } from '../serviceManager' ; import * as Debug from 'debug' ; import { Feature } from '../featureManager' ; import { Transport } from '../services/transport' ; import Configuration from '../configuration' ; import { readFile } from 'fs' ; type PkgDependencies = { [ name ] : string ; } ; type DependencyList = { [ name ] : { version : string ; } ; } ; export class DependenciesFeature implements Feature { private transport : Transport ; private logger : Function = Debug ( 'axm:features:dependencies' ) ; init ( ) { this . transport = ServiceManager . get ( 'transport' ) ; this . logger ( 'init' ) ; const pkgPath = Configuration . findPackageJson ( ) ; if ( typeof pkgPath !== 'string' ) return this . logger ( 'failed to found pkg.json path' ) ; this . logger ( `found pkg.json in ${ pkgPath }` ) ; readFile ( pkgPath , ( err , data ) => { if ( err ) return this . logger ( `failed to read pkg.json` , err ) ; try { const pkg = JSON . parse ( data . toString ( ) ) ; if ( typeof pkg . dependencies !== 'object' ) { return this . logger ( `failed to find deps in pkg.json` ) ; } const dependencies = Object . keys ( pkg . dependencies as PkgDependencies ) . reduce ( ( list , name ) => { list [ name ] = { version : pkg . dependencies [ name ] } ; return list ; } , { } as DependencyList ) ; this . logger ( `collected ${ Object . keys ( dependencies ) . length } dependencies` ) ; this . transport . send ( 'application:dependencies' , dependencies ) ; this . logger ( 'sent dependencies list' ) ; } catch ( err ) { return this . logger ( `failed to parse pkg.json` , err ) ; } } ) ; } destroy ( ) { this . logger ( 'destroy' ) ; } }