Skip to content

Commit 10aa4f2

Browse files
Add support for 'low/high' dependency testing
1 parent f86ba3b commit 10aa4f2

File tree

3 files changed

+161
-2
lines changed

3 files changed

+161
-2
lines changed

.github/workflows/test.yaml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,19 +235,35 @@ jobs:
235235
working-directory: src/Notify
236236
run: php vendor/bin/simple-phpunit
237237

238-
tests-js:
238+
tests-js-low-deps:
239+
runs-on: ubuntu-latest
240+
steps:
241+
- uses: actions/checkout@master
242+
243+
- name: Force Lowest Dependencies
244+
run: node ./src/Chartjs/assets/scripts/force-lowest-dependencies.js
245+
246+
- run: yarn
247+
248+
- run: yarn test
249+
250+
tests-js-high-deps:
239251
runs-on: ubuntu-latest
240252
steps:
241253
- uses: actions/checkout@master
254+
242255
- name: Get yarn cache directory path
243256
id: yarn-cache-dir-path
244257
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
258+
245259
- uses: actions/cache@v2
246260
id: yarn-cache
247261
with:
248262
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
249263
key: ${{ runner.os }}-yarn-${{ hashFiles('**/package.json') }}
250264
restore-keys: |
251265
${{ runner.os }}-yarn-
266+
252267
- run: yarn
268+
253269
- run: yarn test

src/Chartjs/assets/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
"devDependencies": {
3131
"@hotwired/stimulus": "^3.0.0",
3232
"@types/chart.js": "^2.9.34",
33-
"chart.js": "^4.0",
33+
"chart.js": "^3.4.1 <3.9 || ^4.0",
3434
"jest-canvas-mock": "^2.3.0",
3535
"resize-observer-polyfill": "^1.5.1"
3636
}
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
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+
const chartJsLowVersion = '3.4.1';
16+
17+
/**
18+
* @param {string} dependency
19+
* @param {string} range
20+
* @return {Promise}
21+
*/
22+
function getLowestVersion(dependency, range) {
23+
return new Promise((resolve, reject) => {
24+
if (range.startsWith('file:')) {
25+
resolve([dependency, range]);
26+
}
27+
28+
childProcess.exec(
29+
`npm view "${dependency}@${range}" version`,
30+
{ encoding: 'utf-8' },
31+
(error, stdout) => {
32+
if (error) {
33+
reject(`Could not retrieve versions list for "${dependency}@${range}"`);
34+
return;
35+
}
36+
37+
const versions = stdout
38+
.split('\n')
39+
.filter(line => line);
40+
41+
if (versions.length === 0) {
42+
reject(`Could not find a lowest version for "${dependency}@${range}"`);
43+
return;
44+
}
45+
46+
const parts = versions[0].split(' ');
47+
48+
// If there is only one version available that version
49+
// is directly printed as the output of npm view.
50+
if (parts.length === 1) {
51+
resolve([dependency, parts[0]]);
52+
return;
53+
}
54+
55+
// If multiple versions are available then it outputs
56+
// multiple lines matching the following format:
57+
// <package>@<version> '<version>'
58+
if (parts.length === 2) {
59+
resolve([dependency, parts[1].replace(/'/g, '')]);
60+
return;
61+
}
62+
63+
reject(`Unexpected response for "${dependency}@${range}": ${versions[0]}`);
64+
}
65+
);
66+
});
67+
}
68+
69+
fs.readFile('package.json', (error, data) => {
70+
if (error) {
71+
throw error;
72+
}
73+
74+
const packageInfo = JSON.parse(data);
75+
76+
const dependencyPromises = [];
77+
if (packageInfo.dependencies) {
78+
for (const dependency in packageInfo.dependencies) {
79+
dependencyPromises.push(getLowestVersion(
80+
dependency,
81+
packageInfo.dependencies[dependency]
82+
));
83+
}
84+
}
85+
86+
const devDependencyPromises = [];
87+
if (packageInfo.devDependencies) {
88+
for (const devDependency in packageInfo.devDependencies) {
89+
devDependencyPromises.push(getLowestVersion(
90+
devDependency,
91+
packageInfo.devDependencies[devDependency]
92+
));
93+
}
94+
}
95+
96+
const dependenciesUpdate = Promise.all(dependencyPromises).then(versions => {
97+
versions.forEach(version => {
98+
packageInfo.dependencies[version[0]] = version[1];
99+
});
100+
});
101+
102+
const devDependenciesUpdate = Promise.all(devDependencyPromises).then(versions => {
103+
versions.forEach(version => {
104+
packageInfo.devDependencies[version[0]] = version[1];
105+
});
106+
});
107+
108+
// Once all the lowest versions have been resolved, update the
109+
// package.json file accordingly.
110+
Promise
111+
.all([dependenciesUpdate, devDependenciesUpdate])
112+
.then(() => new Promise((resolve, reject) => {
113+
fs.writeFile('package.json', JSON.stringify(packageInfo, null, 2), (error) => {
114+
if (error) {
115+
reject(error);
116+
return;
117+
}
118+
119+
resolve();
120+
});
121+
}))
122+
.then(() => {
123+
console.log('Manually forcing chart.js to lowest version');
124+
packageInfo.devDependencies['chart.js'] = chartJsLowVersion;
125+
})
126+
.then(() => {
127+
console.log('Updated package.json file with lowest dependency versions: ');
128+
129+
console.log('Dependencies:');
130+
for (const dependency in packageInfo.dependencies) {
131+
console.log(` - ${dependency}: ${packageInfo.dependencies[dependency]}`);
132+
}
133+
134+
console.log('Dev dependencies:');
135+
for (const dependency in packageInfo.devDependencies) {
136+
console.log(` - ${dependency}: ${packageInfo.devDependencies[dependency]}`);
137+
}
138+
})
139+
.catch(error => {
140+
console.error(error);
141+
process.exit(1); // eslint-disable-line
142+
});
143+
});

0 commit comments

Comments
 (0)