• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/**
2 * @fileoverview Module for loading rules from files and directories.
3 * @author Michael Ficarra
4 */
5
6"use strict";
7
8//------------------------------------------------------------------------------
9// Requirements
10//------------------------------------------------------------------------------
11
12const fs = require("fs"),
13    path = require("path");
14
15const rulesDirCache = {};
16
17//------------------------------------------------------------------------------
18// Public Interface
19//------------------------------------------------------------------------------
20
21/**
22 * Load all rule modules from specified directory.
23 * @param {string} relativeRulesDir Path to rules directory, may be relative.
24 * @param {string} cwd Current working directory
25 * @returns {Object} Loaded rule modules.
26 */
27module.exports = function(relativeRulesDir, cwd) {
28    const rulesDir = path.resolve(cwd, relativeRulesDir);
29
30    // cache will help performance as IO operation are expensive
31    if (rulesDirCache[rulesDir]) {
32        return rulesDirCache[rulesDir];
33    }
34
35    const rules = Object.create(null);
36
37    fs.readdirSync(rulesDir).forEach(file => {
38        if (path.extname(file) !== ".js") {
39            return;
40        }
41        rules[file.slice(0, -3)] = require(path.join(rulesDir, file));
42    });
43    rulesDirCache[rulesDir] = rules;
44
45    return rules;
46};
47