osr-mono/packages/fs/dir.js
2025-01-29 17:40:56 +01:00

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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