diff --git a/package.json b/package.json index 0d329ac8..3e4ab7d7 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "inquirer": "^7.1.0", "qs": "^6.9.3", "semver": "^7.3.0", + "tslib": "~1.11.2", "tsv": "^0.2.0", "twilio": "^3.43.1" }, diff --git a/src/services/require-install.js b/src/services/require-install.js index 59c093ac..ba6e302f 100644 --- a/src/services/require-install.js +++ b/src/services/require-install.js @@ -94,16 +94,16 @@ const requireInstall = async (packageName, command) => { } // If we're here, attempt to install the package in the plugin's runtime modules path. - try { - logger.warn(`Installing ${packageName} ...`); - const packageTag = targetVersion ? `${packageName}@${targetVersion}` : packageName; - const plugins = new Plugins({ dataDir: pluginPath, cacheDir: pluginPath }); + logger.warn(`Installing ${packageName} ...`); + const plugins = new Plugins({ dataDir: pluginPath, cacheDir: pluginPath }); + try { // Init the PJSON in case it doesn't exist. This is required by yarn or it // moves up the dir tree until it finds one. await plugins.createPJSON(); // Force install the package in case it's a native module that needs rebuilding. + const packageTag = targetVersion ? `${packageName}@${targetVersion}` : packageName; await plugins.yarn.exec(['add', '--force', packageTag], { cwd: pluginPath, verbose: false }); } catch (error) { logger.debug(`Error installing ${packageName}: ${error}`); diff --git a/test/services/require-install.test.js b/test/services/require-install.test.js index 0254dfeb..c7eaae48 100644 --- a/test/services/require-install.test.js +++ b/test/services/require-install.test.js @@ -1,6 +1,7 @@ const tmp = require('tmp'); const { expect, test } = require('@twilio/cli-test'); const { getCommandPlugin, getPackageVersion, getDependencyVersion, checkVersion, requireInstall } = require('../../src/services/require-install'); +const { logger, LoggingLevel } = require('../../src/services/messaging/logging'); const corePJSON = require('../../package.json'); const TOP_PLUGIN = { @@ -95,13 +96,24 @@ describe('services', () => { }); describe('requireInstall', () => { + before(() => { + logger.config.level = LoggingLevel.debug; + }); + + after(() => { + logger.config.level = LoggingLevel.info; + }); + test.it('can load existing packages', () => { expect(requireInstall('chai')).to.not.be.undefined; }); - test.it('will attempt to install packages', async () => { + test.stderr().it('will attempt to install packages', async ctx => { const command = { id: 'top-command', config }; await expect(requireInstall('chai-dai', command)).to.be.rejected; + expect(ctx.stderr).to.contain('Error loading chai-dai'); + expect(ctx.stderr).to.contain('Installing chai-dai'); + expect(ctx.stderr).to.contain('Error installing chai-dai'); }); }); });