Files
asciidisco.com/build/node_modules/lnfs/index.js
2023-08-01 13:49:46 +02:00

102 lines
1.7 KiB
JavaScript

'use strict';
var fs = require('fs');
var path = require('path');
var mkdirp = require('mkdirp');
var rimraf = require('rimraf');
function link(src, dest, type, cb) {
rimraf(dest, function (err) {
if (err) {
cb(err);
return;
}
mkdirp(path.dirname(dest), function (err) {
if (err) {
cb(err);
return;
}
fs.symlink(src, dest, type, cb);
});
});
}
module.exports = function (src, dest, type, cb) {
if (typeof src !== 'string' || typeof dest !== 'string') {
throw new Error('Source file and target required');
}
if (typeof type === 'function' && !cb) {
cb = type;
type = null;
}
src = path.resolve(src);
dest = path.resolve(dest);
fs.lstat(dest, function (err, stats) {
if (err && err.code === 'ENOENT') {
return link(src, dest, type, cb);
}
if (err) {
cb(err);
return;
}
if (!stats.isSymbolicLink()) {
return link(src, dest, type, cb);
}
fs.realpath(dest, function (err, res) {
if (err) {
cb(err);
return;
}
if (res === src) {
cb();
return;
}
link(src, dest, type, cb);
});
});
};
module.exports.sync = function (src, dest, type) {
if (typeof src !== 'string' || typeof dest !== 'string') {
throw new Error('Source file and target required');
}
src = path.resolve(src);
dest = path.resolve(dest);
try {
var stats = fs.lstatSync(dest);
var realpath = fs.realpathSync(dest);
if (!stats.isSymbolicLink()) {
rimraf.sync(dest);
fs.symlinkSync(src, dest, type);
return;
}
if (realpath === src) {
return;
}
rimraf.sync(dest);
fs.symlinkSync(src, dest, type);
} catch (err) {
if (err.code === 'ENOENT') {
mkdirp.sync(path.dirname(dest));
fs.symlinkSync(src, dest, type);
return;
}
throw err;
}
};