Last active
October 27, 2022 22:32
-
-
Save rndD/044b6a00715710cdabf08d70452dbedb to your computer and use it in GitHub Desktop.
Script replaces all deps versions in all `package.json`s from `yarn.lock` (yarn version 3). It works with yarn monorepo setup. Run: `yarn add @yarnpkg/parsers && npx ts-node yarn-lock-versions-to-package.ts`
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import fs from 'fs'; | |
import { parseSyml } from '@yarnpkg/parsers'; | |
import path from 'path'; | |
let file = fs.readFileSync('yarn.lock', 'utf8'); | |
let json = parseSyml(file); | |
// function make map with all packages and their versions. | |
// Json format: | |
// 'zen-observable-ts@npm:^1.2.0': { | |
// version: '1.2.3', | |
// resolution: 'zen-observable-ts@npm:1.2.3', | |
// dependencies: { 'zen-observable': '0.8.15' }, | |
// checksum: '0548b555c67671f1240fb416755d2c27abf095b74a9e25c1abf23b2e15de40e6b076c678a162021358fe62914864eb9f0a57cd65e203d66c4988a08b220e6172', | |
// languageName: 'node', | |
// linkType: 'hard' | |
// }, | |
const packagesInYarn = new Map(); | |
for (const key of Object.keys(json)) { | |
const packageNVersions = key.split(','); | |
packageNVersions.forEach((packageNVersion) => { | |
packageNVersion = packageNVersion.trim(); | |
const [packageName, version] = packageNVersion.split('@npm:'); | |
const resolvedVersion = json[key].version; | |
packagesInYarn.set(`${packageName}|${version}`, resolvedVersion); | |
}); | |
} | |
function findDivergeVersionsInPackageJson(rootDir: string) { | |
// read all package json in root except node_modules | |
const files = fs.readdirSync(rootDir); | |
for (const file of files) { | |
const filePath = path.join(rootDir, file); | |
const stat = fs.statSync(filePath); | |
if (stat.isDirectory() && file !== 'node_modules') { | |
findDivergeVersionsInPackageJson(filePath); | |
} else if (stat.isFile() && file === 'package.json') { | |
const packageJson = fs.readFileSync(filePath, 'utf8'); | |
const parsedPackageJson = parseSyml(packageJson); | |
const { | |
dependencies: deps, | |
} = parsedPackageJson; | |
let changed = false; | |
// iterate over dependencies and peerDependencies | |
if (deps) { | |
Object.keys(deps).forEach((dep) => { | |
if (packagesInYarn.has(`${dep}|${deps[dep]}`)) { | |
const resolvedVersion = packagesInYarn.get(`${dep}|${deps[dep]}`); | |
if (resolvedVersion !== deps[dep]) { | |
deps[dep] = resolvedVersion; | |
changed = true; | |
} | |
} | |
}); | |
} | |
if (changed) { | |
fs.writeFileSync( | |
filePath, | |
JSON.stringify(parsedPackageJson, null, 2) + `\r`, | |
); | |
} | |
} | |
} | |
} | |
findDivergeVersionsInPackageJson(process.cwd()); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment