UNPKG

ember-try

Version:

An ember-cli addon to test against multiple dependencies, such as ember and ember-data.

65 lines (54 loc) 1.96 kB
'use strict'; const semver = require('semver'); const { LOCKFILE } = require('../utils/package-managers'); const { BaseAdapter } = require('./base'); module.exports = class PnpmAdapter extends BaseAdapter { defaultInstallOptions = ['--no-lockfile', '--ignore-scripts']; lockfile = LOCKFILE.pnpm; name = 'pnpm'; overridesKey = 'pnpm.overrides'; async setup() { await this._throwOnResolutionMode(); await super.setup(); } /** * pnpm versions 8.0.0 through 8.6.* have the `resolution-mode` setting inverted to * `lowest-direct`, which breaks ember-try. This method throws a helpful error in the following * case: pnpm version is within dangerous range and `pnpm config get resolution-mode` reports an * empty value. * * @returns Promise<void> */ async _throwOnResolutionMode() { let version = await this._getPnpmVersion(); let resolutionMode = await this._getResolutionMode(); if (this._isResolutionModeWrong(version, resolutionMode)) { throw new Error( 'You are using an old version of pnpm that uses wrong resolution mode that violates ember-try expectations. Please either upgrade pnpm or set `resolution-mode` to `highest` in `.npmrc`.', ); } } async _getPnpmVersion() { let result = await this.run('pnpm', ['--version'], { cwd: this.cwd, stdio: 'pipe' }); return result.stdout.split('\n')[0]; } async _getResolutionMode() { let result = await this.run('pnpm', ['config', 'get', 'resolution-mode'], { cwd: this.cwd, stdio: 'pipe', }); return result.stdout.split('\n')[0]; } _isResolutionModeWrong(versionStr, resolutionMode) { // The `resolution-mode` is not set explicitly, and the current pnpm version makes it default // to `lowest-direct` if ( !resolutionMode.length && semver.gte(versionStr, '8.0.0') && semver.lt(versionStr, '8.7.0') ) { return true; } return false; } };