///
import {readFileSync} from 'fs';
import {join, resolve} from 'path';
import {safeLoad} from 'js-yaml';
import {IConfiguration, ICommandConfiguration, IIndexConfiguration, ITemplateConfiguration, isDirectory, isFile} from '.';
const CONFIG_FILENAME = 'ska.yml';
export default class Configuration{
configuration: IConfiguration[];
paths: string[] = [];
static paths: string[];
get(): IConfiguration[]{
try{
if( !this.configuration )
this.configuration = this.parseConfiguration();
Configuration.paths = this.getPaths();
return this.configuration;
}catch( error ){
throw new Error( `Cannot find a configuration file.
Either specify its path in package.json, under a 'ska' attribute,
or create a configuration file in the current directory called ${CONFIG_FILENAME}.` );
}
}
getPaths(): string[]{
return this.paths;
}
private parseConfiguration( configuration?: IConfiguration, cwd: string = '.' ): IConfiguration[]{
if( !configuration )
configuration = this.searchConfiguration();
let returnConfiguration: IConfiguration[] = [];
if( this.isArray( configuration ) ){
configuration = configuration;
configuration.forEach( ( configurationPath: string ) => {
try{
let configurationWorkingDir: string = resolve( join ( cwd, configurationPath ) )
let configurationParsed: IConfiguration = this.searchConfiguration( configurationWorkingDir );
let foundConfigurations: IConfiguration[] = this.parseConfiguration( configurationParsed, configurationWorkingDir );
returnConfiguration.push( ...foundConfigurations );
}catch( error ){}
});
}else{
configuration = configuration;
configuration.definition.map( ( command: ICommandConfiguration ) => {
command.template = resolve( join( cwd, command.template ) );
return command;
});
returnConfiguration.push( configuration );
}
return returnConfiguration;
}
private searchConfiguration( directory: string = '.' ): IConfiguration{
let skaConfiguration: IConfiguration;
try{
let packagePath: string = resolve( join( directory, 'package.json' ) );
if( !isFile( packagePath ) )
throw new Error( `Package file not found.` );
let packageJson: { [key:string]: any } = JSON.parse( this.getFileContent( packagePath ) );
let ska: any = packageJson[ 'ska' ];
if( !ska )
throw new Error( `Ska definition not found in package.json.` );
this.paths.push( packagePath );
if( typeof ska == 'object' ){
skaConfiguration = ska;
}else if( typeof ska == 'string' ){
let skaPath: string = resolve( join( directory, ska ) );
if( !isFile( skaPath ) )
throw new Error( `Ska definition not found in [${skaPath}].` );
this.paths.push( skaPath );
skaConfiguration = safeLoad( this.getFileContent( skaPath ) );
}
}catch( error ){}
if( !skaConfiguration ){
let skaPath: string = resolve( join( directory, CONFIG_FILENAME ) );
if( !isFile( skaPath ) )
throw new Error( `Ska definition not found in [${skaPath}].` );
this.paths.push( skaPath );
skaConfiguration = safeLoad( this.getFileContent( skaPath ) );
}
return skaConfiguration;
}
private isArray( obj: any ){
return obj.constructor === [].constructor;
}
private getFileContent( path: string ){
if( isFile( path ) ){
return readFileSync( path, 'utf8' );
}else{
throw new Error( `File not found [${path}].` );
}
}
}