-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
98 lines (79 loc) · 2.35 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
86
87
88
89
90
91
92
93
94
95
96
97
98
const Path = require('path');
const {
access,
rename,
readdir,
unlink,
createReadStream,
createWriteStream,
constants,
lstatSync
} = require('fs');
const crs = createReadStream;
const cws = createWriteStream;
const F_OK = constants.F_OK;
const W_OK = constants.W_OK;
const unix = (path) => path.split(/\\+/).join('/');
const isDir = (file) => lstatSync(file).isDirectory();
const isFile = (file) => lstatSync(file).isFile();
const list = async (path, opts) => new Promise((res, rej) =>
readdir(path, opts, (err, dir) => {
if (err) {
rej(err);
}
let ext = opts && opts.extensions;
if (dir && ext) {
if (typeof ext === 'string') {
ext = ext.split(',');
}
ext = ext.map(ext => '.' + ext.replace(/\.|\s*/g, ''));
dir = dir.filter(file => ext.indexOf(Path.extname(file)) > -1);
}
res(dir);
}));
const root = () => {
return Path.join(__dirname, `..${Path.sep}..${Path.sep}`);
};
const copy = async (file, dest) => {
const sep = Path.sep;
file = file.replace(/\/|\\/g, sep).replace(/[/\\]+$/g, '');
dest = dest.replace(/\/|\\/g, sep).replace(/[/\\]+$/g, '');
const fn = Path.basename(file);
const ex = Path.extname(dest);
let dir = dest;
if (!ex) {
dest += sep + fn;
} else {
dir = dest.substring(0, dest.lastIndexOf(sep));
}
await new Promise((res, rej) => access(dest, F_OK | W_OK,
() => unlink(dest, () => {
const frst = crs(file);
const fwst = cws(Path.resolve(dir, fn));
frst.pipe(fwst);
frst.on('end', () => res(dest))
.on('error', (e) => rej(e));
})));
};
const move = async (file, dest) => {
const sep = Path.sep;
file = file.replace(/\/|\\/g, sep).replace(/[/\\]+$/g, '');
dest = dest.replace(/\/|\\/g, sep).replace(/[/\\]+$/g, '');
const fn = Path.basename(file);
const ex = Path.extname(dest);
if (!ex) {
dest += sep + fn;
}
await new Promise((res, rej) => access(dest, F_OK | W_OK,
() => unlink(dest, () => rename(file, dest,
(e) => (e ? rej(e) : res(dest))))));
};
module.exports = {
copy,
move,
list,
root,
isFile,
isDir,
unix
};