86 lines
1.9 KiB
JavaScript
86 lines
1.9 KiB
JavaScript
'use strict';
|
|
|
|
const fs = require('graceful-fs');
|
|
|
|
function createSyncFs(fs) {
|
|
const methods = ['mkdir', 'realpath', 'stat', 'rmdir', 'utimes'];
|
|
const newFs = { ...fs };
|
|
|
|
methods.forEach((method) => {
|
|
newFs[method] = (...args) => {
|
|
const callback = args.pop();
|
|
let ret;
|
|
|
|
try {
|
|
ret = fs[`${method}Sync`](...args);
|
|
} catch (err) {
|
|
return callback(err);
|
|
}
|
|
|
|
callback(null, ret);
|
|
};
|
|
});
|
|
|
|
return newFs;
|
|
}
|
|
|
|
// ----------------------------------------------------------
|
|
|
|
function toPromise(method) {
|
|
return (...args) => new Promise((resolve, reject) => {
|
|
args.push((err, result) => {
|
|
if (err) {
|
|
reject(err);
|
|
} else {
|
|
resolve(result);
|
|
}
|
|
});
|
|
|
|
method(...args);
|
|
});
|
|
}
|
|
|
|
function toSync(method) {
|
|
return (...args) => {
|
|
let err;
|
|
let result;
|
|
|
|
args.push((_err, _result) => {
|
|
err = _err;
|
|
result = _result;
|
|
});
|
|
|
|
method(...args);
|
|
|
|
if (err) {
|
|
throw err;
|
|
}
|
|
|
|
return result;
|
|
};
|
|
}
|
|
|
|
function toSyncOptions(options) {
|
|
// Shallow clone options because we are oging to mutate them
|
|
options = { ...options };
|
|
|
|
// Transform fs to use the sync methods instead
|
|
options.fs = createSyncFs(options.fs || fs);
|
|
|
|
// Retries are not allowed because it requires the flow to be sync
|
|
if (
|
|
(typeof options.retries === 'number' && options.retries > 0) ||
|
|
(options.retries && typeof options.retries.retries === 'number' && options.retries.retries > 0)
|
|
) {
|
|
throw Object.assign(new Error('Cannot use retries with the sync api'), { code: 'ESYNC' });
|
|
}
|
|
|
|
return options;
|
|
}
|
|
|
|
module.exports = {
|
|
toPromise,
|
|
toSync,
|
|
toSyncOptions,
|
|
};
|