192 lines
14 KiB
JavaScript
192 lines
14 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.async = exports.sync = exports.validateInput = void 0;
|
|
const pathUtil = require("path");
|
|
const fs_1 = require("fs");
|
|
const util_1 = require("util");
|
|
const fs = require("fs");
|
|
const remove_1 = require("./remove");
|
|
const mode_1 = require("./utils/mode");
|
|
const validate_1 = require("./utils/validate");
|
|
const errors_1 = require("./errors");
|
|
const interfaces_1 = require("./interfaces");
|
|
const mkdirp = require("mkdirp");
|
|
const validateInput = (methodName, path, options) => {
|
|
const methodSignature = methodName + '(path, [criteria])';
|
|
(0, validate_1.validateArgument)(methodSignature, 'path', path, ['string']);
|
|
(0, validate_1.validateOptions)(methodSignature, 'criteria', options, {
|
|
empty: ['boolean'],
|
|
mode: ['string', 'number']
|
|
});
|
|
};
|
|
exports.validateInput = validateInput;
|
|
const defaults = (options) => {
|
|
const result = options || {};
|
|
if (typeof result.empty !== 'boolean') {
|
|
result.empty = false;
|
|
}
|
|
if (result.mode !== undefined) {
|
|
result.mode = (0, mode_1.normalizeFileMode)(result.mode);
|
|
}
|
|
return result;
|
|
};
|
|
// ---------------------------------------------------------
|
|
// Sync
|
|
// ---------------------------------------------------------
|
|
const dirStatsSync = (path) => {
|
|
let _stat;
|
|
try {
|
|
_stat = (0, fs_1.statSync)(path);
|
|
}
|
|
catch (err) {
|
|
// Detection if path already exists
|
|
if (err.code !== interfaces_1.EError.NOEXISTS) {
|
|
throw err;
|
|
}
|
|
}
|
|
if (_stat && !_stat.isDirectory()) {
|
|
throw (0, errors_1.ErrNoDirectory)(path);
|
|
}
|
|
return _stat;
|
|
};
|
|
function mkdirSync(path, criteria) {
|
|
mkdirp.sync(path, { mode: criteria.mode, fs: null });
|
|
}
|
|
function checkDirSync(path, _stat, options) {
|
|
const check = function () {
|
|
if (options.mode !== undefined) {
|
|
fs.chmodSync(path, options.mode);
|
|
}
|
|
};
|
|
const checkEmptiness = function () {
|
|
let list;
|
|
if (options.empty) {
|
|
// Delete everything inside this directory
|
|
list = (0, fs_1.readdirSync)(path);
|
|
list.forEach(function (filename) {
|
|
(0, remove_1.sync)(pathUtil.resolve(path, filename));
|
|
});
|
|
}
|
|
};
|
|
check();
|
|
checkEmptiness();
|
|
}
|
|
const sync = (path, options) => {
|
|
const criteria = defaults(options);
|
|
const _stat = dirStatsSync(path);
|
|
if (_stat) {
|
|
checkDirSync(path, _stat, criteria);
|
|
}
|
|
else {
|
|
mkdirSync(path, criteria);
|
|
}
|
|
};
|
|
exports.sync = sync;
|
|
// ---------------------------------------------------------
|
|
// Async
|
|
// ---------------------------------------------------------
|
|
const promisedStat = (0, util_1.promisify)(fs_1.stat);
|
|
const promisedReaddir = (0, util_1.promisify)(fs_1.readdir);
|
|
const dirStatAsync = (path) => {
|
|
return new Promise((resolve, reject) => {
|
|
promisedStat(path)
|
|
.then((_stat) => {
|
|
if (_stat.isDirectory()) {
|
|
resolve(_stat);
|
|
}
|
|
else {
|
|
reject((0, errors_1.ErrNoDirectory)(path));
|
|
}
|
|
})
|
|
.catch((err) => (err.code === interfaces_1.EError.NOEXISTS ? resolve(undefined) : reject(err)));
|
|
});
|
|
};
|
|
// Delete all files and directores inside given directory
|
|
const emptyAsync = (path) => {
|
|
return new Promise((resolve, reject) => {
|
|
promisedReaddir(path)
|
|
.then(function (list) {
|
|
const doOne = function (index) {
|
|
let subPath;
|
|
if (index === list.length) {
|
|
resolve(1);
|
|
}
|
|
else {
|
|
subPath = pathUtil.resolve(path, list[index]);
|
|
(0, remove_1.async)(subPath).then(() => doOne(index + 1));
|
|
}
|
|
};
|
|
doOne(0);
|
|
})
|
|
.catch(reject);
|
|
});
|
|
};
|
|
const checkMode = function (criteria, _stat, path) {
|
|
if (criteria.mode !== undefined) {
|
|
return (0, util_1.promisify)(fs.chmod)(path, criteria.mode);
|
|
}
|
|
return Promise.resolve(null);
|
|
};
|
|
const checkDirAsync = (path, _stat, options) => {
|
|
return new Promise((resolve, reject) => {
|
|
const checkEmptiness = function () {
|
|
if (options.empty) {
|
|
return emptyAsync(path);
|
|
}
|
|
return Promise.resolve();
|
|
};
|
|
checkMode(options, _stat, path)
|
|
.then(checkEmptiness)
|
|
.then(resolve, reject);
|
|
});
|
|
};
|
|
const mkdirAsync = (path, criteria) => {
|
|
const options = criteria || {};
|
|
return new Promise((resolve, reject) => {
|
|
(0, util_1.promisify)(fs.mkdir)(path, options.mode)
|
|
.then(resolve)
|
|
.catch((err) => {
|
|
if (err.code === 'ENOENT') {
|
|
// Parent directory doesn't exist. Need to create it first.
|
|
mkdirAsync(pathUtil.dirname(path), options)
|
|
.then(() => {
|
|
// Now retry creating this directory.
|
|
return (0, util_1.promisify)(fs.mkdir)(path, options.mode);
|
|
})
|
|
.then(resolve)
|
|
.catch((err2) => {
|
|
if (err2.code === 'EEXIST') {
|
|
// Hmm, something other have already created the directory?
|
|
// No problem for us.
|
|
resolve(1);
|
|
}
|
|
else {
|
|
reject(err2);
|
|
}
|
|
});
|
|
}
|
|
else if (err.code === 'EEXIST') {
|
|
// The path already exists. We're fine.
|
|
resolve(1);
|
|
}
|
|
else {
|
|
reject(err);
|
|
}
|
|
});
|
|
});
|
|
};
|
|
const async = (path, passedCriteria) => {
|
|
const criteria = defaults(passedCriteria);
|
|
return new Promise((resolve, reject) => {
|
|
dirStatAsync(path)
|
|
.then((_stat) => {
|
|
if (_stat !== undefined) {
|
|
return checkDirAsync(path, _stat, criteria);
|
|
}
|
|
return mkdirAsync(path, criteria);
|
|
})
|
|
.then(resolve, reject);
|
|
});
|
|
};
|
|
exports.async = async;
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3JjL2Rpci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpQ0FBaUM7QUFDakMsMkJBQWlFO0FBQ2pFLCtCQUFpQztBQUNqQyx5QkFBeUI7QUFDekIscUNBQW9FO0FBQ3BFLHVDQUE2RDtBQUM3RCwrQ0FBcUU7QUFDckUscUNBQTBDO0FBQzFDLDZDQUFzQztBQUN0QyxpQ0FBa0M7QUFPM0IsTUFBTSxhQUFhLEdBQUcsQ0FBQyxVQUFrQixFQUFFLElBQVksRUFBRSxPQUFrQixFQUFFLEVBQUU7SUFDckYsTUFBTSxlQUFlLEdBQUcsVUFBVSxHQUFHLG9CQUFvQixDQUFDO0lBQzFELElBQUEsMkJBQWdCLEVBQUMsZUFBZSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzVELElBQUEsMEJBQWUsRUFBQyxlQUFlLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRTtRQUNyRCxLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDbEIsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztLQUMxQixDQUFDLENBQUM7QUFDSixDQUFDLENBQUM7QUFQVyxRQUFBLGFBQWEsaUJBT3hCO0FBRUYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxPQUFrQixFQUFZLEVBQUU7SUFDakQsTUFBTSxNQUFNLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUM3QixJQUFJLE9BQU8sTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN2QyxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBQSx3QkFBUSxFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsT0FBTyxN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
|