ruleLoader.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. "use strict";
  2. var fs = require("fs");
  3. var path = require("path");
  4. var underscore_string_1 = require("underscore.string");
  5. var configuration_1 = require("./configuration");
  6. var moduleDirectory = path.dirname(module.filename);
  7. var CORE_RULES_DIRECTORY = path.resolve(moduleDirectory, ".", "rules");
  8. function loadRules(ruleConfiguration, enableDisableRuleMap, rulesDirectories) {
  9. var rules = [];
  10. for (var ruleName in ruleConfiguration) {
  11. if (ruleConfiguration.hasOwnProperty(ruleName)) {
  12. var ruleValue = ruleConfiguration[ruleName];
  13. var Rule = findRule(ruleName, rulesDirectories);
  14. if (Rule !== undefined) {
  15. var all = "all";
  16. var allList = (all in enableDisableRuleMap ? enableDisableRuleMap[all] : []);
  17. var ruleSpecificList = (ruleName in enableDisableRuleMap ? enableDisableRuleMap[ruleName] : []);
  18. var disabledIntervals = buildDisabledIntervalsFromSwitches(ruleSpecificList, allList);
  19. rules.push(new Rule(ruleName, ruleValue, disabledIntervals));
  20. }
  21. }
  22. }
  23. return rules;
  24. }
  25. exports.loadRules = loadRules;
  26. function findRule(name, rulesDirectories) {
  27. var camelizedName = transformName(name);
  28. var Rule = loadRule(CORE_RULES_DIRECTORY, camelizedName);
  29. if (Rule != null) {
  30. return Rule;
  31. }
  32. var directories = configuration_1.getRulesDirectories(rulesDirectories);
  33. for (var _i = 0, directories_1 = directories; _i < directories_1.length; _i++) {
  34. var rulesDirectory = directories_1[_i];
  35. if (rulesDirectory != null) {
  36. Rule = loadRule(rulesDirectory, camelizedName);
  37. if (Rule != null) {
  38. return Rule;
  39. }
  40. var subDirectory = underscore_string_1.strLeft(rulesDirectory, "-");
  41. var ruleName = underscore_string_1.strRight(rulesDirectory, "-");
  42. if (subDirectory !== rulesDirectory && ruleName !== rulesDirectory) {
  43. camelizedName = transformName(ruleName);
  44. Rule = loadRule(rulesDirectory, subDirectory, camelizedName);
  45. if (Rule != null) {
  46. return Rule;
  47. }
  48. }
  49. }
  50. }
  51. return undefined;
  52. }
  53. exports.findRule = findRule;
  54. function transformName(name) {
  55. var nameMatch = name.match(/^([-_]*)(.*?)([-_]*)$/);
  56. if (nameMatch == null) {
  57. return name + "Rule";
  58. }
  59. return nameMatch[1] + underscore_string_1.camelize(nameMatch[2]) + nameMatch[3] + "Rule";
  60. }
  61. function loadRule() {
  62. var paths = [];
  63. for (var _i = 0; _i < arguments.length; _i++) {
  64. paths[_i - 0] = arguments[_i];
  65. }
  66. var rulePath = paths.reduce(function (p, c) { return path.join(p, c); }, "");
  67. var fullPath = path.resolve(moduleDirectory, rulePath);
  68. if (fs.existsSync(fullPath + ".js")) {
  69. var ruleModule = require(fullPath);
  70. if (ruleModule && ruleModule.Rule) {
  71. return ruleModule.Rule;
  72. }
  73. }
  74. return undefined;
  75. }
  76. function buildDisabledIntervalsFromSwitches(ruleSpecificList, allList) {
  77. var isCurrentlyDisabled = false;
  78. var disabledStartPosition;
  79. var disabledIntervalList = [];
  80. var i = 0;
  81. var j = 0;
  82. while (i < ruleSpecificList.length || j < allList.length) {
  83. var ruleSpecificTopPositon = (i < ruleSpecificList.length ? ruleSpecificList[i].position : Infinity);
  84. var allTopPositon = (j < allList.length ? allList[j].position : Infinity);
  85. var newPositionToCheck = void 0;
  86. if (ruleSpecificTopPositon < allTopPositon) {
  87. newPositionToCheck = ruleSpecificList[i];
  88. i++;
  89. }
  90. else {
  91. newPositionToCheck = allList[j];
  92. j++;
  93. }
  94. if (newPositionToCheck.isEnabled === isCurrentlyDisabled) {
  95. if (!isCurrentlyDisabled) {
  96. disabledStartPosition = newPositionToCheck.position;
  97. isCurrentlyDisabled = true;
  98. }
  99. else {
  100. disabledIntervalList.push({
  101. endPosition: newPositionToCheck.position,
  102. startPosition: disabledStartPosition
  103. });
  104. isCurrentlyDisabled = false;
  105. }
  106. }
  107. }
  108. if (isCurrentlyDisabled) {
  109. disabledIntervalList.push({
  110. endPosition: Infinity,
  111. startPosition: disabledStartPosition
  112. });
  113. }
  114. return disabledIntervalList;
  115. }