UNPKG

@jwpkg/gitversion

Version:

Gitversion is a complete customizable git-based release management system

157 lines 16.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PublishCommand = void 0; const clipanion_1 = require("clipanion"); const colorize_node_1 = require("colorize-node"); const path_1 = require("path"); const application_1 = require("../core/application"); const configuration_1 = require("../core/configuration"); const format_utils_1 = require("../core/format-utils"); const pack_artifact_1 = require("../core/pack-artifact"); const context_1 = require("./context"); class PublishCommand extends context_1.GitVersionCommand { static paths = [ ['publish'], ]; push = clipanion_1.Option.Boolean('--push', true, { description: 'Push the changes to the remote repository' }); tag = clipanion_1.Option.Boolean('--tag', true, { description: 'Tag the commit with the version' }); dryRun = clipanion_1.Option.Boolean('--dry-run', false); async execute() { const application = await application_1.Application.init(this.context.application, { dryRun: this.dryRun, }); const context = { ...this.context, application, }; const { project, git, configuration, branch, hooks, packManagers, logger } = application; if (!project) { return 1; } let packManifest = await pack_artifact_1.PackArtifact.load(configuration, git); if (!packManifest) { logger.reportInfo('No pack manifest found. Running pack on current workspace'); const result = await this.cli.run(['pack'], context); if (result !== 0) { return result; } packManifest = await pack_artifact_1.PackArtifact.load(configuration, git); } else { logger.reportInfo('Pack manifest found. Publishing from pack'); } if (packManifest === null) { logger.reportError('Still invalid pack manifest. Breaking off'); return 1; } if (!(await packManifest.validateGitStatusForPublish())) { logger.reportWarning('Git status has changed since pack. Please make sure you have a valid flow', true); console.log('Git status output:'); console.log(await git.exec('status', '--porcelain')); } const packedPackages = packManifest.packages; if (packedPackages.length > 0) { await this.publishPackages(packManagers, packedPackages, configuration, branch, logger); if (this.tag) { await this.addTags(packedPackages, git, logger); } else { logger.reportInfo('Skipping tagging step'); } if (this.push) { await git.push(); } else { logger.reportInfo('Skipping push step'); } await this.updateChangelogs(packedPackages, project, git, logger); const isDefaultChangelogBranch = application.branch.type !== configuration_1.BranchType.FEATURE; const shouldPushChangelogs = this.push && (isDefaultChangelogBranch || configuration.options.featurePushChangelogs); if (shouldPushChangelogs) { await git.push(); } else { logger.reportInfo('Skipping push step'); } await hooks.dispatchOnPublish(application, packedPackages); } else { logger.reportWarning('Nothing to publish'); } return 0; } async publishPackages(packManagers, packedPackages, configuration, branch, logger) { const publish = logger.beginSection('Publish step'); const promises = packedPackages.map(async (packedPackage) => { if (packedPackage.packFiles) { await this.publishPackage(packManagers, packedPackage, configuration, branch, logger); } }); await Promise.all(promises); logger.endSection(publish); } async publishPackage(packManagers, packedPackage, configuration, branch, logger) { return logger.runSection(`Publishing ${(0, format_utils_1.formatPackageName)(packedPackage.packageName)}`, async () => { const releaseTag = branch.type === configuration_1.BranchType.MAIN ? 'latest' : branch.name; const publishCommands = packManagers.map(async (packManager) => { if (packedPackage.packFiles?.[packManager.ident]) { try { const packFiles = packedPackage.packFiles[packManager.ident]; if (Array.isArray(packFiles)) { for (const file of packFiles) { await packManager.publish(packedPackage, (0, path_1.join)(configuration.packFolder, packManager.ident, file), releaseTag, this.dryRun); } } else if (typeof packFiles === 'string') { await packManager.publish(packedPackage, (0, path_1.join)(configuration.packFolder, packManager.ident, packFiles), releaseTag, this.dryRun); } else if (typeof packFiles === 'object' && packFiles !== null) { // If packFiles is an object, we assume it's a record of files for (const [key, file] of Object.entries(packFiles)) { await packManager.publish(packedPackage, (0, path_1.join)(configuration.packFolder, packManager.ident, file), releaseTag, this.dryRun, key); } } } catch (error) { logger.reportError(`Error publishing ${(0, format_utils_1.formatPackageName)(packedPackage.packageName)}@${(0, format_utils_1.formatVersion)(packedPackage.version)} with plugin ${colorize_node_1.colorize.yellowBright('name' in packManager && typeof packManager.name === 'string' ? packManager.name : packManager.ident)}`, true); throw error; } } }); await Promise.all(publishCommands); }); } async addTags(packages, git, logger) { const section = logger.beginSection('Tagging step'); const allTags = packages.map(p => p.tag); const tags = allTags.filter((tag, pos) => { return allTags.indexOf(tag) == pos; }); const commands = tags.map(async (tag) => { await git.addTag(tag, 'Tag added by gitversion'); }); await Promise.all(commands); logger.endSection(section); } async updateChangelogs(packages, project, git, logger) { const section = logger.beginSection('Updating changelogs'); const files = []; const commands = packages.map(async (p) => { const workspace = project.workspaces.find(w => w.relativeCwd === p.packageRelativeCwd); if (workspace) { const file = await workspace.updateChangelog(p.changeLog); if (!files.includes(file)) { logger.reportInfo(`Updating: ${colorize_node_1.colorize.yellow(colorize_node_1.colorize.underline((0, path_1.join)(workspace.cwd, 'CHANGELOG.md')))}`); files.push(file); } } }); await Promise.all(commands); if (files.length > 0) { await git.addAndCommitFiles('Updated changelogs', files); } logger.endSection(section); } } exports.PublishCommand = PublishCommand; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGlzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9wdWJsaXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUFtQztBQUNuQyxpREFBeUM7QUFDekMsK0JBQTRCO0FBRTVCLHFEQUFrRDtBQUNsRCx5REFBa0Y7QUFDbEYsdURBQXdFO0FBR3hFLHlEQUFvRTtBQUlwRSx1Q0FBOEM7QUFFOUMsTUFBYSxjQUFlLFNBQVEsMkJBQWlCO0lBQ25ELE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixDQUFDLFNBQVMsQ0FBQztLQUNaLENBQUM7SUFFRixJQUFJLEdBQUcsa0JBQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLFdBQVcsRUFBRSwyQ0FBMkMsRUFBRSxDQUFDLENBQUM7SUFDcEcsR0FBRyxHQUFHLGtCQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxXQUFXLEVBQUUsaUNBQWlDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hGLE1BQU0sR0FBRyxrQkFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFNUMsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLFdBQVcsR0FBRyxNQUFNLHlCQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFO1lBQ25FLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtTQUNwQixDQUFDLENBQUM7UUFFSCxNQUFNLE9BQU8sR0FBRztZQUNkLEdBQUcsSUFBSSxDQUFDLE9BQU87WUFDZixXQUFXO1NBQ1osQ0FBQztRQUVGLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUM7UUFFekYsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2Is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