-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathindex.js
60 lines (49 loc) · 1.43 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
'use strict';
const fs = require('fs');
const archiveType = require('archive-type');
const decompress = require('decompress');
const PluginError = require('plugin-error');
const {Transform} = require('readable-stream');
const Vinyl = require('vinyl');
module.exports = options => new Transform({
objectMode: true,
async transform(file, enc, cb) {
if (file.isNull()) {
cb(null, file);
return;
}
if (file.isStream()) {
cb(new PluginError('gulp-decompress', 'Streaming is not supported'));
return;
}
if (!archiveType(file.contents)) {
cb(null, file);
return;
}
try {
const decompressedFiles = await decompress(file.contents, options);
for (const decompressedFile of decompressedFiles) {
const stats = new fs.Stats();
stats.mtime = decompressedFile.mtime;
if (decompressedFile.type === 'symlink') {
stats.isSymbolicLink = () => true;
} else {
stats.mode = decompressedFile.mode;
stats.isDirectory = () => decompressedFile.type === 'directory';
}
const vinylOptions = {
stat: stats,
contents: (stats.isDirectory() || stats.isSymbolicLink()) ? null : decompressedFile.data,
path: decompressedFile.path
};
if (decompressedFile.linkname) {
vinylOptions.symlink = decompressedFile.linkname;
}
this.push(new Vinyl(vinylOptions));
}
cb();
} catch (error) {
cb(new PluginError('gulp-decompress:', error, {fileName: file.path}));
}
}
});