fs-generate
Version:
Utilities to set up file system structures (directories, files, and symlinks)
128 lines • 6.37 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: function() {
return _default;
}
});
var _gracefulfs = /*#__PURE__*/ _interop_require_default(require("graceful-fs"));
var _mkdirpclassic = /*#__PURE__*/ _interop_require_default(require("mkdirp-classic"));
var _path = /*#__PURE__*/ _interop_require_default(require("path"));
var _queuecb = /*#__PURE__*/ _interop_require_default(require("queue-cb"));
var _rimraf2 = /*#__PURE__*/ _interop_require_default(require("rimraf2"));
var _indexts = /*#__PURE__*/ _interop_require_default(require("./fs-compat/index.js"));
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
var STAT_OPTIONS = {
bigint: process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE)
};
function directory(fullPath, callback) {
_indexts.default.lstat(fullPath, STAT_OPTIONS, function(err, stat) {
if (err || !stat) (0, _mkdirpclassic.default)(fullPath, callback);
else if (!stat.isDirectory()) {
(0, _rimraf2.default)(fullPath, {
disableGlob: true
}, function(err) {
err ? callback(err) : (0, _mkdirpclassic.default)(fullPath, callback);
});
} else callback();
});
}
function file(fullPath, contents, callback) {
_indexts.default.lstat(fullPath, STAT_OPTIONS, function(err, stat) {
if (err || !stat) _gracefulfs.default.writeFile(fullPath, contents, 'utf8', callback);
else if (!stat.isFile()) {
(0, _rimraf2.default)(fullPath, {
disableGlob: true
}, function(err) {
err ? callback(err) : _gracefulfs.default.writeFile(fullPath, contents, 'utf8', callback);
});
} else {
_gracefulfs.default.readFile(fullPath, 'utf8', function(err, existingContents) {
if (err) callback(err);
else if (existingContents !== contents) _gracefulfs.default.writeFile(fullPath, contents, 'utf8', callback);
else callback();
});
}
});
}
function symlink(targetFullPath, fullPath, callback) {
_indexts.default.lstatReal(targetFullPath, STAT_OPTIONS, function(err, targetStat) {
if (err || !targetStat) return callback(err || new Error("Symlink path does not exist".concat(targetFullPath)));
var targetRelativePath = _path.default.relative(_path.default.dirname(fullPath), targetFullPath);
var type = targetStat.isDirectory() ? 'dir' : 'file';
_indexts.default.lstat(fullPath, STAT_OPTIONS, function(err, stat) {
if (err || !stat) _gracefulfs.default.symlink(targetRelativePath, fullPath, type, callback);
else if (!stat.isSymbolicLink()) {
(0, _rimraf2.default)(fullPath, {
disableGlob: true
}, function(err) {
err ? callback(err) : _gracefulfs.default.symlink(targetRelativePath, fullPath, type, callback);
});
} else {
_indexts.default.realpath(fullPath, function(err, realpath) {
if (err || realpath !== targetFullPath) (0, _rimraf2.default)(fullPath, {
disableGlob: true
}, function(err) {
err ? callback(err) : _gracefulfs.default.symlink(targetRelativePath, fullPath, type, callback);
});
else callback();
});
}
});
});
}
function link(targetFullPath, fullPath, callback) {
_indexts.default.lstatReal(targetFullPath, STAT_OPTIONS, function(err, targetStat) {
if (err || !targetStat) return callback(err || new Error("Symlink path does not exist".concat(targetFullPath)));
_indexts.default.lstat(fullPath, STAT_OPTIONS, function(err, stat) {
if (err || !stat) _gracefulfs.default.link(targetFullPath, fullPath, callback);
else if (!stat.isFile()) {
(0, _rimraf2.default)(fullPath, {
disableGlob: true
}, function(err) {
err ? callback(err) : _gracefulfs.default.link(targetFullPath, fullPath, callback);
});
} else {
_indexts.default.realpath(fullPath, function(err, realpath) {
if (err || realpath !== targetFullPath) (0, _rimraf2.default)(fullPath, {
disableGlob: true
}, function(err) {
err ? callback(err) : _gracefulfs.default.link(targetFullPath, fullPath, callback);
});
else callback();
});
}
});
});
}
function generateOne(dir, relativePath, contents, callback) {
var fullPath = _path.default.join(dir, relativePath.split('/').join(_path.default.sep));
if (!contents) return directory(fullPath, callback);
(0, _mkdirpclassic.default)(_path.default.dirname(fullPath), function(err) {
if (err) return callback(err);
if (contents.length && contents[0] === '~') symlink(_path.default.join(dir, contents.slice(1).split('/').join(_path.default.sep)), fullPath, callback);
else if (contents.length && contents[0] === ':') link(_path.default.join(dir, contents.slice(1).split('/').join(_path.default.sep)), fullPath, callback);
else file(fullPath, contents, callback);
});
}
function worker(dir, structure, callback) {
var queue = new _queuecb.default(1);
for(var relativePath in structure)queue.defer(generateOne.bind(null, dir, relativePath, structure[relativePath]));
queue.await(callback);
}
var _default = function(dir, structure, callback) {
if (callback !== undefined) return worker(dir, structure, callback);
return new Promise(function(resolve, reject) {
return worker(dir, structure, function(err) {
err ? reject(err) : resolve(undefined);
});
});
};
/* 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; }
;