Source: Loader/ModuleLoader.js

'use strict';

const glob = require( 'glob' );
const path = require('path');
const fs = require('fs');
const Bluebird = require('bluebird');

const ROOT_PATH = '../Report/Loader';

/**
 *
 */
class ModuleLoader {
    /**
     * Get all loaderfiles
     *
     * @returns {Promise}
     * @memberof ModuleLoder
     */
    getFiles() {
        let normalizedPath = path.resolve(__dirname, ROOT_PATH);
        normalizedPath = path.join(normalizedPath, '**/*Loader.js');
        return  Promise.resolve(glob.sync(normalizedPath, { ignore:['**/AbstractLoader.js']}));
    }

    /**
     * Get single file for specific loader
     * @param {String} key
     * @returns {Promise}
     */
    getFile(key) {
        return this.getFiles()
        .then( (files) => {
            let loaders = [];
            for (let i = 0; i < files.length; i++) {
                let classFile = files[i];
                let LoaderClass = require(classFile);
                if(LoaderClass.getKey() === key){
                    return classFile
                }
            }
            return null;
        })
    }


    /**
     * Get class for loader
     * @param {String} key
     * @returns {Promise}
     */
    getClass(key){
        return this.getFile(key)
        .then( (file) => {
            if(!file){
                throw new Error('Loader '+key+' not found');
            }
            return require(file);
        })
    }


    /**
     * Get class for loader
     * @param {String} keys
     * @returns {Promise}
     */
    getAllClasses(){
        return this.getLoaderKeys()
            .then( keys => {
                return this.getClasses(keys);
            })
    }

    /**
     * Get class for loader
     * @param {String} keys
     * @returns {Promise}
     */
    getClasses(keys){
        if(keys === undefined){
            return this.getAllClasses();
        }

        let p = [];
        for(let i = 0; i < keys.length; i++){
            let key = keys[i];
            p.push(this.getClass(key));
        }
        return Promise.all(p);
    }

    /**
     * Get all keynames for loaders
     *
     * @returns {Promise}
     * @memberof ModuleLoder
     */
    getLoaderKeys(){
        return this.getFiles()
            .then( (files) => {
                if(!files || files.length === 0){
                    throw new Error('No files found');
                }
                let loaders = [];
                for (let i = 0; i < files.length; i++) {
                    let classFile = files[i];
                    let LoaderClass = require(classFile);
                    loaders.push(LoaderClass.getKey());
                }
                return loaders;
            })
    }
}

module.exports = ModuleLoader;