file-manager.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. "use strict";
  2. var __extends = (this && this.__extends) || (function () {
  3. var extendStatics = function (d, b) {
  4. extendStatics = Object.setPrototypeOf ||
  5. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  6. function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
  7. return extendStatics(d, b);
  8. };
  9. return function (d, b) {
  10. extendStatics(d, b);
  11. function __() { this.constructor = d; }
  12. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  13. };
  14. })();
  15. var __importDefault = (this && this.__importDefault) || function (mod) {
  16. return (mod && mod.__esModule) ? mod : { "default": mod };
  17. };
  18. Object.defineProperty(exports, "__esModule", { value: true });
  19. var path_1 = __importDefault(require("path"));
  20. var fs_1 = __importDefault(require("./fs"));
  21. var abstract_file_manager_js_1 = __importDefault(require("../less/environment/abstract-file-manager.js"));
  22. var FileManager = /** @class */ (function (_super) {
  23. __extends(FileManager, _super);
  24. function FileManager() {
  25. return _super !== null && _super.apply(this, arguments) || this;
  26. }
  27. FileManager.prototype.supports = function () {
  28. return true;
  29. };
  30. FileManager.prototype.supportsSync = function () {
  31. return true;
  32. };
  33. FileManager.prototype.loadFile = function (filename, currentDirectory, options, environment, callback) {
  34. var fullFilename;
  35. var isAbsoluteFilename = this.isPathAbsolute(filename);
  36. var filenamesTried = [];
  37. var self = this;
  38. var prefix = filename.slice(0, 1);
  39. var explicit = prefix === '.' || prefix === '/';
  40. var result = null;
  41. var isNodeModule = false;
  42. var npmPrefix = 'npm://';
  43. options = options || {};
  44. var paths = isAbsoluteFilename ? [''] : [currentDirectory];
  45. if (options.paths) {
  46. paths.push.apply(paths, options.paths);
  47. }
  48. if (!isAbsoluteFilename && paths.indexOf('.') === -1) {
  49. paths.push('.');
  50. }
  51. var prefixes = options.prefixes || [''];
  52. var fileParts = this.extractUrlParts(filename);
  53. if (options.syncImport) {
  54. getFileData(returnData, returnData);
  55. if (callback) {
  56. callback(result.error, result);
  57. }
  58. else {
  59. return result;
  60. }
  61. }
  62. else {
  63. // promise is guaranteed to be asyncronous
  64. // which helps as it allows the file handle
  65. // to be closed before it continues with the next file
  66. return new Promise(getFileData);
  67. }
  68. function returnData(data) {
  69. if (!data.filename) {
  70. result = { error: data };
  71. }
  72. else {
  73. result = data;
  74. }
  75. }
  76. function getFileData(fulfill, reject) {
  77. (function tryPathIndex(i) {
  78. if (i < paths.length) {
  79. (function tryPrefix(j) {
  80. if (j < prefixes.length) {
  81. isNodeModule = false;
  82. fullFilename = fileParts.rawPath + prefixes[j] + fileParts.filename;
  83. if (paths[i]) {
  84. fullFilename = path_1.default.join(paths[i], fullFilename);
  85. }
  86. if (!explicit && paths[i] === '.') {
  87. try {
  88. fullFilename = require.resolve(fullFilename);
  89. isNodeModule = true;
  90. }
  91. catch (e) {
  92. filenamesTried.push(npmPrefix + fullFilename);
  93. tryWithExtension();
  94. }
  95. }
  96. else {
  97. tryWithExtension();
  98. }
  99. function tryWithExtension() {
  100. var extFilename = options.ext ? self.tryAppendExtension(fullFilename, options.ext) : fullFilename;
  101. if (extFilename !== fullFilename && !explicit && paths[i] === '.') {
  102. try {
  103. fullFilename = require.resolve(extFilename);
  104. isNodeModule = true;
  105. }
  106. catch (e) {
  107. filenamesTried.push(npmPrefix + extFilename);
  108. fullFilename = extFilename;
  109. }
  110. }
  111. else {
  112. fullFilename = extFilename;
  113. }
  114. }
  115. var readFileArgs = [fullFilename];
  116. if (!options.rawBuffer) {
  117. readFileArgs.push('utf-8');
  118. }
  119. if (options.syncImport) {
  120. try {
  121. var data = fs_1.default.readFileSync.apply(this, readFileArgs);
  122. fulfill({ contents: data, filename: fullFilename });
  123. }
  124. catch (e) {
  125. filenamesTried.push(isNodeModule ? npmPrefix + fullFilename : fullFilename);
  126. return tryPrefix(j + 1);
  127. }
  128. }
  129. else {
  130. readFileArgs.push(function (e, data) {
  131. if (e) {
  132. filenamesTried.push(isNodeModule ? npmPrefix + fullFilename : fullFilename);
  133. return tryPrefix(j + 1);
  134. }
  135. fulfill({ contents: data, filename: fullFilename });
  136. });
  137. fs_1.default.readFile.apply(this, readFileArgs);
  138. }
  139. }
  140. else {
  141. tryPathIndex(i + 1);
  142. }
  143. })(0);
  144. }
  145. else {
  146. reject({ type: 'File', message: "'" + filename + "' wasn't found. Tried - " + filenamesTried.join(',') });
  147. }
  148. }(0));
  149. }
  150. };
  151. FileManager.prototype.loadFileSync = function (filename, currentDirectory, options, environment) {
  152. options.syncImport = true;
  153. return this.loadFile(filename, currentDirectory, options, environment);
  154. };
  155. return FileManager;
  156. }(abstract_file_manager_js_1.default));
  157. exports.default = FileManager;
  158. //# sourceMappingURL=file-manager.js.map