Skip to content

Instantly share code, notes, and snippets.

@youngcm2
Last active February 20, 2024 19:20
Show Gist options
  • Save youngcm2/fe144fef969dfa1e0404d155ea3d367f to your computer and use it in GitHub Desktop.
Save youngcm2/fe144fef969dfa1e0404d155ea3d367f to your computer and use it in GitHub Desktop.
Pull devDependencies into the root
#!/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