Skip to content

Commit 7abea75

Browse files
committed
Add new Travis jobs to test lowest/highest versions of all the dependencies
1 parent 5fcd4cb commit 7abea75

File tree

2 files changed

+138
-0
lines changed

2 files changed

+138
-0
lines changed

.travis.yml

+15
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,21 @@ cache:
88

99
matrix:
1010
include:
11+
- name: 'Lowest versions of the dependencies'
12+
os: linux
13+
node_js: "10"
14+
env: JOB_PART=test
15+
install:
16+
- rm yarn.lock
17+
- node ./scripts/force-lowest-dependencies
18+
- yarn
19+
- name: 'Highest versions of the dependencies'
20+
os: linux
21+
node_js: "10"
22+
env: JOB_PART=test
23+
install:
24+
- rm yarn.lock
25+
- yarn
1126
- os: linux
1227
node_js: "10"
1328
env: JOB_PART=travis:lint

scripts/force-lowest-dependencies.js

+123
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
/*
2+
* This file is part of the Symfony Webpack Encore package.
3+
*
4+
* (c) Fabien Potencier <[email protected]>
5+
*
6+
* For the full copyright and license information, please view the LICENSE
7+
* file that was distributed with this source code.
8+
*/
9+
10+
'use strict';
11+
12+
const fs = require('fs');
13+
const childProcess = require('child_process');
14+
15+
function getLowestVersion(dependency, range) {
16+
return new Promise((resolve, reject) => {
17+
childProcess.exec(
18+
`npm view "${dependency}@${range}" version`,
19+
{ encoding: 'utf-8' },
20+
(error, stdout) => {
21+
if (error) {
22+
reject(`Could not retrieve versions list for "${dependency}@${range}"`);
23+
}
24+
25+
const versions = stdout
26+
.split('\n')
27+
.filter(line => line);
28+
29+
if (versions.length === 0) {
30+
reject(`Could not find a lowest version for "${dependency}@${range}"`);
31+
}
32+
33+
const parts = versions[0].split(' ');
34+
35+
// If there is only one version available that version
36+
// is directly printed as the output of npm view.
37+
if (parts.length === 1) {
38+
resolve([dependency, parts[0]]);
39+
}
40+
41+
// If multiple versions are available then it outputs
42+
// multiple lines matching the following format:
43+
// <package>@<version> '<version>'
44+
if (parts.length === 2) {
45+
resolve([dependency, parts[1].replace(/'/g, '')]);
46+
}
47+
48+
reject(`Unexpected response for "${dependency}@${range}": ${versions[0]}`);
49+
}
50+
);
51+
});
52+
}
53+
54+
fs.readFile('package.json', (error, data) => {
55+
if (error) {
56+
throw error;
57+
}
58+
59+
const packageInfo = JSON.parse(data);
60+
61+
const dependencyPromises = [];
62+
if (packageInfo.dependencies) {
63+
for (const dependency in packageInfo.dependencies) {
64+
dependencyPromises.push(getLowestVersion(
65+
dependency,
66+
packageInfo.dependencies[dependency]
67+
));
68+
}
69+
}
70+
71+
const devDependencyPromises = [];
72+
if (packageInfo.devDependencies) {
73+
for (const devDependency in packageInfo.devDependencies) {
74+
devDependencyPromises.push(getLowestVersion(
75+
devDependency,
76+
packageInfo.devDependencies[devDependency]
77+
));
78+
}
79+
}
80+
81+
const dependenciesUpdate = Promise.all(dependencyPromises).then(versions => {
82+
versions.forEach(version => {
83+
packageInfo.dependencies[version[0]] = version[1];
84+
});
85+
});
86+
87+
const devDependenciesUpdate = Promise.all(devDependencyPromises).then(versions => {
88+
versions.forEach(version => {
89+
packageInfo.devDependencies[version[0]] = version[1];
90+
});
91+
});
92+
93+
// Once all the lowest versions have been resolved, update the
94+
// package.json file accordingly.
95+
Promise
96+
.all([dependenciesUpdate, devDependenciesUpdate])
97+
.then(() => new Promise((resolve, reject) => {
98+
fs.writeFile('package.json', JSON.stringify(packageInfo, null, 2), (error) => {
99+
if (error) {
100+
reject(error);
101+
}
102+
103+
resolve();
104+
});
105+
}))
106+
.then(() => {
107+
console.log('Updated package.json file with lowest dependency versions: ');
108+
109+
console.log('Dependencies:');
110+
for (const dependency in packageInfo.dependencies) {
111+
console.log(` - ${dependency}: ${packageInfo.dependencies[dependency]}`);
112+
}
113+
114+
console.log('Dev dependencies:');
115+
for (const dependency in packageInfo.devDependencies) {
116+
console.log(` - ${dependency}: ${packageInfo.devDependencies[dependency]}`);
117+
}
118+
})
119+
.catch(error => {
120+
console.error(error);
121+
process.exit(1); // eslint-disable-line
122+
});
123+
});

0 commit comments

Comments
 (0)