All files / app/lib loader.class.js

86.96% Statements 40/46
88.24% Branches 15/17
80% Functions 4/5
86.96% Lines 40/46
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 961x 1x 1x 1x   1x         427x   427x   427x         427x     427x         727x   727x 727x 33x     694x 694x   694x 1810x 300x   1510x       694x         427x   427x 427x 427x   427x 427x 427x 33x     394x   1510x 1510x   1510x 1460x   1460x 1275x     1460x 1460x   1460x       394x                            
const path = require('path');
const fs = require('fs');
const assert = require('assert');
const common = require('./../common');
 
module.exports = class Loader {
 
    constructor(app, options) {
 
        // 启动目录
        this.app = app;
 
        let loaders = [];
 
        Iif (options instanceof Array) {
            for (let option of options) {
                loaders = this.concat(loaders, this.loader(option));
            }
        } else {
            loaders = this.loader(options);
        }
 
        return loaders;
    }
 
    walk(dir) {
 
        dir = path.resolve(this.app, dir);
 
        const exist = fs.existsSync(dir);
        if (!exist) {
            return;
        }
 
        const files = fs.readdirSync(dir);
        let list = [];
 
        for (let file of files) {
            if (fs.statSync(path.resolve(dir, file)).isDirectory()) {
                list = list.concat(this.walk(path.resolve(dir, file)));
            } else {
                list.push(path.resolve(dir, file));
            }
        }
 
        return list;
    }
 
    loader(options = {}) {
 
        assert(typeof options.root === 'string', 'root must be specified');
 
        options.suffix = options.suffix || '.js';
        options.prefix = options.prefix || '';
        options.filter = options.filter || [];
 
        let loaders = [];
        let paths = this.walk(options.root);
        if (!paths) {
            return;
        }
 
        for (let key in paths) {
 
            let name = path.relative(path.resolve(this.app, options.root), paths[key]);
            let regExp = new RegExp(`${options.suffix}$`);
 
            if (regExp.test(name)) {
                name = name.slice(0, name.lastIndexOf(options.suffix));
 
                options.filter.forEach(function (v, i) {
                    name = name.replace(v, '');
                });
 
                name = options.prefix + name;
                name = name.replace(/\\/g, '/');
 
                loaders[name] = common.requireDefault(paths[key]);
            }
        }
 
        return loaders;
    }
 
    concat(arr1, arr2) {
 
        let arr = arr1;
 
        for (let key in arr2) {
            arr[key] = arr2[key];
        }
 
        return arr;
    }
}