semantic-release-npm-workspaces-monorepo
Version:
Help you use semantic-release with npm workspaces
41 lines (40 loc) • 1.74 kB
JavaScript
import ScanPublishOrder from './scan-publish-order.js';
import path from 'path';
import UpdatePackages from './update-packages.js';
import { SETTINGS } from '../settings.js';
import npmWhich from 'npm-which';
import { promisify } from 'util';
import { execSync } from 'child_process';
const npmWhichPromise = promisify(npmWhich(process.cwd()));
export default class PublishPackages {
async scan() {
this._packageScanner = new ScanPublishOrder();
await this._packageScanner.scan();
}
async loopPackages() {
const bin = (await npmWhichPromise(SETTINGS.semanticReleaseBin));
for (const packagePath of this._packageScanner.packagesOrderPath) {
const packageJsonPath = path.join(packagePath, 'package.json');
const packageUpdater = new UpdatePackages(packageJsonPath, this._packageScanner.packageOrder);
await PublishPackages._updatePackageJson(packageUpdater);
await PublishPackages._publishPackage(packagePath, bin);
await packageUpdater.restoreOriginalPackageJson();
}
}
static async _updatePackageJson(packageUpdater) {
await packageUpdater.updateDeps();
packageUpdater.packageContent.release = {
...SETTINGS.release,
tagFormat: SETTINGS.tagFormat.replace('${name}', packageUpdater.packageContent.name),
};
await packageUpdater.savePackageJson();
}
static async _publishPackage(packagePath, exec) {
console.log(`\n\nRunning semantic release: ${packagePath}\n`);
const command = [exec].concat(SETTINGS.semanticReleaseBinArgs).join(' ');
execSync(command, {
stdio: 'inherit',
cwd: packagePath,
});
}
}