UNPKG

link-unlink

Version:

Link and unlink with saving and restoring the previous file or directory

66 lines 2.75 kB
"use strict"; 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; }