fix(release): ensure changelog renderers are resolvable when processing config (#23214)
This commit is contained in:
parent
8363ba4a5e
commit
3970a1e288
@ -3,7 +3,6 @@ import { prompt } from 'enquirer';
|
|||||||
import { readFileSync, writeFileSync } from 'node:fs';
|
import { readFileSync, writeFileSync } from 'node:fs';
|
||||||
import { valid } from 'semver';
|
import { valid } from 'semver';
|
||||||
import { dirSync } from 'tmp';
|
import { dirSync } from 'tmp';
|
||||||
import type { ChangelogRenderer } from '../../../release/changelog-renderer';
|
|
||||||
import {
|
import {
|
||||||
NxReleaseChangelogConfiguration,
|
NxReleaseChangelogConfiguration,
|
||||||
readNxJson,
|
readNxJson,
|
||||||
@ -13,7 +12,6 @@ import {
|
|||||||
ProjectGraphProjectNode,
|
ProjectGraphProjectNode,
|
||||||
} from '../../config/project-graph';
|
} from '../../config/project-graph';
|
||||||
import { FsTree, Tree } from '../../generators/tree';
|
import { FsTree, Tree } from '../../generators/tree';
|
||||||
import { registerTsProject } from '../../plugins/js/utils/register';
|
|
||||||
import { createProjectFileMapUsingProjectGraph } from '../../project-graph/file-map-utils';
|
import { createProjectFileMapUsingProjectGraph } from '../../project-graph/file-map-utils';
|
||||||
import { createProjectGraphAsync } from '../../project-graph/project-graph';
|
import { createProjectGraphAsync } from '../../project-graph/project-graph';
|
||||||
import { interpolate } from '../../tasks-runner/utils';
|
import { interpolate } from '../../tasks-runner/utils';
|
||||||
@ -47,6 +45,7 @@ import { createOrUpdateGithubRelease, getGitHubRepoSlug } from './utils/github';
|
|||||||
import { launchEditor } from './utils/launch-editor';
|
import { launchEditor } from './utils/launch-editor';
|
||||||
import { parseChangelogMarkdown } from './utils/markdown';
|
import { parseChangelogMarkdown } from './utils/markdown';
|
||||||
import { printAndFlushChanges } from './utils/print-changes';
|
import { printAndFlushChanges } from './utils/print-changes';
|
||||||
|
import { resolveChangelogRenderer } from './utils/resolve-changelog-renderer';
|
||||||
import { resolveNxJsonConfigErrorMessage } from './utils/resolve-nx-json-error-message';
|
import { resolveNxJsonConfigErrorMessage } from './utils/resolve-nx-json-error-message';
|
||||||
import {
|
import {
|
||||||
ReleaseVersion,
|
ReleaseVersion,
|
||||||
@ -57,7 +56,6 @@ import {
|
|||||||
handleDuplicateGitTags,
|
handleDuplicateGitTags,
|
||||||
noDiffInChangelogMessage,
|
noDiffInChangelogMessage,
|
||||||
} from './utils/shared';
|
} from './utils/shared';
|
||||||
import { getRootTsConfigPath } from '../../plugins/js/utils/typescript';
|
|
||||||
|
|
||||||
export interface NxReleaseChangelogResult {
|
export interface NxReleaseChangelogResult {
|
||||||
workspaceChangelog?: {
|
workspaceChangelog?: {
|
||||||
@ -641,30 +639,6 @@ async function applyChangesAndExit(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
function resolveChangelogRenderer(
|
|
||||||
changelogRendererPath: string
|
|
||||||
): ChangelogRenderer {
|
|
||||||
const interpolatedChangelogRendererPath = interpolate(changelogRendererPath, {
|
|
||||||
workspaceRoot,
|
|
||||||
});
|
|
||||||
|
|
||||||
// Try and load the provided (or default) changelog renderer
|
|
||||||
let changelogRenderer: ChangelogRenderer;
|
|
||||||
let cleanupTranspiler = () => {};
|
|
||||||
try {
|
|
||||||
const rootTsconfigPath = getRootTsConfigPath();
|
|
||||||
if (rootTsconfigPath) {
|
|
||||||
cleanupTranspiler = registerTsProject(rootTsconfigPath);
|
|
||||||
}
|
|
||||||
const r = require(interpolatedChangelogRendererPath);
|
|
||||||
changelogRenderer = r.default || r;
|
|
||||||
} catch {
|
|
||||||
} finally {
|
|
||||||
cleanupTranspiler();
|
|
||||||
}
|
|
||||||
return changelogRenderer;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function generateChangelogForWorkspace(
|
async function generateChangelogForWorkspace(
|
||||||
tree: Tree,
|
tree: Tree,
|
||||||
args: ChangelogOptions,
|
args: ChangelogOptions,
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
* defaults and user overrides, as well as handling common errors, up front to produce a single, consistent,
|
* defaults and user overrides, as well as handling common errors, up front to produce a single, consistent,
|
||||||
* and easy to consume config object for all the `nx release` command implementations.
|
* and easy to consume config object for all the `nx release` command implementations.
|
||||||
*/
|
*/
|
||||||
import { join } from 'path';
|
import { join, relative } from 'node:path';
|
||||||
import { NxJsonConfiguration } from '../../../config/nx-json';
|
import { NxJsonConfiguration } from '../../../config/nx-json';
|
||||||
import { ProjectFileMap, ProjectGraph } from '../../../config/project-graph';
|
import { ProjectFileMap, ProjectGraph } from '../../../config/project-graph';
|
||||||
import { readJsonFile } from '../../../utils/fileutils';
|
import { readJsonFile } from '../../../utils/fileutils';
|
||||||
@ -19,6 +19,7 @@ import { findMatchingProjects } from '../../../utils/find-matching-projects';
|
|||||||
import { output } from '../../../utils/output';
|
import { output } from '../../../utils/output';
|
||||||
import { PackageJson } from '../../../utils/package-json';
|
import { PackageJson } from '../../../utils/package-json';
|
||||||
import { workspaceRoot } from '../../../utils/workspace-root';
|
import { workspaceRoot } from '../../../utils/workspace-root';
|
||||||
|
import { resolveChangelogRenderer } from '../utils/resolve-changelog-renderer';
|
||||||
import { resolveNxJsonConfigErrorMessage } from '../utils/resolve-nx-json-error-message';
|
import { resolveNxJsonConfigErrorMessage } from '../utils/resolve-nx-json-error-message';
|
||||||
import { DEFAULT_CONVENTIONAL_COMMITS_CONFIG } from './conventional-commits';
|
import { DEFAULT_CONVENTIONAL_COMMITS_CONFIG } from './conventional-commits';
|
||||||
|
|
||||||
@ -508,6 +509,8 @@ export async function createNxReleaseConfig(
|
|||||||
releaseGroups[releaseGroupName] = finalReleaseGroup;
|
releaseGroups[releaseGroupName] = finalReleaseGroup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ensureChangelogRenderersAreResolvable(releaseGroups, rootChangelogConfig);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
error: null,
|
error: null,
|
||||||
nxReleaseConfig: {
|
nxReleaseConfig: {
|
||||||
@ -884,3 +887,55 @@ function isProjectPublic(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function ensureChangelogRenderersAreResolvable(
|
||||||
|
releaseGroups: NxReleaseConfig['groups'],
|
||||||
|
rootChangelogConfig: NxReleaseConfig['changelog']
|
||||||
|
) {
|
||||||
|
/**
|
||||||
|
* If any form of changelog config is enabled, ensure that any provided changelog renderers are resolvable
|
||||||
|
* up front so that we do not end up erroring only after the versioning step has been completed.
|
||||||
|
*/
|
||||||
|
const uniqueRendererPaths = new Set<string>();
|
||||||
|
|
||||||
|
if (
|
||||||
|
rootChangelogConfig.workspaceChangelog &&
|
||||||
|
typeof rootChangelogConfig.workspaceChangelog !== 'boolean' &&
|
||||||
|
rootChangelogConfig.workspaceChangelog.renderer?.length
|
||||||
|
) {
|
||||||
|
uniqueRendererPaths.add(rootChangelogConfig.workspaceChangelog.renderer);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
rootChangelogConfig.projectChangelogs &&
|
||||||
|
typeof rootChangelogConfig.projectChangelogs !== 'boolean' &&
|
||||||
|
rootChangelogConfig.projectChangelogs.renderer?.length
|
||||||
|
) {
|
||||||
|
uniqueRendererPaths.add(rootChangelogConfig.projectChangelogs.renderer);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const group of Object.values(releaseGroups)) {
|
||||||
|
if (
|
||||||
|
group.changelog &&
|
||||||
|
typeof group.changelog !== 'boolean' &&
|
||||||
|
group.changelog.renderer?.length
|
||||||
|
) {
|
||||||
|
uniqueRendererPaths.add(group.changelog.renderer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!uniqueRendererPaths.size) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const rendererPath of uniqueRendererPaths) {
|
||||||
|
try {
|
||||||
|
resolveChangelogRenderer(rendererPath);
|
||||||
|
} catch (e) {
|
||||||
|
const workspaceRelativePath = relative(workspaceRoot, rendererPath);
|
||||||
|
output.error({
|
||||||
|
title: `There was an error when resolving the configured changelog renderer at path: ${workspaceRelativePath}`,
|
||||||
|
});
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -0,0 +1,30 @@
|
|||||||
|
import type { ChangelogRenderer } from '../../../../release/changelog-renderer';
|
||||||
|
import { registerTsProject } from '../../../plugins/js/utils/register';
|
||||||
|
import { getRootTsConfigPath } from '../../../plugins/js/utils/typescript';
|
||||||
|
import { interpolate } from '../../../tasks-runner/utils';
|
||||||
|
import { workspaceRoot } from '../../../utils/workspace-root';
|
||||||
|
|
||||||
|
export function resolveChangelogRenderer(
|
||||||
|
changelogRendererPath: string
|
||||||
|
): ChangelogRenderer {
|
||||||
|
const interpolatedChangelogRendererPath = interpolate(changelogRendererPath, {
|
||||||
|
workspaceRoot,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Try and load the provided (or default) changelog renderer
|
||||||
|
let changelogRenderer: ChangelogRenderer;
|
||||||
|
let cleanupTranspiler = () => {};
|
||||||
|
try {
|
||||||
|
const rootTsconfigPath = getRootTsConfigPath();
|
||||||
|
if (rootTsconfigPath) {
|
||||||
|
cleanupTranspiler = registerTsProject(rootTsconfigPath);
|
||||||
|
}
|
||||||
|
const r = require(interpolatedChangelogRendererPath);
|
||||||
|
changelogRenderer = r.default || r;
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
} finally {
|
||||||
|
cleanupTranspiler();
|
||||||
|
}
|
||||||
|
return changelogRenderer;
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user