UNPKG

@dependabot/yarn-lib

Version:

📦🐈 Fast, reliable, and secure dependency management.

1,334 lines (1,067 loc) 46.2 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.wrapLifecycle = exports.run = exports.install = exports.Install = undefined; var _extends2; function _load_extends() { return _extends2 = _interopRequireDefault(require('babel-runtime/helpers/extends')); } var _asyncToGenerator2; function _load_asyncToGenerator() { return _asyncToGenerator2 = _interopRequireDefault(require('babel-runtime/helpers/asyncToGenerator')); } let install = exports.install = (() => { var _ref24 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, lockfile) { yield wrapLifecycle(config, flags, (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { const install = new Install(flags, config, reporter, lockfile); yield install.init(); })); }); return function install(_x7, _x8, _x9, _x10) { return _ref24.apply(this, arguments); }; })(); let run = exports.run = (() => { var _ref26 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) { let lockfile; let error = 'installCommandRenamed'; if (flags.lockfile === false) { lockfile = new (_lockfile || _load_lockfile()).default(); } else { lockfile = yield (_lockfile || _load_lockfile()).default.fromDirectory(config.lockfileFolder, reporter); } if (args.length) { const exampleArgs = args.slice(); if (flags.saveDev) { exampleArgs.push('--dev'); } if (flags.savePeer) { exampleArgs.push('--peer'); } if (flags.saveOptional) { exampleArgs.push('--optional'); } if (flags.saveExact) { exampleArgs.push('--exact'); } if (flags.saveTilde) { exampleArgs.push('--tilde'); } let command = 'add'; if (flags.global) { error = 'globalFlagRemoved'; command = 'global add'; } throw new (_errors || _load_errors()).MessageError(reporter.lang(error, `yarn ${command} ${exampleArgs.join(' ')}`)); } yield install(config, reporter, flags, lockfile); }); return function run(_x11, _x12, _x13, _x14) { return _ref26.apply(this, arguments); }; })(); let wrapLifecycle = exports.wrapLifecycle = (() => { var _ref27 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, flags, factory) { yield config.executeLifecycleScript('preinstall'); yield factory(); // npm behaviour, seems kinda funky but yay compatibility yield config.executeLifecycleScript('install'); yield config.executeLifecycleScript('postinstall'); if (!config.production) { if (!config.disablePrepublish) { yield config.executeLifecycleScript('prepublish'); } yield config.executeLifecycleScript('prepare'); } }); return function wrapLifecycle(_x15, _x16, _x17) { return _ref27.apply(this, arguments); }; })(); exports.hasWrapper = hasWrapper; exports.setFlags = setFlags; var _hooks; function _load_hooks() { return _hooks = require('../../util/hooks.js'); } var _index; function _load_index() { return _index = _interopRequireDefault(require('../../util/normalize-manifest/index.js')); } var _errors; function _load_errors() { return _errors = require('../../errors.js'); } var _integrityChecker; function _load_integrityChecker() { return _integrityChecker = _interopRequireDefault(require('../../integrity-checker.js')); } var _lockfile; function _load_lockfile() { return _lockfile = _interopRequireDefault(require('../../lockfile')); } var _lockfile2; function _load_lockfile2() { return _lockfile2 = require('../../lockfile'); } var _packageFetcher; function _load_packageFetcher() { return _packageFetcher = _interopRequireWildcard(require('../../package-fetcher.js')); } var _packageInstallScripts; function _load_packageInstallScripts() { return _packageInstallScripts = _interopRequireDefault(require('../../package-install-scripts.js')); } var _packageCompatibility; function _load_packageCompatibility() { return _packageCompatibility = _interopRequireWildcard(require('../../package-compatibility.js')); } var _packageResolver; function _load_packageResolver() { return _packageResolver = _interopRequireDefault(require('../../package-resolver.js')); } var _packageLinker; function _load_packageLinker() { return _packageLinker = _interopRequireDefault(require('../../package-linker.js')); } var _index2; function _load_index2() { return _index2 = require('../../registries/index.js'); } var _index3; function _load_index3() { return _index3 = require('../../resolvers/index.js'); } var _autoclean; function _load_autoclean() { return _autoclean = require('./autoclean.js'); } var _constants; function _load_constants() { return _constants = _interopRequireWildcard(require('../../constants.js')); } var _normalizePattern; function _load_normalizePattern() { return _normalizePattern = require('../../util/normalize-pattern.js'); } var _fs; function _load_fs() { return _fs = _interopRequireWildcard(require('../../util/fs.js')); } var _map; function _load_map() { return _map = _interopRequireDefault(require('../../util/map.js')); } var _yarnVersion; function _load_yarnVersion() { return _yarnVersion = require('../../util/yarn-version.js'); } var _workspaceLayout; function _load_workspaceLayout() { return _workspaceLayout = _interopRequireDefault(require('../../workspace-layout.js')); } var _resolutionMap; function _load_resolutionMap() { return _resolutionMap = _interopRequireDefault(require('../../resolution-map.js')); } var _guessName; function _load_guessName() { return _guessName = _interopRequireDefault(require('../../util/guess-name')); } 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 deepEqual = require('deepequal'); const emoji = require('node-emoji'); const invariant = require('invariant'); const path = require('path'); const semver = require('semver'); const uuid = require('uuid'); const ONE_DAY = 1000 * 60 * 60 * 24; /** * Try and detect the installation method for Yarn and provide a command to update it with. */ function getUpdateCommand(installationMethod) { if (installationMethod === 'tar') { return `curl -o- -L ${(_constants || _load_constants()).YARN_INSTALLER_SH} | bash`; } if (installationMethod === 'homebrew') { return 'brew upgrade yarn'; } if (installationMethod === 'deb') { return 'sudo apt-get update && sudo apt-get install yarn'; } if (installationMethod === 'rpm') { return 'sudo yum install yarn'; } if (installationMethod === 'npm') { return 'npm install --global yarn'; } if (installationMethod === 'chocolatey') { return 'choco upgrade yarn'; } if (installationMethod === 'apk') { return 'apk update && apk add -u yarn'; } return null; } function getUpdateInstaller(installationMethod) { // Windows if (installationMethod === 'msi') { return (_constants || _load_constants()).YARN_INSTALLER_MSI; } return null; } function normalizeFlags(config, rawFlags) { const flags = { // install har: !!rawFlags.har, ignorePlatform: !!rawFlags.ignorePlatform, ignoreEngines: !!rawFlags.ignoreEngines, ignoreScripts: !!rawFlags.ignoreScripts, ignoreOptional: !!rawFlags.ignoreOptional, force: !!rawFlags.force, flat: !!rawFlags.flat, lockfile: rawFlags.lockfile !== false, pureLockfile: !!rawFlags.pureLockfile, updateChecksums: !!rawFlags.updateChecksums, skipIntegrityCheck: !!rawFlags.skipIntegrityCheck, frozenLockfile: !!rawFlags.frozenLockfile, linkDuplicates: !!rawFlags.linkDuplicates, checkFiles: !!rawFlags.checkFiles, // add peer: !!rawFlags.peer, dev: !!rawFlags.dev, optional: !!rawFlags.optional, exact: !!rawFlags.exact, tilde: !!rawFlags.tilde, ignoreWorkspaceRootCheck: !!rawFlags.ignoreWorkspaceRootCheck, // outdated, update-interactive includeWorkspaceDeps: !!rawFlags.includeWorkspaceDeps, // add, remove, update workspaceRootIsCwd: rawFlags.workspaceRootIsCwd !== false }; if (config.getOption('ignore-scripts')) { flags.ignoreScripts = true; } if (config.getOption('ignore-platform')) { flags.ignorePlatform = true; } if (config.getOption('ignore-engines')) { flags.ignoreEngines = true; } if (config.getOption('ignore-optional')) { flags.ignoreOptional = true; } if (config.getOption('force')) { flags.force = true; } return flags; } class Install { constructor(flags, config, reporter, lockfile) { this.rootManifestRegistries = []; this.rootPatternsToOrigin = (0, (_map || _load_map()).default)(); this.lockfile = lockfile; this.reporter = reporter; this.config = config; this.flags = normalizeFlags(config, flags); this.resolutions = (0, (_map || _load_map()).default)(); // Legacy resolutions field used for flat install mode this.resolutionMap = new (_resolutionMap || _load_resolutionMap()).default(config); // Selective resolutions for nested dependencies this.resolver = new (_packageResolver || _load_packageResolver()).default(config, lockfile, this.resolutionMap); this.integrityChecker = new (_integrityChecker || _load_integrityChecker()).default(config); this.linker = new (_packageLinker || _load_packageLinker()).default(config, this.resolver); this.scripts = new (_packageInstallScripts || _load_packageInstallScripts()).default(config, this.resolver, this.flags.force); } /** * Create a list of dependency requests from the current directories manifests. */ fetchRequestFromCwd(excludePatterns = [], ignoreUnusedPatterns = false) { var _this = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { const patterns = []; const deps = []; let resolutionDeps = []; const manifest = {}; const ignorePatterns = []; const usedPatterns = []; let workspaceLayout; // some commands should always run in the context of the entire workspace const cwd = _this.flags.includeWorkspaceDeps || _this.flags.workspaceRootIsCwd ? _this.config.lockfileFolder : _this.config.cwd; // non-workspaces are always root, otherwise check for workspace root const cwdIsRoot = !_this.config.workspaceRootFolder || _this.config.lockfileFolder === cwd; // exclude package names that are in install args const excludeNames = []; for (var _iterator = excludePatterns, _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 pattern = _ref; if ((0, (_index3 || _load_index3()).getExoticResolver)(pattern)) { excludeNames.push((0, (_guessName || _load_guessName()).default)(pattern)); } else { // extract the name const parts = (0, (_normalizePattern || _load_normalizePattern()).normalizePattern)(pattern); excludeNames.push(parts.name); } } const stripExcluded = function stripExcluded(manifest) { for (var _iterator2 = excludeNames, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } const exclude = _ref2; if (manifest.dependencies && manifest.dependencies[exclude]) { delete manifest.dependencies[exclude]; } if (manifest.devDependencies && manifest.devDependencies[exclude]) { delete manifest.devDependencies[exclude]; } if (manifest.optionalDependencies && manifest.optionalDependencies[exclude]) { delete manifest.optionalDependencies[exclude]; } } }; for (var _iterator3 = Object.keys((_index2 || _load_index2()).registries), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } const registry = _ref3; const filename = (_index2 || _load_index2()).registries[registry].filename; const loc = path.join(cwd, filename); if (!(yield (_fs || _load_fs()).exists(loc))) { continue; } _this.rootManifestRegistries.push(registry); const projectManifestJson = yield _this.config.readJson(loc); yield (0, (_index || _load_index()).default)(projectManifestJson, cwd, _this.config, cwdIsRoot); Object.assign(_this.resolutions, projectManifestJson.resolutions); Object.assign(manifest, projectManifestJson); _this.resolutionMap.init(_this.resolutions); for (var _iterator4 = Object.keys(_this.resolutionMap.resolutionsByPackage), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref4 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref4 = _i4.value; } const packageName = _ref4; for (var _iterator6 = _this.resolutionMap.resolutionsByPackage[packageName], _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref7; if (_isArray6) { if (_i6 >= _iterator6.length) break; _ref7 = _iterator6[_i6++]; } else { _i6 = _iterator6.next(); if (_i6.done) break; _ref7 = _i6.value; } const _ref6 = _ref7; const pattern = _ref6.pattern; resolutionDeps = [...resolutionDeps, { registry, pattern, optional: false, hint: 'resolution' }]; } } const pushDeps = function pushDeps(depType, manifest, { hint, optional }, isUsed) { if (ignoreUnusedPatterns && !isUsed) { return; } // We only take unused dependencies into consideration to get deterministic hoisting. // Since flat mode doesn't care about hoisting and everything is top level and specified then we can safely // leave these out. if (_this.flags.flat && !isUsed) { return; } const depMap = manifest[depType]; for (const name in depMap) { if (excludeNames.indexOf(name) >= 0) { continue; } let pattern = name; if (!_this.lockfile.getLocked(pattern)) { // when we use --save we save the dependency to the lockfile with just the name rather than the // version combo pattern += '@' + depMap[name]; } // normalization made sure packages are mentioned only once if (isUsed) { usedPatterns.push(pattern); } else { ignorePatterns.push(pattern); } _this.rootPatternsToOrigin[pattern] = depType; patterns.push(pattern); deps.push({ pattern, registry, hint, optional, workspaceName: manifest.name, workspaceLoc: manifest._loc }); } }; if (cwdIsRoot) { pushDeps('dependencies', projectManifestJson, { hint: null, optional: false }, true); pushDeps('devDependencies', projectManifestJson, { hint: 'dev', optional: false }, !_this.config.production); pushDeps('optionalDependencies', projectManifestJson, { hint: 'optional', optional: true }, true); } if (_this.config.workspaceRootFolder) { const workspaceLoc = cwdIsRoot ? loc : path.join(_this.config.lockfileFolder, filename); const workspacesRoot = path.dirname(workspaceLoc); let workspaceManifestJson = projectManifestJson; if (!cwdIsRoot) { // the manifest we read before was a child workspace, so get the root workspaceManifestJson = yield _this.config.readJson(workspaceLoc); yield (0, (_index || _load_index()).default)(workspaceManifestJson, workspacesRoot, _this.config, true); } const workspaces = yield _this.config.resolveWorkspaces(workspacesRoot, workspaceManifestJson); workspaceLayout = new (_workspaceLayout || _load_workspaceLayout()).default(workspaces, _this.config); // add virtual manifest that depends on all workspaces, this way package hoisters and resolvers will work fine const workspaceDependencies = (0, (_extends2 || _load_extends()).default)({}, workspaceManifestJson.dependencies); for (var _iterator5 = Object.keys(workspaces), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { var _ref5; if (_isArray5) { if (_i5 >= _iterator5.length) break; _ref5 = _iterator5[_i5++]; } else { _i5 = _iterator5.next(); if (_i5.done) break; _ref5 = _i5.value; } const workspaceName = _ref5; const workspaceManifest = workspaces[workspaceName].manifest; workspaceDependencies[workspaceName] = workspaceManifest.version; // include dependencies from all workspaces if (_this.flags.includeWorkspaceDeps) { pushDeps('dependencies', workspaceManifest, { hint: null, optional: false }, true); pushDeps('devDependencies', workspaceManifest, { hint: 'dev', optional: false }, !_this.config.production); pushDeps('optionalDependencies', workspaceManifest, { hint: 'optional', optional: true }, true); } } const virtualDependencyManifest = { _uid: '', name: `workspace-aggregator-${uuid.v4()}`, version: '1.0.0', _registry: 'npm', _loc: workspacesRoot, dependencies: workspaceDependencies, devDependencies: (0, (_extends2 || _load_extends()).default)({}, workspaceManifestJson.devDependencies), optionalDependencies: (0, (_extends2 || _load_extends()).default)({}, workspaceManifestJson.optionalDependencies), private: workspaceManifestJson.private, workspaces: workspaceManifestJson.workspaces }; workspaceLayout.virtualManifestName = virtualDependencyManifest.name; const virtualDep = {}; virtualDep[virtualDependencyManifest.name] = virtualDependencyManifest.version; workspaces[virtualDependencyManifest.name] = { loc: workspacesRoot, manifest: virtualDependencyManifest }; // ensure dependencies that should be excluded are stripped from the correct manifest stripExcluded(cwdIsRoot ? virtualDependencyManifest : workspaces[projectManifestJson.name].manifest); pushDeps('workspaces', { workspaces: virtualDep }, { hint: 'workspaces', optional: false }, true); } break; } // inherit root flat flag if (manifest.flat) { _this.flags.flat = true; } return { requests: [...resolutionDeps, ...deps], patterns, manifest, usedPatterns, ignorePatterns, workspaceLayout }; })(); } /** * TODO description */ prepareRequests(requests) { return requests; } preparePatterns(patterns) { return patterns; } preparePatternsForLinking(patterns, cwdManifest, cwdIsRoot) { return patterns; } bailout(patterns, workspaceLayout) { var _this2 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { if (_this2.flags.skipIntegrityCheck || _this2.flags.force) { return false; } const lockfileCache = _this2.lockfile.cache; if (!lockfileCache) { return false; } const lockfileClean = _this2.lockfile.parseResultType === 'success'; const match = yield _this2.integrityChecker.check(patterns, lockfileCache, _this2.flags, workspaceLayout); if (_this2.flags.frozenLockfile && (!lockfileClean || match.missingPatterns.length > 0)) { throw new (_errors || _load_errors()).MessageError(_this2.reporter.lang('frozenLockfileError')); } const haveLockfile = yield (_fs || _load_fs()).exists(path.join(_this2.config.lockfileFolder, (_constants || _load_constants()).LOCKFILE_FILENAME)); if (match.integrityMatches && haveLockfile && lockfileClean) { _this2.reporter.success(_this2.reporter.lang('upToDate')); return true; } if (match.integrityFileMissing && haveLockfile) { // Integrity file missing, force script installations _this2.scripts.setForce(true); return false; } if (match.hardRefreshRequired) { // e.g. node version doesn't match, force script installations _this2.scripts.setForce(true); return false; } if (!patterns.length && !match.integrityFileMissing) { _this2.reporter.success(_this2.reporter.lang('nothingToInstall')); yield _this2.createEmptyManifestFolders(); yield _this2.saveLockfileAndIntegrity(patterns, workspaceLayout); return true; } return false; })(); } /** * Produce empty folders for all used root manifests. */ createEmptyManifestFolders() { var _this3 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { if (_this3.config.modulesFolder) { // already created return; } for (var _iterator7 = _this3.rootManifestRegistries, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { var _ref8; if (_isArray7) { if (_i7 >= _iterator7.length) break; _ref8 = _iterator7[_i7++]; } else { _i7 = _iterator7.next(); if (_i7.done) break; _ref8 = _i7.value; } const registryName = _ref8; const folder = _this3.config.registries[registryName].folder; yield (_fs || _load_fs()).mkdirp(path.join(_this3.config.lockfileFolder, folder)); } })(); } /** * TODO description */ markIgnored(patterns) { for (var _iterator8 = patterns, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) { var _ref9; if (_isArray8) { if (_i8 >= _iterator8.length) break; _ref9 = _iterator8[_i8++]; } else { _i8 = _iterator8.next(); if (_i8.done) break; _ref9 = _i8.value; } const pattern = _ref9; const manifest = this.resolver.getStrictResolvedPattern(pattern); const ref = manifest._reference; invariant(ref, 'expected package reference'); // just mark the package as ignored. if the package is used by a required package, the hoister // will take care of that. ref.ignore = true; } } /** * helper method that gets only recent manifests * used by global.ls command */ getFlattenedDeps() { var _this4 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { var _ref10 = yield _this4.fetchRequestFromCwd(); const depRequests = _ref10.requests, rawPatterns = _ref10.patterns; yield _this4.resolver.init(depRequests, {}); const manifests = yield (_packageFetcher || _load_packageFetcher()).fetch(_this4.resolver.getManifests(), _this4.config); _this4.resolver.updateManifests(manifests); return _this4.flatten(rawPatterns); })(); } /** * TODO description */ init() { var _this5 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { _this5.checkUpdate(); // warn if we have a shrinkwrap if (yield (_fs || _load_fs()).exists(path.join(_this5.config.lockfileFolder, 'npm-shrinkwrap.json'))) { _this5.reporter.warn(_this5.reporter.lang('shrinkwrapWarning')); } let flattenedTopLevelPatterns = []; const steps = []; var _ref11 = yield _this5.fetchRequestFromCwd(); const depRequests = _ref11.requests, rawPatterns = _ref11.patterns, ignorePatterns = _ref11.ignorePatterns, workspaceLayout = _ref11.workspaceLayout, manifest = _ref11.manifest; let topLevelPatterns = []; const artifacts = yield _this5.integrityChecker.getArtifacts(); if (artifacts) { _this5.linker.setArtifacts(artifacts); _this5.scripts.setArtifacts(artifacts); } if (!_this5.flags.ignoreEngines && typeof manifest.engines === 'object') { steps.push((() => { var _ref12 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (curr, total) { _this5.reporter.step(curr, total, _this5.reporter.lang('checkingManifest'), emoji.get('mag')); yield (_packageCompatibility || _load_packageCompatibility()).checkOne((0, (_extends2 || _load_extends()).default)({ _reference: {} }, manifest), _this5.config, _this5.flags.ignoreEngines); }); return function (_x, _x2) { return _ref12.apply(this, arguments); }; })()); } steps.push(function (curr, total) { return (0, (_hooks || _load_hooks()).callThroughHook)('resolveStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { _this5.reporter.step(curr, total, _this5.reporter.lang('resolvingPackages'), emoji.get('mag')); _this5.resolutionMap.setTopLevelPatterns(rawPatterns); yield _this5.resolver.init(_this5.prepareRequests(depRequests), { isFlat: _this5.flags.flat, isFrozen: _this5.flags.frozenLockfile, workspaceLayout }); topLevelPatterns = _this5.preparePatterns(rawPatterns); flattenedTopLevelPatterns = yield _this5.flatten(topLevelPatterns); return { bailout: yield _this5.bailout(topLevelPatterns, workspaceLayout) }; })); }); steps.push(function (curr, total) { return (0, (_hooks || _load_hooks()).callThroughHook)('fetchStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { _this5.markIgnored(ignorePatterns); _this5.reporter.step(curr, total, _this5.reporter.lang('fetchingPackages'), emoji.get('truck')); const manifests = yield (_packageFetcher || _load_packageFetcher()).fetch(_this5.resolver.getManifests(), _this5.config); _this5.resolver.updateManifests(manifests); yield (_packageCompatibility || _load_packageCompatibility()).check(_this5.resolver.getManifests(), _this5.config, _this5.flags.ignoreEngines); })); }); steps.push(function (curr, total) { return (0, (_hooks || _load_hooks()).callThroughHook)('linkStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { // remove integrity hash to make this operation atomic yield _this5.integrityChecker.removeIntegrityFile(); _this5.reporter.step(curr, total, _this5.reporter.lang('linkingDependencies'), emoji.get('link')); flattenedTopLevelPatterns = _this5.preparePatternsForLinking(flattenedTopLevelPatterns, manifest, _this5.config.lockfileFolder === _this5.config.cwd); yield _this5.linker.init(flattenedTopLevelPatterns, workspaceLayout, { linkDuplicates: _this5.flags.linkDuplicates, ignoreOptional: _this5.flags.ignoreOptional }); })); }); steps.push(function (curr, total) { return (0, (_hooks || _load_hooks()).callThroughHook)('buildStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { _this5.reporter.step(curr, total, _this5.flags.force ? _this5.reporter.lang('rebuildingPackages') : _this5.reporter.lang('buildingFreshPackages'), emoji.get('page_with_curl')); if (_this5.flags.ignoreScripts) { _this5.reporter.warn(_this5.reporter.lang('ignoredScripts')); } else { yield _this5.scripts.init(flattenedTopLevelPatterns); } })); }); if (_this5.flags.har) { steps.push((() => { var _ref17 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (curr, total) { const formattedDate = new Date().toISOString().replace(/:/g, '-'); const filename = `yarn-install_${formattedDate}.har`; _this5.reporter.step(curr, total, _this5.reporter.lang('savingHar', filename), emoji.get('black_circle_for_record')); yield _this5.config.requestManager.saveHar(filename); }); return function (_x3, _x4) { return _ref17.apply(this, arguments); }; })()); } if (yield _this5.shouldClean()) { steps.push((() => { var _ref18 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (curr, total) { _this5.reporter.step(curr, total, _this5.reporter.lang('cleaningModules'), emoji.get('recycle')); yield (0, (_autoclean || _load_autoclean()).clean)(_this5.config, _this5.reporter); }); return function (_x5, _x6) { return _ref18.apply(this, arguments); }; })()); } let currentStep = 0; for (var _iterator9 = steps, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) { var _ref19; if (_isArray9) { if (_i9 >= _iterator9.length) break; _ref19 = _iterator9[_i9++]; } else { _i9 = _iterator9.next(); if (_i9.done) break; _ref19 = _i9.value; } const step = _ref19; const stepResult = yield step(++currentStep, steps.length); if (stepResult && stepResult.bailout) { _this5.maybeOutputUpdate(); return flattenedTopLevelPatterns; } } // fin! // The second condition is to make sure lockfile can be updated when running `remove` command. if (topLevelPatterns.length || (yield (_fs || _load_fs()).exists(path.join(_this5.config.lockfileFolder, (_constants || _load_constants()).LOCKFILE_FILENAME)))) { yield _this5.saveLockfileAndIntegrity(topLevelPatterns, workspaceLayout); } else { _this5.reporter.info(_this5.reporter.lang('notSavedLockfileNoDependencies')); } _this5.maybeOutputUpdate(); _this5.config.requestManager.clearCache(); return flattenedTopLevelPatterns; })(); } /** * Check if we should run the cleaning step. */ shouldClean() { return (_fs || _load_fs()).exists(path.join(this.config.lockfileFolder, (_constants || _load_constants()).CLEAN_FILENAME)); } /** * TODO */ flatten(patterns) { var _this6 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { if (!_this6.flags.flat) { return patterns; } const flattenedPatterns = []; for (var _iterator10 = _this6.resolver.getAllDependencyNamesByLevelOrder(patterns), _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) { var _ref20; if (_isArray10) { if (_i10 >= _iterator10.length) break; _ref20 = _iterator10[_i10++]; } else { _i10 = _iterator10.next(); if (_i10.done) break; _ref20 = _i10.value; } const name = _ref20; const infos = _this6.resolver.getAllInfoForPackageName(name).filter(function (manifest) { const ref = manifest._reference; invariant(ref, 'expected package reference'); return !ref.ignore; }); if (infos.length === 0) { continue; } if (infos.length === 1) { // single version of this package // take out a single pattern as multiple patterns may have resolved to this package flattenedPatterns.push(_this6.resolver.patternsByPackage[name][0]); continue; } const options = infos.map(function (info) { const ref = info._reference; invariant(ref, 'expected reference'); return { // TODO `and is required by {PARENT}`, name: _this6.reporter.lang('manualVersionResolutionOption', ref.patterns.join(', '), info.version), value: info.version }; }); const versions = infos.map(function (info) { return info.version; }); let version; const resolutionVersion = _this6.resolutions[name]; if (resolutionVersion && versions.indexOf(resolutionVersion) >= 0) { // use json `resolution` version version = resolutionVersion; } else { version = yield _this6.reporter.select(_this6.reporter.lang('manualVersionResolution', name), _this6.reporter.lang('answer'), options); _this6.resolutions[name] = version; } flattenedPatterns.push(_this6.resolver.collapseAllVersionsOfPackage(name, version)); } // save resolutions to their appropriate root manifest if (Object.keys(_this6.resolutions).length) { const manifests = yield _this6.config.getRootManifests(); for (const name in _this6.resolutions) { const version = _this6.resolutions[name]; const patterns = _this6.resolver.patternsByPackage[name]; if (!patterns) { continue; } let manifest; for (var _iterator11 = patterns, _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) { var _ref21; if (_isArray11) { if (_i11 >= _iterator11.length) break; _ref21 = _iterator11[_i11++]; } else { _i11 = _iterator11.next(); if (_i11.done) break; _ref21 = _i11.value; } const pattern = _ref21; manifest = _this6.resolver.getResolvedPattern(pattern); if (manifest) { break; } } invariant(manifest, 'expected manifest'); const ref = manifest._reference; invariant(ref, 'expected reference'); const object = manifests[ref.registry].object; object.resolutions = object.resolutions || {}; object.resolutions[name] = version; } yield _this6.config.saveRootManifests(manifests); } return flattenedPatterns; })(); } /** * Remove offline tarballs that are no longer required */ pruneOfflineMirror(lockfile) { var _this7 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { const mirror = _this7.config.getOfflineMirrorPath(); if (!mirror) { return; } const requiredTarballs = new Set(); for (const dependency in lockfile) { const resolved = lockfile[dependency].resolved; if (resolved) { const basename = path.basename(resolved.split('#')[0]); if (dependency[0] === '@' && basename[0] !== '@') { requiredTarballs.add(`${dependency.split('/')[0]}-${basename}`); } requiredTarballs.add(basename); } } const mirrorFiles = yield (_fs || _load_fs()).walk(mirror); for (var _iterator12 = mirrorFiles, _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator]();;) { var _ref22; if (_isArray12) { if (_i12 >= _iterator12.length) break; _ref22 = _iterator12[_i12++]; } else { _i12 = _iterator12.next(); if (_i12.done) break; _ref22 = _i12.value; } const file = _ref22; const isTarball = path.extname(file.basename) === '.tgz'; if (isTarball && !requiredTarballs.has(file.basename)) { yield (_fs || _load_fs()).unlink(file.absolute); } } })(); } /** * Save updated integrity and lockfiles. */ saveLockfileAndIntegrity(patterns, workspaceLayout) { var _this8 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { const resolvedPatterns = {}; Object.keys(_this8.resolver.patterns).forEach(function (pattern) { if (!workspaceLayout || !workspaceLayout.getManifestByPattern(pattern)) { resolvedPatterns[pattern] = _this8.resolver.patterns[pattern]; } }); // TODO this code is duplicated in a few places, need a common way to filter out workspace patterns from lockfile patterns = patterns.filter(function (p) { return !workspaceLayout || !workspaceLayout.getManifestByPattern(p); }); const lockfileBasedOnResolver = _this8.lockfile.getLockfile(resolvedPatterns); if (_this8.config.pruneOfflineMirror) { yield _this8.pruneOfflineMirror(lockfileBasedOnResolver); } // write integrity hash yield _this8.integrityChecker.save(patterns, lockfileBasedOnResolver, _this8.flags, workspaceLayout, _this8.scripts.getArtifacts()); // --no-lockfile or --pure-lockfile or --frozen-lockfile flag if (_this8.flags.lockfile === false || _this8.flags.pureLockfile || _this8.flags.frozenLockfile) { return; } const lockFileHasAllPatterns = patterns.every(function (p) { return _this8.lockfile.getLocked(p); }); const lockfilePatternsMatch = Object.keys(_this8.lockfile.cache || {}).every(function (p) { return lockfileBasedOnResolver[p]; }); const resolverPatternsAreSameAsInLockfile = Object.keys(lockfileBasedOnResolver).every(function (pattern) { const manifest = _this8.lockfile.getLocked(pattern); return manifest && manifest.resolved === lockfileBasedOnResolver[pattern].resolved && deepEqual(manifest.prebuiltVariants, lockfileBasedOnResolver[pattern].prebuiltVariants); }); // remove command is followed by install with force, lockfile will be rewritten in any case then if (!_this8.flags.force && _this8.lockfile.parseResultType === 'success' && lockFileHasAllPatterns && lockfilePatternsMatch && resolverPatternsAreSameAsInLockfile && patterns.length) { return; } // build lockfile location const loc = path.join(_this8.config.lockfileFolder, (_constants || _load_constants()).LOCKFILE_FILENAME); // write lockfile const lockSource = (0, (_lockfile2 || _load_lockfile2()).stringify)(lockfileBasedOnResolver, false, _this8.config.enableLockfileVersions); yield (_fs || _load_fs()).writeFilePreservingEol(loc, lockSource); _this8._logSuccessSaveLockfile(); })(); } _logSuccessSaveLockfile() { this.reporter.success(this.reporter.lang('savedLockfile')); } /** * Load the dependency graph of the current install. Only does package resolving and wont write to the cwd. */ hydrate(ignoreUnusedPatterns) { var _this9 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { const request = yield _this9.fetchRequestFromCwd([], ignoreUnusedPatterns); const depRequests = request.requests, rawPatterns = request.patterns, ignorePatterns = request.ignorePatterns, workspaceLayout = request.workspaceLayout; yield _this9.resolver.init(depRequests, { isFlat: _this9.flags.flat, isFrozen: _this9.flags.frozenLockfile, workspaceLayout }); yield _this9.flatten(rawPatterns); _this9.markIgnored(ignorePatterns); // fetch packages, should hit cache most of the time const manifests = yield (_packageFetcher || _load_packageFetcher()).fetch(_this9.resolver.getManifests(), _this9.config); _this9.resolver.updateManifests(manifests); yield (_packageCompatibility || _load_packageCompatibility()).check(_this9.resolver.getManifests(), _this9.config, _this9.flags.ignoreEngines); // expand minimal manifests for (var _iterator13 = _this9.resolver.getManifests(), _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator]();;) { var _ref23; if (_isArray13) { if (_i13 >= _iterator13.length) break; _ref23 = _iterator13[_i13++]; } else { _i13 = _iterator13.next(); if (_i13.done) break; _ref23 = _i13.value; } const manifest = _ref23; const ref = manifest._reference; invariant(ref, 'expected reference'); const type = ref.remote.type; // link specifier won't ever hit cache let loc = ''; if (type === 'link') { continue; } else if (type === 'workspace') { if (!ref.remote.reference) { continue; } loc = ref.remote.reference; } else { loc = _this9.config.generateHardModulePath(ref); } const newPkg = yield _this9.config.readManifest(loc); yield _this9.resolver.updateManifest(ref, newPkg); } return request; })(); } /** * Check for updates every day and output a nag message if there's a newer version. */ checkUpdate() { if (this.config.nonInteractive) { // don't show upgrade dialog on CI or non-TTY terminals return; } // don't check if disabled if (this.config.getOption('disable-self-update-check')) { return; } // only check for updates once a day const lastUpdateCheck = Number(this.config.getOption('lastUpdateCheck')) || 0; if (lastUpdateCheck && Date.now() - lastUpdateCheck < ONE_DAY) { return; } // don't bug for updates on tagged releases if ((_yarnVersion || _load_yarnVersion()).version.indexOf('-') >= 0) { return; } this._checkUpdate().catch(() => { // swallow errors }); } _checkUpdate() { var _this10 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { let latestVersion = yield _this10.config.requestManager.request({ url: (_constants || _load_constants()).SELF_UPDATE_VERSION_URL }); invariant(typeof latestVersion === 'string', 'expected string'); latestVersion = latestVersion.trim(); if (!semver.valid(latestVersion)) { return; } // ensure we only check for updates periodically _this10.config.registries.yarn.saveHomeConfig({ lastUpdateCheck: Date.now() }); if (semver.gt(latestVersion, (_yarnVersion || _load_yarnVersion()).version)) { const installationMethod = yield (0, (_yarnVersion || _load_yarnVersion()).getInstallationMethod)(); _this10.maybeOutputUpdate = function () { _this10.reporter.warn(_this10.reporter.lang('yarnOutdated', latestVersion, (_yarnVersion || _load_yarnVersion()).version)); const command = getUpdateCommand(installationMethod); if (command) { _this10.reporter.info(_this10.reporter.lang('yarnOutdatedCommand')); _this10.reporter.command(command); } else { const installer = getUpdateInstaller(installationMethod); if (installer) { _this10.reporter.info(_this10.reporter.lang('yarnOutdatedInstaller', installer)); } } }; } })(); } /** * Method to override with a possible upgrade message. */ maybeOutputUpdate() {} } exports.Install = Install; function hasWrapper(commander, args) { return true; } function setFlags(commander) { commander.description('Yarn install is used to install all dependencies for a project.'); commander.usage('install [flags]'); commander.option('-g, --global', 'DEPRECATED'); commander.option('-S, --save', 'DEPRECATED - save package to your `dependencies`'); commander.option('-D, --save-dev', 'DEPRECATED - save package to your `devDependencies`'); commander.option('-P, --save-peer', 'DEPRECATED - save package to your `peerDependencies`'); commander.option('-O, --save-optional', 'DEPRECATED - save package to your `optionalDependencies`'); commander.option('-E, --save-exact', 'DEPRECATED'); commander.option('-T, --save-tilde', 'DEPRECATED'); }