Skip to content

Commit 0fc0389

Browse files
authored
Merge pull request #345 from browserstack/AFD-985-update-npm-v8-installation-method
Update npm v7+ installation method
2 parents ab7f2c9 + 5e8e8d6 commit 0fc0389

File tree

4 files changed

+107
-6
lines changed

4 files changed

+107
-6
lines changed

bin/helpers/packageInstaller.js

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
fileHelpers = require('./fileHelpers'),
66
logger = require("./logger").winstonLogger,
77
Constants = require('./constants'),
8-
process = require('process'),
98
utils = require('./utils'),
9+
{ get_version } = require('./usageReporting'),
10+
process = require('process'),
1011
{ spawn } = require('child_process'),
1112
util = require('util');
1213

@@ -64,15 +65,30 @@ const packageInstall = (packageDir) => {
6465
logger.info(`Packages were installed locally successfully.`);
6566
resolve('Packages were installed successfully.');
6667
} else {
67-
logger.error(`Some error occurred while installing packages. Error code ${code}`);
68+
logger.error(`Some error occurred while installing packages. Error code ${code}. Please read npm_install_debug.log for more info.`);
6869
reject(`Packages were not installed successfully. Error code ${code}`);
6970
}
7071
};
7172
const nodeProcessErrorCallback = (error) => {
7273
logger.error(`Some error occurred while installing packages: %j`, error);
7374
reject(`Packages were not installed successfully. Error Description ${util.format('%j', error)}`);
7475
};
75-
nodeProcess = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['install', '--loglevel', 'verbose', '>', '../npm_install_debug.log', '2>&1'], {cwd: packageDir, shell: true});
76+
77+
let nodeProcess;
78+
logger.debug(`Fetching npm version and its major version`);
79+
const npm_version = get_version('npm')
80+
const npm_major_version = utils.getMajorVersion(npm_version);
81+
logger.debug(`Fetched npm version: ${npm_version} and its major version: ${npm_major_version}`);
82+
83+
// add --legacy-peer-deps flag while installing dependencies for npm v7+
84+
// For more info please read "Peer Dependencies" section here -> https://github.blog/2021-02-02-npm-7-is-now-generally-available/
85+
if (parseInt(npm_major_version) >= 7) {
86+
logger.debug(`Running NPM install command: npm install --legacy-peer-deps --loglevel verbose > ../npm_install_debug.log`);
87+
nodeProcess = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['install', '--legacy-peer-deps', '--loglevel', 'verbose', '>', '../npm_install_debug.log', '2>&1'], {cwd: packageDir, shell: true});
88+
} else {
89+
logger.debug(`Running NPM install command: 'npm install --loglevel verbose > ../npm_install_debug.log'`);
90+
nodeProcess = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['install', '--loglevel', 'verbose', '>', '../npm_install_debug.log', '2>&1'], {cwd: packageDir, shell: true});
91+
}
7692
nodeProcess.on('close', nodeProcessCloseCallback);
7793
nodeProcess.on('error', nodeProcessErrorCallback);
7894
});

bin/helpers/utils.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,3 +1233,24 @@ exports.getVideoConfig = (cypressJson) => {
12331233
logger.debug(`Setting videoUploadOnPasses = ${conf.videoUploadOnPasses}`);
12341234
return conf;
12351235
}
1236+
1237+
exports.getMajorVersion = (version) => {
1238+
try {
1239+
if (!version || !version.match(/^(\d+\.)?(\d+\.)?(\*|\d+)$/)) {
1240+
return null;
1241+
}
1242+
1243+
const matches = version.match(/^(\d+\.)?(\d+\.)?(\*|\d+)$/)
1244+
if(matches && matches.length >= 2) {
1245+
if (!matches[1]) {
1246+
return matches[0];
1247+
}
1248+
return matches[1].replace('.','');
1249+
} else {
1250+
return null;
1251+
}
1252+
} catch(error) {
1253+
logger.debug(`Some Error occurred while fetching major version of ${version}. Returning null. Error Details: ${error}`)
1254+
return null;
1255+
}
1256+
}

test/unit/bin/helpers/packageInstaller.js

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ const chai = require("chai"),
77
cp = require('child_process');
88

99
const logger = require("../../../../bin/helpers/logger").winstonLogger,
10-
fileHelpers = require("../../../../bin/helpers/fileHelpers");
10+
fileHelpers = require("../../../../bin/helpers/fileHelpers"),
11+
utils = require('../../../../bin/helpers/utils');
1112

1213
const rewire = require("rewire");
1314

