Skip to content

Commit 889fcb9

Browse files
Add support for 'low/high' dependency testing
1 parent f86ba3b commit 889fcb9

File tree

3 files changed

+162
-2
lines changed

3 files changed

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

0 commit comments

Comments
 (0)