49 lines
1.4 KiB
TypeScript
49 lines
1.4 KiB
TypeScript
import * as fs from 'fs';
|
|
import * as path from 'path';
|
|
|
|
/** Recursively creates the given directory. */
|
|
export default function createDirRecursively(folderName: string): Promise<void> {
|
|
return new Promise((resolve, reject) => {
|
|
//Try to create directory
|
|
fs.mkdir(folderName, (error) => {
|
|
//If it fails, we first need to create parent directory
|
|
if (error) {
|
|
switch (error.code) {
|
|
case 'ENOENT': //parent does not exist
|
|
//Create parent
|
|
const parentFolder = path.dirname(folderName);
|
|
createDirRecursively(parentFolder).then(() => {
|
|
//Then try again
|
|
try {
|
|
resolve(createDirRecursively(folderName));
|
|
} catch (error) {
|
|
reject(error);
|
|
}
|
|
}).catch((parentError) => {
|
|
reject(parentError);
|
|
});
|
|
break;
|
|
|
|
case 'EEXIST': { //already exists (either as file or directory)
|
|
fs.stat(folderName, (statError, stats) => {
|
|
if (statError) {
|
|
reject(statError);
|
|
}
|
|
if (stats.isDirectory()) {
|
|
resolve();
|
|
} else {
|
|
reject('Is not a directory');
|
|
}
|
|
})
|
|
break;
|
|
}
|
|
|
|
default: //other error, just propagate onwards
|
|
reject(error);
|
|
}
|
|
} else {
|
|
resolve();
|
|
}
|
|
});
|
|
});
|
|
}
|