@dependabot/yarn-lib
Version:
📦🐈 Fast, reliable, and secure dependency management.
287 lines (226 loc) • 8.14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _asyncToGenerator2;
function _load_asyncToGenerator() {
return _asyncToGenerator2 = _interopRequireDefault(require('babel-runtime/helpers/asyncToGenerator'));
}
exports.explodeHostedGitFragment = explodeHostedGitFragment;
var _errors;
function _load_errors() {
return _errors = require('../../errors.js');
}
var _index;
function _load_index() {
return _index = require('../../registries/index.js');
}
var _gitResolver;
function _load_gitResolver() {
return _gitResolver = _interopRequireDefault(require('./git-resolver.js'));
}
var _exoticResolver;
function _load_exoticResolver() {
return _exoticResolver = _interopRequireDefault(require('./exotic-resolver.js'));
}
var _git;
function _load_git() {
return _git = _interopRequireDefault(require('../../util/git.js'));
}
var _guessName;
function _load_guessName() {
return _guessName = _interopRequireDefault(require('../../util/guess-name.js'));
}
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function parseHash(fragment) {
const hashPosition = fragment.indexOf('#');
return hashPosition === -1 ? '' : fragment.substr(hashPosition + 1);
}
function explodeHostedGitFragment(fragment, reporter) {
const hash = parseHash(fragment);
const preParts = fragment.split('@');
if (preParts.length > 2) {
fragment = preParts[1] + '@' + preParts[2];
}
const parts = fragment.replace(/(.*?)#.*/, '$1') // Strip hash
.replace(/.*:(.*)/, '$1') // Strip prefixed protocols
.replace(/.git$/, '') // Strip the .git suffix
.split('/');
const user = parts[parts.length - 2];
const repo = parts[parts.length - 1];
if (user === undefined || repo === undefined) {
throw new (_errors || _load_errors()).MessageError(reporter.lang('invalidHostedGitFragment', fragment));
}
return {
user,
repo,
hash
};
}
class HostedGitResolver extends (_exoticResolver || _load_exoticResolver()).default {
constructor(request, fragment) {
super(request, fragment);
const exploded = this.exploded = explodeHostedGitFragment(fragment, this.reporter);
const user = exploded.user,
repo = exploded.repo,
hash = exploded.hash;
this.user = user;
this.repo = repo;
this.hash = hash;
}
static getTarballUrl(exploded, commit) {
exploded;
commit;
throw new Error('Not implemented');
}
static getGitHTTPUrl(exploded) {
exploded;
throw new Error('Not implemented');
}
static getGitHTTPBaseUrl(exploded) {
exploded;
throw new Error('Not implemented');
}
static getGitSSHUrl(exploded) {
exploded;
throw new Error('Not implemented');
}
static getHTTPFileUrl(exploded, filename, commit) {
exploded;
filename;
commit;
throw new Error('Not implemented');
}
getRefOverHTTP(url) {
var _this = this;
return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {
const gitUrl = (_git || _load_git()).default.npmUrlToGitUrl(url);
const client = new (_git || _load_git()).default(_this.config, gitUrl, _this.hash);
let out = yield _this.config.requestManager.request({
url: `${url}/info/refs?service=git-upload-pack`,
queue: _this.resolver.fetchingQueue
});
if (out) {
// clean up output
let lines = out.trim().split('\n');
// remove first two lines which contains compatibility info etc
lines = lines.slice(2);
// remove last line which contains the terminator "0000"
lines.pop();
// remove line lengths from start of each line
lines = lines.map(function (line) {
return line.slice(4);
});
out = lines.join('\n');
} else {
throw new Error(_this.reporter.lang('hostedGitResolveError'));
}
return client.setRefHosted(out);
})();
}
resolveOverHTTP(url) {
var _this2 = this;
return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {
const commit = yield _this2.getRefOverHTTP(url);
const config = _this2.config;
const tarballUrl = _this2.constructor.getTarballUrl(_this2.exploded, commit);
const tryRegistry = (() => {
var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (registry) {
const filename = (_index || _load_index()).registries[registry].filename;
const href = _this2.constructor.getHTTPFileUrl(_this2.exploded, filename, commit);
const file = yield config.requestManager.request({
url: href,
queue: _this2.resolver.fetchingQueue
});
if (!file) {
return null;
}
const json = yield config.readJson(href, function () {
return JSON.parse(file);
});
json._uid = commit;
json._remote = {
resolved: tarballUrl,
type: 'tarball',
reference: tarballUrl,
registry
};
return json;
});
return function tryRegistry(_x) {
return _ref.apply(this, arguments);
};
})();
const file = yield tryRegistry(_this2.registry);
if (file) {
return file;
}
for (const registry in (_index || _load_index()).registries) {
if (registry === _this2.registry) {
continue;
}
const file = yield tryRegistry(registry);
if (file) {
return file;
}
}
return {
name: (0, (_guessName || _load_guessName()).default)(url),
version: '0.0.0',
_uid: commit,
_remote: {
resolved: tarballUrl,
type: 'tarball',
reference: tarballUrl,
registry: 'npm',
hash: undefined
}
};
})();
}
hasHTTPCapability(url) {
var _this3 = this;
return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {
return (yield _this3.config.requestManager.request({
url,
method: 'HEAD',
queue: _this3.resolver.fetchingQueue,
followRedirect: false
})) !== false;
})();
}
resolve() {
var _this4 = this;
return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {
// If we already have the tarball, just return it without having to make any HTTP requests.
const shrunk = _this4.request.getLocked('tarball');
if (shrunk) {
return shrunk;
}
const httpUrl = _this4.constructor.getGitHTTPUrl(_this4.exploded);
const httpBaseUrl = _this4.constructor.getGitHTTPBaseUrl(_this4.exploded);
const sshUrl = _this4.constructor.getGitSSHUrl(_this4.exploded);
// If we can access the files over HTTP then we should as it's MUCH faster than git
// archive and tarball unarchiving. The HTTP API is only available for public repos
// though.
if (yield _this4.hasHTTPCapability(httpBaseUrl)) {
return _this4.resolveOverHTTP(httpUrl);
}
// If the url is accessible over git archive then we should immediately delegate to
// the git resolver.
//
// NOTE: Here we use a different url than when we delegate to the git resolver later on.
// This is because `git archive` requires access over ssh and github only allows that
// if you have write permissions
const sshGitUrl = (_git || _load_git()).default.npmUrlToGitUrl(sshUrl);
if (yield (_git || _load_git()).default.hasArchiveCapability(sshGitUrl)) {
const archiveClient = new (_git || _load_git()).default(_this4.config, sshGitUrl, _this4.hash);
const commit = yield archiveClient.init();
return _this4.fork((_gitResolver || _load_gitResolver()).default, true, `${sshUrl}#${commit}`);
}
// fallback to the plain git resolver
return _this4.fork((_gitResolver || _load_gitResolver()).default, true, sshUrl);
})();
}
}
exports.default = HostedGitResolver;