extract-base-iterator
Version:
Base iterator for extract iterators like tar-iterator and zip-iterator
120 lines • 5.59 kB
JavaScript
;
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; }