UNPKG

3.42 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = _default;
7
8var _crypto = _interopRequireDefault(require("crypto"));
9
10var _mkdirp = _interopRequireDefault(require("mkdirp"));
11
12var _findCacheDir = _interopRequireDefault(require("find-cache-dir"));
13
14var _fs = _interopRequireDefault(require("fs"));
15
16var _os = _interopRequireDefault(require("os"));
17
18var _path = _interopRequireDefault(require("path"));
19
20var _zlib = _interopRequireDefault(require("zlib"));
21
22var _debug = _interopRequireDefault(require("debug"));
23
24function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
26/**
27 * https://github.com/babel/babel-loader/blob/master/src/fs-cache.js
28 * fs-cache promise版本
29 */
30let $logger = (0, _debug.default)('fs-cache');
31
32const read = filename => {
33 return new Promise((resolve, reject) => {
34 _fs.default.readFile(filename, (err, ret) => {
35 if (err) reject(err);
36
37 _zlib.default.gunzip(ret, (err, content) => {
38 if (err) reject(err);
39 let result = {};
40
41 try {
42 result = JSON.parse(content);
43 } catch (e) {
44 reject(e);
45 }
46
47 return resolve(result);
48 });
49 });
50 });
51};
52
53const write = (filename, content) => {
54 return new Promise((resolve, reject) => {
55 let result;
56 let tmp = [];
57 result = JSON.stringify(content, (key, value) => {
58 if (typeof value === 'object' && value !== null && tmp.indexOf(value) !== -1) return;
59 tmp.push(value);
60 return value;
61 });
62
63 _zlib.default.gzip(result, (err, data) => {
64 if (err) reject(err);
65
66 _fs.default.writeFile(filename, data, (err, data) => {
67 if (err) reject(err);
68 resolve();
69 });
70 });
71 });
72};
73
74const filename = (source, identifier, options) => {
75 const hash = _crypto.default.createHash('SHA1');
76
77 const content = JSON.stringify({
78 source,
79 identifier,
80 options
81 });
82 hash.end(content);
83 return hash.read().toString('hex') + '.json.gz';
84};
85
86const handleCache = (directory, params) => {
87 return new Promise((resolve, reject) => {
88 const {
89 source,
90 options = {},
91 transform,
92 identifier
93 } = params;
94
95 const shouldFallback = typeof params.directory !== 'string' && directory !== _os.default.tmpdir();
96
97 (0, _mkdirp.default)(directory, err => {
98 if (err) shouldFallback ? handleCache(_os.default.tmpdir(), params) : reject(err);
99
100 const file = _path.default.join(directory, filename(source, identifier, options));
101
102 read(file).then(succ => {
103 // cached file
104 resolve(succ);
105 }, fail => {
106 // transform source
107 try {
108 params.transform(source, options).then(ret => {
109 write(file, ret).then(succ => {
110 resolve(ret);
111 }, fail => {
112 if (!shouldFallback) {
113 reject(fail);
114 } else {
115 handleCache(_os.default.tmpdir(), params).then(resolve, reject);
116 }
117 });
118 }, err => reject(err));
119 } catch (e) {
120 reject(e);
121 }
122 });
123 });
124 });
125};
126
127function _default(params) {
128 let {
129 directory
130 } = params;
131
132 if (typeof directory !== 'string') {
133 directory = (0, _findCacheDir.default)({
134 name: '@wxa/compiler-babel'
135 }) || _os.default.tmpdir();
136 }
137
138 return handleCache(directory, params);
139}
\No newline at end of file