UNPKG

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