@@ -214,15 +215,47 @@ describe("packageInstaller", () => {
214215
context("packageInstall", () => {
215216
const packageInstaller = rewire("../../../../bin/helpers/packageInstaller");
216217

217-
it("should call npm install on directory and resolve if spawn is closed successfully", () => {
218+
it("should call npm install on directory with npm <= 6 and resolve if spawn is closed successfully", () => {
218219
let spawnStub = sandbox.stub(cp, 'spawn').returns({
219220
on: (_close, nodeProcessCloseCallback) => {
220221
nodeProcessCloseCallback(0);
221222
}
222223
});
224+
let getMajorVersionStub = sandbox.stub(utils, 'getMajorVersion').returns('7');
223225
packageInstaller.__set__({
224226
nodeProcess: {},
225-
spawn: spawnStub
227+
spawn: spawnStub,
228+
utils: {
229+
getMajorVersion: getMajorVersionStub
230+
}
231+
});
232+
let packageInstallrewire = packageInstaller.__get__('packageInstall');
233+
let directoryPath = "/random/path";
234+
return packageInstallrewire(directoryPath)
235+
.then((data) => {
236+
console.log(data);
237+
chai.assert.equal(data, "Packages were installed successfully.")
238+
spawnStub.restore();
239+
getMajorVersionStub.restore();
240+
})
241+
.catch((_error) => {
242+
chai.assert.fail(`Promise error ${_error}`);
243+
});
244+
});
245+
246+
it("should call npm install on directory with npm >= 7 and resolve if spawn is closed successfully", () => {
247+
let spawnStub = sandbox.stub(cp, 'spawn').returns({
248+
on: (_close, nodeProcessCloseCallback) => {
249+
nodeProcessCloseCallback(0);
250+
}
251+
});
252+
let getMajorVersionStub = sandbox.stub(utils, 'getMajorVersion').returns('7');
253+
packageInstaller.__set__({
254+
nodeProcess: {},
255+
spawn: spawnStub,
256+
utils: {
257+
getMajorVersion: getMajorVersionStub
258+
}
226259
});
227260
let packageInstallrewire = packageInstaller.__get__('packageInstall');
228261
let directoryPath = "/random/path";
@@ -231,6 +264,7 @@ describe("packageInstaller", () => {
231264
console.log(data);
232265
chai.assert.equal(data, "Packages were installed successfully.")
233266
spawnStub.restore();
267+
getMajorVersionStub.restore();
234268
})
235269
.catch((_error) => {
236270
chai.assert.fail(`Promise error ${_error}`);

test/unit/bin/helpers/utils.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3378,4 +3378,34 @@ describe('utils', () => {
33783378
expect(utils.formatRequest(null, {statusCode: 500}, cricularBody)).to.be.eql({err: null, status: 500, body: '[Circular]'});
33793379
});
33803380
});
3381+
3382+
describe('getMajorVersion', () => {
3383+
it('should return null if undefined version is sent', () => {
3384+
expect(utils.getMajorVersion()).to.be.eql(null);
3385+
});
3386+
3387+
it('should return null if null version is sent', () => {
3388+
expect(utils.getMajorVersion(null)).to.be.eql(null);
3389+
});
3390+
3391+
it('should return null if improper version is sent', () => {
3392+
expect(utils.getMajorVersion('test')).to.be.eql(null);
3393+
expect(utils.getMajorVersion('a1.1.1')).to.be.eql(null);
3394+
expect(utils.getMajorVersion('1a.1.1')).to.be.eql(null);
3395+
expect(utils.getMajorVersion('1.a1.1')).to.be.eql(null);
3396+
expect(utils.getMajorVersion('1.1a.1')).to.be.eql(null);
3397+
expect(utils.getMajorVersion('1.1.a1')).to.be.eql(null);
3398+
expect(utils.getMajorVersion('1.1.1a')).to.be.eql(null);
3399+
expect(utils.getMajorVersion('.1.1.1')).to.be.eql(null);
3400+
expect(utils.getMajorVersion('1.')).to.be.eql(null);
3401+
expect(utils.getMajorVersion('$')).to.be.eql(null);
3402+
});
3403+
3404+
it('should return proper major version if proper version is sent', () => {
3405+
expect(utils.getMajorVersion('1.1.1')).to.be.eql('1');
3406+
expect(utils.getMajorVersion('2.1')).to.be.eql('2');
3407+
expect(utils.getMajorVersion('3')).to.be.eql('3');
3408+
expect(utils.getMajorVersion('4.1')).to.be.eql('4');
3409+
});
3410+
});
33813411
});

0 commit comments

Comments
 (0)