UNPKG

extract-base-iterator

Version:

Base iterator for extract iterators like tar-iterator and zip-iterator

120 lines 5.59 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "default", { enumerable: true, get: function() { return LinkEntry; } }); var _fs = /*#__PURE__*/ _interop_require_default(require("fs")); var _fsremovecompat = require("fs-remove-compat"); var _isabsolute = /*#__PURE__*/ _interop_require_default(require("is-absolute")); 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 _chmodts = /*#__PURE__*/ _interop_require_default(require("./fs/chmod.js")); var _chownts = /*#__PURE__*/ _interop_require_default(require("./fs/chown.js")); var _utimests = /*#__PURE__*/ _interop_require_default(require("./fs/utimes.js")); var _indexts = require("./shared/index.js"); var _safeJoinPathts = /*#__PURE__*/ _interop_require_default(require("./shared/safeJoinPath.js")); var _stripPathts = /*#__PURE__*/ _interop_require_default(require("./shared/stripPath.js")); var _validateAttributests = /*#__PURE__*/ _interop_require_default(require("./validateAttributes.js")); var _waitForAccessts = /*#__PURE__*/ _interop_require_default(require("./waitForAccess.js")); function _class_call_check(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var MANDATORY_ATTRIBUTES = [ 'mode', 'mtime', 'path', 'linkpath' ]; var LinkEntry = /*#__PURE__*/ function() { "use strict"; function LinkEntry(attributes) { _class_call_check(this, LinkEntry); (0, _validateAttributests.default)(attributes, MANDATORY_ATTRIBUTES); (0, _indexts.objectAssign)(this, attributes); if (this.basename === undefined) this.basename = _path.default.basename(this.path); if (this.type === undefined) this.type = 'link'; } var _proto = LinkEntry.prototype; _proto.create = function create(dest, options, callback) { var _this = this; callback = typeof options === 'function' ? options : callback; options = typeof options === 'function' ? {} : options || {}; if (typeof callback === 'function') { try { var normalizedPath = _path.default.normalize(this.path); var fullPath = (0, _safeJoinPathts.default)(dest, (0, _stripPathts.default)(normalizedPath, options)); if ((0, _isabsolute.default)(this.linkpath)) { var _$err = new Error("Absolute linkpath rejected: '".concat(this.linkpath, "'")); _$err.code = 'ETRAVERSAL'; throw _$err; } var normalizedLinkpath = _path.default.normalize(this.linkpath); var linkFullPath = (0, _safeJoinPathts.default)(dest, (0, _stripPathts.default)(normalizedLinkpath, options)); var queue = new _queuecb.default(1); if (options.force) { queue.defer(function(callback) { (0, _fsremovecompat.rm)(fullPath, function(err) { err && err.code !== 'ENOENT' ? callback(err) : callback(); }); }); } queue.defer(function(cb) { return (0, _mkdirpclassic.default)(_path.default.dirname(fullPath), function(err) { return cb(err); }); }); queue.defer(function(cb) { return (0, _waitForAccessts.default)(linkFullPath, cb); }); // ensure target file is accessible before linking queue.defer(function(cb) { return _fs.default.link(linkFullPath, fullPath, function(err) { return cb(err); }); }); queue.defer(function(cb) { return (0, _waitForAccessts.default)(fullPath, cb); }); queue.defer(function(cb) { return (0, _chmodts.default)(fullPath, _this, options, function(err) { return cb(err); }); }); queue.defer(function(cb) { return (0, _chownts.default)(fullPath, _this, options, function(err) { return cb(err); }); }); queue.defer(function(cb) { return (0, _utimests.default)(fullPath, _this, options, function(err) { return cb(err); }); }); queue.await(callback); } catch (err) { callback(err); } return; } return new Promise(function(resolve, reject) { return _this.create(dest, options, function(err) { return err ? reject(err) : resolve(true); }); }); }; _proto.destroy = function destroy() {}; return LinkEntry; }(); /* 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; }