diff --git a/packages/nx/src/command-line/release/changelog.ts b/packages/nx/src/command-line/release/changelog.ts index 04b963dc3f..ea0939aa9d 100644 --- a/packages/nx/src/command-line/release/changelog.ts +++ b/packages/nx/src/command-line/release/changelog.ts @@ -1,4 +1,5 @@ import * as chalk from 'chalk'; +import { prompt } from 'enquirer'; import { readFileSync, writeFileSync } from 'node:fs'; import { valid } from 'semver'; import { dirSync } from 'tmp'; @@ -15,6 +16,7 @@ import { FsTree, Tree } from '../../generators/tree'; import { registerTsProject } from '../../plugins/js/utils/register'; import { createProjectGraphAsync } from '../../project-graph/project-graph'; import { interpolate } from '../../tasks-runner/utils'; +import { isCI } from '../../utils/is-ci'; import { output } from '../../utils/output'; import { handleErrors } from '../../utils/params'; import { joinPathFragments } from '../../utils/path'; @@ -550,6 +552,31 @@ async function applyChangesAndExit( `No changes were detected for any changelog files, so no changelog entries will be generated.`, ], }); + + if (!postGitTasks.length) { + // no GitHub releases to create so we can just exit + return; + } + + if (isCI()) { + output.warn({ + title: `Skipped GitHub release creation because no changes were detected for any changelog files.`, + }); + return; + } + + // prompt the user to see if they want to create a GitHub release anyway + // we know that the user has configured GitHub releases because we have postGitTasks + const shouldCreateGitHubReleaseAnyway = await promptForGitHubRelease(); + + if (!shouldCreateGitHubReleaseAnyway) { + return; + } + + for (const postGitTask of postGitTasks) { + await postGitTask(latestCommit); + } + return; } @@ -951,3 +978,19 @@ export function shouldCreateGitHubRelease( return (changelogConfig || {}).createRelease === 'github'; } + +async function promptForGitHubRelease(): Promise { + try { + const result = await prompt<{ confirmation: boolean }>([ + { + name: 'confirmation', + message: 'Do you want to create a GitHub release anyway?', + type: 'confirm', + }, + ]); + return result.confirmation; + } catch (e) { + // Handle the case where the user exits the prompt with ctrl+c + return false; + } +}