UNPKG

@dependabot/yarn-lib

Version:

📦🐈 Fast, reliable, and secure dependency management.

308 lines (245 loc) 10.4 kB
'use strict'; 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;