|
| 1 | +#!/usr/bin/env node |
| 2 | +const fs = require("fs"); |
| 3 | +const childProcess = require("child_process"); |
| 4 | +const lockfile = require("@yarnpkg/lockfile"); |
| 5 | + |
| 6 | +// dependencies or devDependencies |
| 7 | +const depType = process.env.INPUT_DEPTYPE || "dependencies"; |
| 8 | +const exclude = (process.env.INPUT_EXCLUDE || "").split("s*,s*").filter(x=>x); |
| 9 | +const latest = process.env.INPUT_LATEST === 'true' ? " --latest" : ""; |
| 10 | +console.log({ depType, exclude, latest }); |
| 11 | + |
| 12 | +function getDeclaredDeps() { |
| 13 | + const pkg = JSON.parse(fs.readFileSync("package.json").toString()); |
| 14 | + return (depObject = pkg[depType] || {}); |
| 15 | +} |
| 16 | + |
| 17 | +function getResolvedDeps() { |
| 18 | + const file = fs.readFileSync("yarn.lock", "utf8"); |
| 19 | + const lockJson = lockfile.parse(file); |
| 20 | + return lockJson.object; |
| 21 | +} |
| 22 | + |
| 23 | +console.log({ declared: getDeclaredDeps() }); |
| 24 | +const packages = Object.keys(getDeclaredDeps()).filter( |
| 25 | + (pkg) => !exclude.includes(pkg) |
| 26 | +); |
| 27 | + |
| 28 | +function getResolvedSemverMapping() { |
| 29 | + const declaredDeps = getDeclaredDeps(); |
| 30 | + const resolvedDeps = getResolvedDeps(); |
| 31 | + return packages.reduce((acc, pkg) => { |
| 32 | + const declared = declaredDeps[pkg]; |
| 33 | + const semver = `${pkg}@${declaredDeps[pkg]}`; |
| 34 | + const resolved = resolvedDeps[semver].version; |
| 35 | + acc[pkg] = { declared, resolved }; |
| 36 | + return acc; |
| 37 | + }, {}); |
| 38 | +} |
| 39 | + |
| 40 | +const before = getResolvedSemverMapping(); |
| 41 | + |
| 42 | +const cmd = `yarn upgrade ${packages.join(" ")} ${latest}`; |
| 43 | +console.log(cmd); |
| 44 | +childProcess.execSync(`${cmd}`, { stdio: "inherit" }); |
| 45 | + |
| 46 | +const after = getResolvedSemverMapping(); |
| 47 | + |
| 48 | +const changed = packages.filter( |
| 49 | + (pkg) => before[pkg].resolved !== after[pkg].resolved |
| 50 | +); |
| 51 | + |
| 52 | +const upgrades = changed |
| 53 | + .map((pkg) => `${pkg}@${after[pkg].resolved}`) |
| 54 | + .join(" "); |
| 55 | + |
| 56 | +childProcess.execSync(`git status`, { stdio: "inherit" }); |
| 57 | +console.log(`::set-output name=upgrades::${upgrades}`); |
0 commit comments