@dependabot/yarn-lib
Version:
📦🐈 Fast, reliable, and secure dependency management.
308 lines (245 loc) • 10.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _asyncToGenerator2;
function _load_asyncToGenerator() {
return _asyncToGenerator2 = _interopRequireDefault(require('babel-runtime/helpers/asyncToGenerator'));
}
var _errors;
function _load_errors() {
return _errors = require('../../errors.js');
}
var _registryResolver;
function _load_registryResolver() {
return _registryResolver = _interopRequireDefault(require('./registry-resolver.js'));
}
var _npmRegistry;
function _load_npmRegistry() {
return _npmRegistry = _interopRequireDefault(require('../../registries/npm-registry.js'));
}
var _npmRegistry2;
function _load_npmRegistry2() {
return _npmRegistry2 = require('../../registries/npm-registry.js');
}
var _map;
function _load_map() {
return _map = _interopRequireDefault(require('../../util/map.js'));
}
var _fs;
function _load_fs() {
return _fs = _interopRequireWildcard(require('../../util/fs.js'));
}
var _constants;
function _load_constants() {
return _constants = require('../../constants.js');
}
var _packageNameUtils;
function _load_packageNameUtils() {
return _packageNameUtils = require('../../util/package-name-utils.js');
}
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const inquirer = require('inquirer');
const tty = require('tty');
const invariant = require('invariant');
const path = require('path');
const semver = require('semver');
const NPM_REGISTRY = /http[s]:\/\/registry.npmjs.org/g;
const NPM_REGISTRY_ID = 'npm';
class NpmResolver extends (_registryResolver || _load_registryResolver()).default {
static findVersionInRegistryResponse(config, range, body, request) {
return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {
if (body.versions && Object.keys(body.versions).length === 0) {
throw new (_errors || _load_errors()).MessageError(config.reporter.lang('registryNoVersions', body.name));
}
if (!body['dist-tags'] || !body.versions) {
throw new (_errors || _load_errors()).MessageError(config.reporter.lang('malformedRegistryResponse', body.name));
}
if (range in body['dist-tags']) {
range = body['dist-tags'][range];
}
// If the latest tag in the registry satisfies the requested range, then use that.
// Otherwise we will fall back to semver maxSatisfying.
// This mimics logic in NPM. See issue #3560
const latestVersion = body['dist-tags'] ? body['dist-tags'].latest : undefined;
if (latestVersion && semver.satisfies(latestVersion, range)) {
return body.versions[latestVersion];
}
const satisfied = yield config.resolveConstraints(Object.keys(body.versions), range);
if (satisfied) {
return body.versions[satisfied];
} else if (request && !config.nonInteractive) {
if (request.resolver && request.resolver.activity) {
request.resolver.activity.end();
}
config.reporter.log(config.reporter.lang('couldntFindVersionThatMatchesRange', body.name, range));
let pageSize;
if (process.stdout instanceof tty.WriteStream) {
pageSize = process.stdout.rows - 2;
}
const response = yield inquirer.prompt([{
name: 'package',
type: 'list',
message: config.reporter.lang('chooseVersionFromList', body.name),
choices: semver.rsort(Object.keys(body.versions)),
pageSize
}]);
if (response && response.package) {
return body.versions[response.package];
}
}
throw new (_errors || _load_errors()).MessageError(config.reporter.lang('couldntFindVersionThatMatchesRange', body.name, range));
})();
}
resolveRequest() {
var _this = this;
return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {
if (_this.config.offline) {
const res = yield _this.resolveRequestOffline();
if (res != null) {
return res;
}
}
const body = yield _this.config.registries.npm.request((_npmRegistry || _load_npmRegistry()).default.escapeName(_this.name));
if (body) {
return NpmResolver.findVersionInRegistryResponse(_this.config, _this.range, body, _this.request);
} else {
return null;
}
})();
}
resolveRequestOffline() {
var _this2 = this;
return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {
const escapedName = (_npmRegistry || _load_npmRegistry()).default.escapeName(_this2.name);
const scope = _this2.config.registries.npm.getScope(escapedName);
// find modules of this name
const prefix = scope ? escapedName.split((_npmRegistry2 || _load_npmRegistry2()).SCOPE_SEPARATOR)[1] : `${NPM_REGISTRY_ID}-${_this2.name}-`;
invariant(_this2.config.cacheFolder, 'expected packages root');
const cacheFolder = path.join(_this2.config.cacheFolder, scope ? `${NPM_REGISTRY_ID}-${scope}` : '');
const files = yield _this2.config.getCache('cachedPackages', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {
const files = yield (_fs || _load_fs()).readdir(cacheFolder);
const validFiles = [];
for (var _iterator = files, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref2;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref2 = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref2 = _i.value;
}
const name = _ref2;
// no hidden files
if (name[0] === '.') {
continue;
}
// ensure valid module cache
const dir = path.join(cacheFolder, name);
if (yield _this2.config.isValidModuleDest(dir)) {
validFiles.push(name);
}
}
return validFiles;
}));
const versions = (0, (_map || _load_map()).default)();
for (var _iterator2 = files, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
var _ref3;
if (_isArray2) {
if (_i2 >= _iterator2.length) break;
_ref3 = _iterator2[_i2++];
} else {
_i2 = _iterator2.next();
if (_i2.done) break;
_ref3 = _i2.value;
}
const name = _ref3;
// check if folder starts with our prefix
if (name.indexOf(prefix) !== 0) {
continue;
}
const dir = path.join(cacheFolder, name);
// read manifest and validate correct name
const pkg = yield _this2.config.readManifest(dir, NPM_REGISTRY_ID);
if (pkg.name !== _this2.name) {
continue;
}
// read package metadata
const metadata = yield _this2.config.readPackageMetadata(dir);
if (!metadata.remote) {
continue; // old yarn metadata
}
versions[pkg.version] = Object.assign({}, pkg, {
_remote: metadata.remote
});
}
const satisfied = yield _this2.config.resolveConstraints(Object.keys(versions), _this2.range);
if (satisfied) {
return versions[satisfied];
} else if (!_this2.config.preferOffline) {
throw new (_errors || _load_errors()).MessageError(_this2.reporter.lang('couldntFindPackageInCache', _this2.name, _this2.range, Object.keys(versions).join(', ')));
} else {
return null;
}
})();
}
cleanRegistry(url) {
if (this.config.getOption('registry') === (_constants || _load_constants()).YARN_REGISTRY) {
return url.replace(NPM_REGISTRY, (_constants || _load_constants()).YARN_REGISTRY);
} else {
return url;
}
}
resolve() {
var _this3 = this;
return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {
// lockfile
const shrunk = _this3.request.getLocked('tarball');
if (shrunk) {
if (_this3.config.packBuiltPackages && shrunk.prebuiltVariants && shrunk._remote) {
const prebuiltVariants = shrunk.prebuiltVariants;
const prebuiltName = (0, (_packageNameUtils || _load_packageNameUtils()).getPlatformSpecificPackageFilename)(shrunk);
const offlineMirrorPath = _this3.config.getOfflineMirrorPath();
if (prebuiltVariants[prebuiltName] && offlineMirrorPath) {
const filename = path.join(offlineMirrorPath, 'prebuilt', prebuiltName + '.tgz');
if (shrunk._remote && (yield (_fs || _load_fs()).exists(filename))) {
shrunk._remote.reference = `file:${filename}`;
shrunk._remote.hash = prebuiltVariants[prebuiltName];
}
}
}
return shrunk;
}
const info = yield _this3.resolveRequest();
if (info == null) {
throw new (_errors || _load_errors()).MessageError(_this3.reporter.lang('packageNotFoundRegistry', _this3.name, NPM_REGISTRY_ID));
}
const deprecated = info.deprecated,
dist = info.dist;
if (typeof deprecated === 'string') {
let human = `${info.name}@${info.version}`;
const parentNames = _this3.request.parentNames;
if (parentNames.length) {
human = parentNames.concat(human).join(' > ');
}
_this3.reporter.warn(`${human}: ${deprecated}`);
}
if (dist != null && dist.tarball) {
info._remote = {
resolved: `${_this3.cleanRegistry(dist.tarball)}#${dist.shasum}`,
type: 'tarball',
reference: _this3.cleanRegistry(dist.tarball),
hash: dist.shasum,
registry: NPM_REGISTRY_ID,
packageName: info.name
};
}
info._uid = info.version;
return info;
})();
}
}
exports.default = NpmResolver;
NpmResolver.registry = NPM_REGISTRY_ID;