Adds tooling to create ad-hoc release note entries via `ng-dev release notes`. PR Close #42225
		
			
				
	
	
		
			85 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
/**
 | 
						|
 * @license
 | 
						|
 * Copyright Google LLC All Rights Reserved.
 | 
						|
 *
 | 
						|
 * Use of this source code is governed by an MIT-style license that can be
 | 
						|
 * found in the LICENSE file at https://angular.io/license
 | 
						|
 */
 | 
						|
 | 
						|
import {writeFileSync} from 'fs';
 | 
						|
import {join} from 'path';
 | 
						|
import {SemVer} from 'semver';
 | 
						|
import {Arguments, Argv, CommandModule} from 'yargs';
 | 
						|
 | 
						|
import {debug, info} from '../../utils/console';
 | 
						|
import {GitClient} from '../../utils/git/index';
 | 
						|
 | 
						|
import {ReleaseNotes} from './release-notes';
 | 
						|
 | 
						|
/** Command line options for building a release. */
 | 
						|
export interface ReleaseNotesOptions {
 | 
						|
  from?: string;
 | 
						|
  to: string;
 | 
						|
  outFile?: string;
 | 
						|
  releaseVersion: SemVer;
 | 
						|
  type: 'github-release'|'changelog';
 | 
						|
}
 | 
						|
 | 
						|
/** Yargs command builder for configuring the `ng-dev release build` command. */
 | 
						|
function builder(argv: Argv): Argv<ReleaseNotesOptions> {
 | 
						|
  return argv
 | 
						|
      .option(
 | 
						|
          'releaseVersion',
 | 
						|
          {type: 'string', default: '0.0.0', coerce: (version: string) => new SemVer(version)})
 | 
						|
      .option('from', {
 | 
						|
        type: 'string',
 | 
						|
        description: 'The git tag or ref to start the changelog entry from',
 | 
						|
        defaultDescription: 'The latest semver tag',
 | 
						|
      })
 | 
						|
      .option('to', {
 | 
						|
        type: 'string',
 | 
						|
        description: 'The git tag or ref to end the changelog entry with',
 | 
						|
        default: 'HEAD',
 | 
						|
      })
 | 
						|
      .option('type', {
 | 
						|
        type: 'string',
 | 
						|
        description: 'The type of release notes to create',
 | 
						|
        choices: ['github-release', 'changelog'] as const,
 | 
						|
        default: 'changelog' as const,
 | 
						|
      })
 | 
						|
      .option('outFile', {
 | 
						|
        type: 'string',
 | 
						|
        description: 'File location to write the generated release notes to',
 | 
						|
        coerce: (filePath?: string) => filePath ? join(process.cwd(), filePath) : undefined
 | 
						|
      });
 | 
						|
}
 | 
						|
 | 
						|
/** Yargs command handler for generating release notes. */
 | 
						|
async function handler({releaseVersion, from, to, outFile, type}: Arguments<ReleaseNotesOptions>) {
 | 
						|
  // Since `yargs` evaluates defaults even if a value as been provided, if no value is provided to
 | 
						|
  // the handler, the latest semver tag on the branch is used.
 | 
						|
  from = from || GitClient.getInstance().getLatestSemverTag().format();
 | 
						|
  /** The ReleaseNotes instance to generate release notes. */
 | 
						|
  const releaseNotes = await ReleaseNotes.fromRange(releaseVersion, from, to);
 | 
						|
 | 
						|
  /** The requested release notes entry. */
 | 
						|
  const releaseNotesEntry = await (
 | 
						|
      type === 'changelog' ? releaseNotes.getChangelogEntry() :
 | 
						|
                             releaseNotes.getGithubReleaseEntry());
 | 
						|
 | 
						|
  if (outFile) {
 | 
						|
    writeFileSync(outFile, releaseNotesEntry);
 | 
						|
    info(`Generated release notes for "${releaseVersion}" written to ${outFile}`);
 | 
						|
  } else {
 | 
						|
    process.stdout.write(releaseNotesEntry);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/** CLI command module for generating release notes. */
 | 
						|
export const ReleaseNotesCommandModule: CommandModule<{}, ReleaseNotesOptions> = {
 | 
						|
  builder,
 | 
						|
  handler,
 | 
						|
  command: 'notes',
 | 
						|
  describe: 'Generate release notes',
 | 
						|
};
 |