link-unlink
Version:
Link and unlink with saving and restoring the previous file or directory
66 lines • 2.75 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: function() {
return link;
}
});
var _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
var _lock = require("lock");
var _mkdirpclassic = /*#__PURE__*/ _interop_require_default(require("mkdirp-classic"));
var _path = /*#__PURE__*/ _interop_require_default(require("path"));
var _tempsuffix = /*#__PURE__*/ _interop_require_default(require("temp-suffix"));
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
var lock = (0, _lock.Lock)();
var isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);
var dirSymlinkType = isWindows ? 'junction' : 'dir';
function saveLink(target, callback) {
var movedPath = _path.default.join(_path.default.dirname(target), "".concat(_path.default.basename(target), ".").concat((0, _tempsuffix.default)()));
_fs.default.rename(target, movedPath, callback);
}
function createLink(src, target, callback) {
_fs.default.stat(src, function(err, stat) {
if (err) return callback(err);
(0, _mkdirpclassic.default)(_path.default.dirname(target), function() {
_fs.default.symlink(src, target, stat.isFile() ? 'file' : dirSymlinkType, function(err) {
if (!err) return callback(null, target);
// already exists, move and try to link again
return saveLink(target, function(err) {
err ? callback(err) : createLink(src, target, callback);
});
});
});
});
}
function worker(src, target, callback) {
lock([
src,
target
], function(release) {
callback = release(callback);
_fs.default.stat(target, function(_, stat) {
// doesn't exist, create
if (!stat) return createLink(src, target, callback);
// exists so move it
return saveLink(target, function(err) {
err ? callback(err) : createLink(src, target, callback);
});
});
});
}
function link(src, target, callback) {
if (typeof callback === 'function') return worker(src, target, callback);
return new Promise(function(resolve, reject) {
return worker(src, target, function(err, restore) {
return err ? reject(err) : resolve(restore);
});
});
}
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }