Last active
February 20, 2024 19:20
-
-
Save youngcm2/fe144fef969dfa1e0404d155ea3d367f to your computer and use it in GitHub Desktop.
Pull devDependencies into the root
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
#!/usr/bin/env zx | |
const glob = require('glob'); | |
const semver = require('semver'); | |
const packagesPath = './'; | |
const rootPackageJsonPath = './package.json'; | |
let rootPackageJson = require(rootPackageJsonPath); | |
let devDependenciesInfo = {}; | |
const sanitizeVersion = (version) => { | |
const sanitizedVersion = version.replace(/^[^0-9]+/, ''); | |
return semver.valid(sanitizedVersion) ? sanitizedVersion : '0.0.0'; | |
}; | |
glob.sync(path.join(packagesPath, '**/package.json'), { ignore: ['**/node_modules/**', '**/pkgs/**'] }) | |
.forEach(file => { | |
let packageJsonPath = path.resolve(file); | |
const packageJson = require(packageJsonPath); | |
const packageName = path.basename(path.dirname(file)); // Get the package name from the file path | |
if (packageJson.devDependencies) { | |
Object.keys(packageJson.devDependencies).forEach(dep => { | |
if (!devDependenciesInfo[dep]) { | |
devDependenciesInfo[dep] = []; | |
} | |
// Add the version along with the package it came from | |
devDependenciesInfo[dep].push( | |
{ version: sanitizeVersion(packageJson.devDependencies[dep]), from: packageName }); | |
}); | |
delete packageJson.devDependencies; | |
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2)); | |
} | |
}); | |
let sortedDevDependencies = {}; | |
Object.keys(devDependenciesInfo).sort().forEach(dep => { | |
let versions = devDependenciesInfo[dep].sort((a, b) => semver.rcompare(a.version, b.version, true)); | |
sortedDevDependencies[dep] = versions[0].version; | |
sortedDevDependencies[dep] = versions[0].version; | |
const otherVersions = versions.slice(1).filter(v => v.version !== versions[0].version).map(v => `${v.version} (from ${v.from})`).join('\n\t\t'); | |
let msg = `Selected ${dep}@${versions[0].version} from ${versions[0].from}` | |
if (otherVersions) { | |
msg += `\n\tOther versions: \n\t\t${otherVersions}` | |
} | |
console.log(msg); | |
}); | |
rootPackageJson.devDependencies = sortedDevDependencies; | |
fs.writeFileSync(rootPackageJsonPath, JSON.stringify(rootPackageJson, null, 2)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment