| /** | |
|  * @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; | |
| };
 |