PluginFileHandler.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. "use strict";
  2. var __values = (this && this.__values) || function(o) {
  3. var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
  4. if (m) return m.call(o);
  5. if (o && typeof o.length === "number") return {
  6. next: function () {
  7. if (o && i >= o.length) o = void 0;
  8. return { value: o && o[i++], done: !o };
  9. }
  10. };
  11. throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
  12. };
  13. Object.defineProperty(exports, "__esModule", { value: true });
  14. exports.PluginFileHandler = void 0;
  15. var PluginFileHandler = /** @class */ (function () {
  16. function PluginFileHandler(fileSystem, buildRoot, modulesDirectories, excludedPackageTest) {
  17. this.fileSystem = fileSystem;
  18. this.buildRoot = buildRoot;
  19. this.modulesDirectories = modulesDirectories;
  20. this.excludedPackageTest = excludedPackageTest;
  21. this.cache = {};
  22. }
  23. PluginFileHandler.prototype.getModule = function (filename) {
  24. return this.cache[filename] === undefined
  25. ? (this.cache[filename] = this.getModuleInternal(filename))
  26. : this.cache[filename];
  27. };
  28. PluginFileHandler.prototype.isInModuleDirectory = function (filename) {
  29. var e_1, _a;
  30. if (this.modulesDirectories === null)
  31. return true;
  32. if (filename === null || filename === undefined)
  33. return false;
  34. var foundInModuleDirectory = false;
  35. var resolvedPath = this.fileSystem.resolvePath(filename);
  36. try {
  37. for (var _b = __values(this.modulesDirectories), _c = _b.next(); !_c.done; _c = _b.next()) {
  38. var modulesDirectory = _c.value;
  39. if (resolvedPath.startsWith(this.fileSystem.resolvePath(modulesDirectory))) {
  40. foundInModuleDirectory = true;
  41. }
  42. }
  43. }
  44. catch (e_1_1) { e_1 = { error: e_1_1 }; }
  45. finally {
  46. try {
  47. if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
  48. }
  49. finally { if (e_1) throw e_1.error; }
  50. }
  51. return foundInModuleDirectory;
  52. };
  53. PluginFileHandler.prototype.isBuildRoot = function (filename) {
  54. return this.buildRoot === filename;
  55. };
  56. PluginFileHandler.prototype.getModuleInternal = function (filename) {
  57. if (filename === null || filename === undefined)
  58. return null;
  59. if (!this.isInModuleDirectory(filename))
  60. return null;
  61. var module = this.findModuleDir(filename);
  62. if (module !== null && this.excludedPackageTest(module.name)) {
  63. return null;
  64. }
  65. return module;
  66. };
  67. PluginFileHandler.prototype.findModuleDir = function (filename) {
  68. var pathSeparator = this.fileSystem.pathSeparator;
  69. var dirOfModule = filename.substring(0, filename.lastIndexOf(pathSeparator));
  70. var oldDirOfModule = null;
  71. while (!this.dirContainsValidPackageJson(dirOfModule)) {
  72. // check parent directory
  73. oldDirOfModule = dirOfModule;
  74. dirOfModule = this.fileSystem.resolvePath("" + dirOfModule + pathSeparator + ".." + pathSeparator);
  75. // reached filesystem root
  76. if (oldDirOfModule === dirOfModule) {
  77. return null;
  78. }
  79. }
  80. if (this.isBuildRoot(dirOfModule)) {
  81. return null;
  82. }
  83. var packageJson = this.parsePackageJson(dirOfModule);
  84. return {
  85. packageJson: packageJson,
  86. name: packageJson.name,
  87. directory: dirOfModule
  88. };
  89. };
  90. PluginFileHandler.prototype.parsePackageJson = function (dirOfModule) {
  91. var packageJsonText = this.fileSystem.readFileAsUtf8(this.fileSystem.join(dirOfModule, PluginFileHandler.PACKAGE_JSON));
  92. var packageJson = JSON.parse(packageJsonText);
  93. return packageJson;
  94. };
  95. PluginFileHandler.prototype.dirContainsValidPackageJson = function (dirOfModule) {
  96. if (!this.fileSystem.pathExists(this.fileSystem.join(dirOfModule, PluginFileHandler.PACKAGE_JSON))) {
  97. return false;
  98. }
  99. var packageJson = this.parsePackageJson(dirOfModule);
  100. return !!packageJson.name;
  101. };
  102. PluginFileHandler.PACKAGE_JSON = 'package.json';
  103. return PluginFileHandler;
  104. }());
  105. exports.PluginFileHandler = PluginFileHandler;