-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
85 lines (69 loc) · 1.89 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
'use strict';
const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
const mm = require('micromatch');
let cache = {};
let insertBeforeExt = function(filepath, str) {
let parts = filepath.split('.');
let ext = parts.pop();
return parts.join('.') + str + '.' + ext;
};
let replaceCachedFilenames = function(str) {
const filenames = Object.keys(cache);
if (!filenames.length) {
return str;
}
let rx = new RegExp( '(' + Object.keys(cache).join('|') + ')', 'g');
return str.replace(rx, name => cache[name]);
};
let getPrevFiles = function(dst, cb) {
fs.readdir(dst.dirname, (err, files) => {
if (err) {
return cb(err);
}
cb(null, mm.match(files, insertBeforeExt(dst.basename, '*')));
});
};
let removeFiles = function(dir, files, cb) {
let i = files.length;
if (!i) {
return cb();
}
files.forEach(filepath => {
fs.unlink(path.join(dir, filepath), function(err) {
i--;
if (err) {
return cb(err);
}
if (i <= 0) {
cb();
}
});
});
}
module.exports = function(f, mat, options, next) {
let dst = mat.dst();
getPrevFiles(dst, (err, files) => {
if (err) {
console.log(`Buster can\'t read a directory: ${err}`);
return next(null, mat);
}
mat.getContent(content => {
content = content.toString();
const hash = crypto.createHash('md5').update(content).digest('hex');
cache[dst.basename] = insertBeforeExt(dst.basename, '.' + hash);
mat
.dst(insertBeforeExt(dst.path, '.' + hash))
.setContent(replaceCachedFilenames(content));
let newFileName = mat.dst().basename;
files = files.filter(file => file !== newFileName);
removeFiles(dst.dirname, files, err => {
if (err) {
console.log(`Buster can\'t remove a file: ${err}`);
}
next(null, mat);
});
});
});
};