fs-cache.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. "use strict";
  2. var crypto = require("crypto");
  3. var mkdirp = require("mkdirp");
  4. var findCacheDir = require("find-cache-dir");
  5. var fs = require("fs");
  6. var os = require("os");
  7. var path = require("path");
  8. var zlib = require("zlib");
  9. var defaultCacheDirectory = null;
  10. var read = function read(filename, callback) {
  11. return fs.readFile(filename, function (err, data) {
  12. if (err) {
  13. return callback(err);
  14. }
  15. return zlib.gunzip(data, function (err, content) {
  16. var result = {};
  17. if (err) {
  18. return callback(err);
  19. }
  20. try {
  21. result = JSON.parse(content);
  22. } catch (e) {
  23. return callback(e);
  24. }
  25. return callback(null, result);
  26. });
  27. });
  28. };
  29. var write = function write(filename, result, callback) {
  30. var content = JSON.stringify(result);
  31. return zlib.gzip(content, function (err, data) {
  32. if (err) {
  33. return callback(err);
  34. }
  35. return fs.writeFile(filename, data, callback);
  36. });
  37. };
  38. var filename = function filename(source, identifier, options) {
  39. var hash = crypto.createHash("SHA1");
  40. var contents = JSON.stringify({
  41. source: source,
  42. options: options,
  43. identifier: identifier
  44. });
  45. hash.end(contents);
  46. return hash.read().toString("hex") + ".json.gz";
  47. };
  48. var handleCache = function handleCache(directory, params, callback) {
  49. var source = params.source;
  50. var options = params.options || {};
  51. var transform = params.transform;
  52. var identifier = params.identifier;
  53. var shouldFallback = typeof params.directory !== "string" && directory !== os.tmpdir();
  54. mkdirp(directory, function (err) {
  55. if (err) return shouldFallback ? handleCache(os.tmpdir(), params, callback) : callback(err);
  56. var file = path.join(directory, filename(source, identifier, options));
  57. return read(file, function (err, content) {
  58. var result = {};
  59. if (!err) return callback(null, content);
  60. try {
  61. result = transform(source, options);
  62. } catch (error) {
  63. return callback(error);
  64. }
  65. return write(file, result, function (err) {
  66. if (err) return shouldFallback ? handleCache(os.tmpdir(), params, callback) : callback(err);
  67. callback(null, result);
  68. });
  69. });
  70. });
  71. };
  72. module.exports = function (params, callback) {
  73. var directory = void 0;
  74. if (typeof params.directory === "string") {
  75. directory = params.directory;
  76. } else {
  77. if (defaultCacheDirectory === null) {
  78. defaultCacheDirectory = findCacheDir({ name: "babel-loader" }) || os.tmpdir();
  79. }
  80. directory = defaultCacheDirectory;
  81. }
  82. handleCache(directory, params, callback);
  83. };