release-plan
Version:
_The most contributor friendly and hands-off release tool there is_.
52 lines • 2.07 kB
JavaScript
import { relative, join } from 'path';
import fsExtra from 'fs-extra';
import { getPackagesSync } from '@manypkg/get-packages';
const { readJSONSync } = fsExtra;
export function getPackages(rootDir) {
const packages = new Map();
function loadPackage(packagePath) {
const pkg = readJSONSync(packagePath);
if (pkg.private) {
return;
}
packages.set(pkg.name, {
version: pkg.version,
pkgJSONPath: `./${relative('.', packagePath)}`,
isDependencyOf: new Map(),
isPeerDependencyOf: new Map(),
pkg,
});
}
const { packages: workspaces, rootPackage } = getPackagesSync(rootDir);
workspaces.forEach((item) => loadPackage(join(item.dir, 'package.json')));
if (rootPackage?.dir) {
loadPackage(join(rootPackage.dir, 'package.json'));
}
return packages;
}
export function publishedInterPackageDeps() {
const packages = getPackages('./');
for (const [consumerName, packageDefinition] of packages) {
const consumerPkgJSON = packageDefinition.pkg;
// no devDeps because changes to devDeps shouldn't ever force us to
// release
for (const section of ['dependencies', 'peerDependencies']) {
if (consumerPkgJSON[section]) {
for (const [depName, depRange] of Object.entries(consumerPkgJSON[section])) {
if (depRange.startsWith('workspace:')) {
const dependency = packages.get(depName);
if (!dependency) {
throw new Error(`broken "workspace:" reference to ${depName} in ${consumerName}`);
}
const field = section === 'dependencies'
? 'isDependencyOf'
: 'isPeerDependencyOf';
dependency[field].set(consumerName, depRange);
}
}
}
}
}
return packages;
}
//# sourceMappingURL=interdep.js.map