UNPKG

@dependabot/yarn-lib

Version:

📦🐈 Fast, reliable, and secure dependency management.

283 lines (228 loc) 9.83 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _asyncToGenerator2; function _load_asyncToGenerator() { return _asyncToGenerator2 = _interopRequireDefault(require('babel-runtime/helpers/asyncToGenerator')); } var _cache; function _load_cache() { return _cache = require('../../cli/commands/cache.js'); } 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 _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 path = require('path'); const semver = require('semver'); const ssri = require('ssri'); const NPM_REGISTRY_ID = 'npm'; class NpmResolver extends (_registryResolver || _load_registryResolver()).default { static findVersionInRegistryResponse(config, name, 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', 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(desiredVersion) { 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 escapedName = (_npmRegistry || _load_npmRegistry()).default.escapeName(_this.name); const desiredRange = desiredVersion || _this.range; const body = yield _this.config.registries.npm.request(escapedName); if (body) { return NpmResolver.findVersionInRegistryResponse(_this.config, escapedName, desiredRange, body, _this.request); } else { return null; } })(); } resolveRequestOffline() { var _this2 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { const packageDirs = yield _this2.config.getCache('cachedPackages', function () { return (0, (_cache || _load_cache()).getCachedPackagesDirs)(_this2.config, _this2.config.cacheFolder); }); const versions = (0, (_map || _load_map()).default)(); for (var _iterator = packageDirs, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } const dir = _ref; // check if folder contains the registry prefix if (dir.indexOf(`${NPM_REGISTRY_ID}-`) === -1) { continue; } // 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((_constants || _load_constants()).NPM_REGISTRY_RE, (_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'); const _remote = shrunk._remote; if (_remote && (yield (_fs || _load_fs()).exists(filename))) { _remote.reference = `file:${filename}`; _remote.hash = prebuiltVariants[prebuiltName]; _remote.integrity = ssri.fromHex(_remote.hash, 'sha1').toString(); } } } } if (shrunk && shrunk._remote && (shrunk._remote.integrity || _this3.config.offline || !_this3.config.autoAddIntegrity)) { // if the integrity field does not exist, we're not network-restricted, and the // migration hasn't been disabled, it needs to be created return shrunk; } const desiredVersion = shrunk && shrunk.version ? shrunk.version : null; const info = yield _this3.resolveRequest(desiredVersion); 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 (shrunk && shrunk._remote) { shrunk._remote.integrity = dist && dist.integrity ? ssri.parse(dist.integrity) : ssri.fromHex(dist && dist.shasum ? dist.shasum : '', 'sha1'); return shrunk; } 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, integrity: dist.integrity ? ssri.parse(dist.integrity) : ssri.fromHex(dist.shasum, 'sha1'), registry: NPM_REGISTRY_ID, packageName: info.name }; } info._uid = info.version; return info; })(); } } exports.default = NpmResolver; NpmResolver.registry = NPM_REGISTRY_ID;