-
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathindex.js
70 lines (56 loc) · 1.4 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
import {promisify} from 'node:util';
import parentDirs from 'parent-dirs';
import slash from 'slash';
async function mkdirp(directory) {
if (typeof directory !== 'string') {
throw new TypeError('`path` is required');
}
const directories = parentDirs(directory);
// Skip root as it's always there.
if (directories[directories.length - 1] === '/') {
directories.pop();
}
if (directories.length === 0) {
return;
}
const mkdir = async directory => {
directory = slash(directory);
try {
await promisify(this.raw.bind(this))('mkd', directory);
} catch (error) {
if (error.code === 550 && directories.length > 0) {
await mkdir(directories.pop());
return;
}
error.message += ` - mkd: ${directory}`;
throw error;
}
if (directories.length > 0) {
await mkdir(directories.pop());
}
};
const checkIfDirectoryExists = async directory => {
directory = slash(directory);
try {
await promisify(this.raw.bind(this))('mlst', directory);
} catch (error) {
if (error.code === 550) {
await mkdir(directory);
return;
}
error.message += ` - mlst: ${directory}`;
throw error;
}
if (directories.length > 0) {
await checkIfDirectoryExists(directories.pop());
}
};
await checkIfDirectoryExists(directories.pop());
}
export default function jsFtpMkdirp(JsFtp) {
JsFtp.prototype = Object.create(JsFtp.prototype, {
mkdirp: {
value: mkdirp,
},
});
}