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

337 lines
25 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateInput = validateInput;
exports.sync = sync;
exports.resolveConflict = resolveConflict;
exports.async = async;
const validate_1 = require("./utils/validate");
const inspect_1 = require("./inspect");
const list_1 = require("./list");
const pathUtil = require("path");
const fs_1 = require("fs");
const errors_1 = require("./errors");
const interfaces_1 = require("./interfaces");
const matcher_1 = require("./utils/matcher");
const interfaces_2 = require("./interfaces");
const inspect_2 = require("./inspect");
const iterator_1 = require("./iterator");
const errors_2 = require("./errors");
function validateInput(methodName, path) {
const methodSignature = methodName + '([path])';
(0, validate_1.validateArgument)(methodSignature, 'path', path, ['string', 'undefined']);
}
const parseOptions = (options, path) => {
const opts = options || {};
const parsedOptions = {};
parsedOptions.progress = opts.progress;
parsedOptions.conflictCallback = opts.conflictCallback;
parsedOptions.conflictSettings = opts.conflictSettings;
parsedOptions.debug = opts.debug;
parsedOptions.matching = opts.matching;
if (!opts.filter) {
if (opts.matching) {
parsedOptions.filter = (0, matcher_1.create)(path, opts.matching);
}
else {
parsedOptions.filter = () => {
return true;
};
}
}
return parsedOptions;
};
// ---------------------------------------------------------
// Sync
// ---------------------------------------------------------
function sync(path, options) {
const inspectedFile = (0, inspect_1.sync)(path, { symlinks: true });
if (inspectedFile === undefined) {
// The path already doesn't exits. Nothing to do here.
}
else if (inspectedFile.type === 'dir') {
(0, list_1.sync)(path).forEach((filename) => {
sync(pathUtil.join(path, filename));
});
(0, fs_1.rmdirSync)(path);
}
else if (inspectedFile.type === 'file' || inspectedFile.type === 'symlink') {
(0, fs_1.unlinkSync)(path);
}
else {
throw (0, errors_1.ErrNoFileOrDir)(path);
}
}
// ---------------------------------------------------------
// Async
// ---------------------------------------------------------
const rmASync = (path, options) => {
return new Promise((resolve, reject) => {
(0, fs_1.unlink)(path, (err) => {
if (!err) {
resolve();
}
else {
reject(err);
}
});
});
};
const isDone = (nodes) => {
let done = true;
nodes.forEach((element) => {
if (element.status !== interfaces_2.ENodeOperationStatus.DONE) {
done = false;
}
});
return done;
};
const next = (nodes) => {
for (let i = 0; i < nodes.length; i++) {
if (nodes[i].status === interfaces_2.ENodeOperationStatus.COLLECTED) {
return nodes[i];
}
}
return null;
};
// handle user side setting "THROW" and non enum values (null)
const onConflict = (from, options, settings) => {
switch (settings.overwrite) {
case interfaces_2.EResolveMode.THROW: {
throw (0, errors_2.ErrCantDelete)(from);
}
case interfaces_2.EResolveMode.OVERWRITE:
case interfaces_2.EResolveMode.APPEND:
case interfaces_2.EResolveMode.IF_NEWER:
case interfaces_2.EResolveMode.ABORT:
case interfaces_2.EResolveMode.IF_SIZE_DIFFERS:
case interfaces_2.EResolveMode.SKIP: {
return settings.overwrite;
}
default: {
return undefined;
}
}
};
function resolveConflict(path, resolveMode) {
if (resolveMode === undefined) {
return true;
}
if (resolveMode === interfaces_2.EResolveMode.SKIP) {
return false;
}
else if (resolveMode === interfaces_2.EResolveMode.ABORT) {
return false;
}
else if (resolveMode === interfaces_2.EResolveMode.RETRY) {
return true;
}
return false;
}
const visitor = (path, vars, item) => {
const options = vars.options;
if (!item) {
return;
}
item.status = interfaces_2.ENodeOperationStatus.PROCESSING;
const done = () => {
item.status = interfaces_2.ENodeOperationStatus.DONE;
if (isDone(vars.nodes)) {
return vars.resolve(vars.result);
}
else {
if (vars.nodes.length) {
const itemInner = next(vars.nodes);
if (itemInner) {
visitor(itemInner.path, vars, itemInner);
}
else {
vars.resolve(vars.result);
}
}
}
};
if (isDone(vars.nodes)) {
return vars.resolve(vars.result);
}
vars.filesInProgress += 1;
rmASync(path, options)
.then((res) => {
done();
})
.catch((err) => {
if (err.code === 'EACCES' || err.code === 'EPERM' || err.code === 'EISDIR' || err.code === 'ENOTEMPTY') {
const resolved = (settings) => {
settings.error = err.code;
// feature : report
if (settings && options && options.flags && options.flags & interfaces_2.EDeleteFlags.REPORT) {
vars.result.push({
error: settings.error,
node: item,
resolved: settings
});
}
if (settings) {
// if the first resolve callback returned an individual resolve settings "THIS",
// ask the user again with the same item
const always = settings.mode === interfaces_2.EResolve.ALWAYS;
if (always) {
options.conflictSettings = settings;
}
let how = settings.overwrite;
how = onConflict(item.path, options, settings);
if (how === interfaces_2.EResolveMode.ABORT) {
vars.abort = true;
}
if (vars.abort) {
done();
return;
}
if (!resolveConflict(item.path, how)) {
done();
return;
}
item.status = interfaces_2.ENodeOperationStatus.PROCESS;
if (settings.overwrite === interfaces_2.EResolveMode.RETRY) {
item.status = interfaces_2.ENodeOperationStatus.COLLECTED;
visitor(path, vars, item);
}
}
};
if (!options.conflictSettings) {
const promise = options.conflictCallback(path, (0, inspect_2.createItem)(path), err.code);
promise.then(resolved);
}
else {
resolved(options.conflictSettings);
}
}
});
};
async function collect(path, options) {
return new Promise((resolve, reject) => {
const all = [];
(0, iterator_1.async)(path, {
filter: options.filter
}).then((it) => {
let node = null;
while (node = it.next()) {
all.push({
path: node.path,
item: node.item,
status: interfaces_2.ENodeOperationStatus.COLLECTED
});
}
resolve(all);
}).catch((err) => {
console.error('read error', err);
});
});
}
async function async(path, options) {
options = parseOptions(options, path);
const onError = (err, resolve, reject, nodes) => {
if (err.code === 'EPERM' || err.code === 'EISDIR' || err.code === 'ENOTEMPTY') {
const proceed = () => {
// It's not a file, it's a directory.
// Must delete everything inside first.
(0, list_1.async)(path).then((filenamesInsideDir) => {
const promises = filenamesInsideDir.map((filename) => {
return async(pathUtil.join(path, filename), options);
});
return Promise.all(promises);
}).then(() => {
// Everything inside directory has been removed,
// it's safe now to go for the directory itself.
return (0, fs_1.rmdir)(path, (err2) => {
if (err2) {
reject(err2);
}
});
})
.then(resolve, reject);
};
// we have a user conflict callback,
// collect nodes and start asking
if (options.conflictCallback) {
const result = void 0;
// walker variables
const visitorArgs = {
resolve: resolve,
reject: reject,
abort: false,
filesInProgress: 0,
resolveSettings: null,
options: options,
result: result,
nodes: nodes || []
};
const process = () => {
visitorArgs.nodes = nodes;
if (isDone(nodes)) {
return resolve(result);
}
if (nodes.length) {
const item = next(nodes);
if (item) {
visitor(item.path, visitorArgs, item);
}
}
};
if (!nodes) {
const _nodes = visitorArgs.nodes;
(0, iterator_1.async)(path, {
filter: options.filter
}).then((it) => {
let node = null;
while (node = it.next()) {
_nodes.push({
path: node.path,
item: node.item,
status: interfaces_2.ENodeOperationStatus.COLLECTED
});
}
process();
}).catch((err2) => {
console.error('read error', err2);
});
}
else {
process();
}
}
else {
proceed();
}
}
else if (err.code === 'ENOENT') {
// File already doesn't exist. We're done.
resolve();
}
else {
// Something unexpected happened. Rethrow original error.
reject(err);
}
};
// if matching is set, its like rm somePath/*.ext
// in this case, we collect the inner matching nodes and proceed as it
// would be an error
if (options.matching) {
const nodes = await collect(path, options);
const err = new interfaces_1.ErrnoException('dummy');
err.code = 'ENOTEMPTY';
return new Promise((resolve, reject) => {
onError(err, resolve, reject, nodes);
});
}
else {
return new Promise((resolve, reject) => {
// Assume the path is a file or directory and just try to remove it.
rmASync(path, options)
.then((res) => resolve())
.catch((err) => {
onError(err, resolve, reject);
});
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3ZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3JjL3JlbW92ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWNBLHNDQUdDO0FBeUJELG9CQWNDO0FBK0RELDBDQVlDO0FBd0dELHNCQXVHQztBQWpWRCwrQ0FBbUQ7QUFDbkQsdUNBQStDO0FBQy9DLGlDQUE2RDtBQUM3RCxpQ0FBZ0M7QUFDaEMsMkJBQXlEO0FBQ3pELHFDQUF5QztBQUN6Qyw2Q0FBOEU7QUFDOUUsNkNBQW1EO0FBQ25ELDZDQUF3STtBQUN4SSx1Q0FBc0M7QUFDdEMseUNBQW1EO0FBQ25ELHFDQUF3QztBQUV4QyxTQUFnQixhQUFhLENBQUMsVUFBa0IsRUFBRSxJQUFZO0lBQzdELE1BQU0sZUFBZSxHQUFHLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDaEQsSUFBQSwyQkFBZ0IsRUFBQyxlQUFlLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQW1CLEVBQUUsSUFBWSxFQUFrQixFQUFFO0lBQzFFLE1BQU0sSUFBSSxHQUFtQixPQUFPLElBQUksRUFBb0IsQ0FBQztJQUM3RCxNQUFNLGFBQWEsR0FBbUIsRUFBRSxDQUFDO0lBQ3pDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QyxhQUFhLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ3ZELGFBQWEsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDdkQsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ2pDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLElBQUks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