47 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * @fileoverview Module for loading rules from files and directories.
 | 
						|
 * @author Michael Ficarra
 | 
						|
 */
 | 
						|
 | 
						|
"use strict";
 | 
						|
 | 
						|
//------------------------------------------------------------------------------
 | 
						|
// Requirements
 | 
						|
//------------------------------------------------------------------------------
 | 
						|
 | 
						|
const fs = require("fs"),
 | 
						|
    path = require("path");
 | 
						|
 | 
						|
const rulesDirCache = {};
 | 
						|
 | 
						|
//------------------------------------------------------------------------------
 | 
						|
// Public Interface
 | 
						|
//------------------------------------------------------------------------------
 | 
						|
 | 
						|
/**
 | 
						|
 * Load all rule modules from specified directory.
 | 
						|
 * @param {string} relativeRulesDir Path to rules directory, may be relative.
 | 
						|
 * @param {string} cwd Current working directory
 | 
						|
 * @returns {Object} Loaded rule modules.
 | 
						|
 */
 | 
						|
module.exports = function(relativeRulesDir, cwd) {
 | 
						|
    const rulesDir = path.resolve(cwd, relativeRulesDir);
 | 
						|
 | 
						|
    // cache will help performance as IO operation are expensive
 | 
						|
    if (rulesDirCache[rulesDir]) {
 | 
						|
        return rulesDirCache[rulesDir];
 | 
						|
    }
 | 
						|
 | 
						|
    const rules = Object.create(null);
 | 
						|
 | 
						|
    fs.readdirSync(rulesDir).forEach(file => {
 | 
						|
        if (path.extname(file) !== ".js") {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        rules[file.slice(0, -3)] = require(path.join(rulesDir, file));
 | 
						|
    });
 | 
						|
    rulesDirCache[rulesDir] = rules;
 | 
						|
 | 
						|
    return rules;
 | 
						|
};
 |