|
/* eslint-disable */ |
|
|
|
const TEST_COMMAND = 'yarn test'; // Place your custom test command here |
|
|
|
const { execSync } = require('child_process'); |
|
const semver = require('semver'); |
|
|
|
function getOutdatedPackages() { |
|
let rawOutput; |
|
try { |
|
rawOutput = execSync('yarn outdated --json', { stdio: 'pipe' }).toString(); |
|
} catch (error) { |
|
rawOutput = error.stdout.toString(); |
|
} |
|
|
|
const lines = rawOutput.trim().split('\n'); |
|
let outdatedPackages = []; |
|
|
|
for (let line of lines) { |
|
let parsed; |
|
try { |
|
parsed = JSON.parse(line); |
|
} catch (error) { |
|
continue; |
|
} |
|
|
|
if (parsed.type === 'table') { |
|
outdatedPackages = parsed.data.body; |
|
break; |
|
} |
|
} |
|
|
|
return outdatedPackages; |
|
} |
|
|
|
const order = ['patch', 'minor', 'major']; |
|
function sortPackages(outdatedPackages) { |
|
return outdatedPackages |
|
.map(([name, current, wanted, latest]) => ({ name, current, latest })) |
|
.sort((a, b) => { |
|
const typeA = semver.diff(a.current, a.latest); |
|
const typeB = semver.diff(b.current, b.latest); |
|
|
|
return order.indexOf(typeA) - order.indexOf(typeB); |
|
}); |
|
} |
|
|
|
function updateAndTestPackages(sortedPackages) { |
|
for (const { name, current, latest } of sortedPackages) { |
|
console.log(`Updating ${name} to ${latest}`); |
|
try { |
|
execSync(`yarn upgrade ${name}@${latest}`, { stdio: 'ignore' }); |
|
console.log(`Running tests for ${name}`); |
|
execSync(TEST_COMMAND, { stdio: 'ignore' }); |
|
} catch (error) { |
|
console.error( |
|
`Test or update failed for ${name}. Reverting to ${current}.`, |
|
); |
|
execSync(`yarn add ${name}@${current}`, { stdio: 'ignore' }); |
|
} |
|
} |
|
} |
|
|
|
function main() { |
|
console.log("Running 'yarn outdated'..."); |
|
const outdatedPackages = getOutdatedPackages(); |
|
const sortedPackages = sortPackages(outdatedPackages); |
|
updateAndTestPackages(sortedPackages); |
|
} |
|
|
|
main(); |