UNPKG

fs-generate

Version:

Utilities to set up file system structures (directories, files, and symlinks)

128 lines 6.37 kB
"use strict"; 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; }