Add a command to build the release output without stamping for release and link via `yarn link` the generated builds to a project provided. PR Close #42319
		
			
				
	
	
		
			70 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.0 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 {green} from 'chalk';
 | 
						|
import {lstatSync, stat, Stats} from 'fs';
 | 
						|
import {isAbsolute, join, resolve} from 'path';
 | 
						|
import {Arguments, Argv, CommandModule} from 'yargs';
 | 
						|
 | 
						|
import {buildReleaseOutput} from '../../release/build/index';
 | 
						|
import {error, info, red} from '../../utils/console';
 | 
						|
import {exec} from '../../utils/shelljs';
 | 
						|
 | 
						|
 | 
						|
/** Command line options. */
 | 
						|
export interface BuildAndLinkOptions {
 | 
						|
  projectRoot: string;
 | 
						|
}
 | 
						|
 | 
						|
/** Yargs command builder for the command. */
 | 
						|
function builder(argv: Argv): Argv<BuildAndLinkOptions> {
 | 
						|
  return argv.positional('projectRoot', {
 | 
						|
    type: 'string',
 | 
						|
    normalize: true,
 | 
						|
    coerce: (path: string) => resolve(path),
 | 
						|
    demandOption: true,
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
/** Yargs command handler for the command. */
 | 
						|
async function handler({projectRoot}: Arguments<BuildAndLinkOptions>) {
 | 
						|
  try {
 | 
						|
    if (!lstatSync(projectRoot).isDirectory()) {
 | 
						|
      error(red(`  ✘   The 'projectRoot' must be a directory: ${projectRoot}`));
 | 
						|
      process.exit(1);
 | 
						|
    }
 | 
						|
  } catch {
 | 
						|
    error(red(`  ✘   Could not find the 'projectRoot' provided: ${projectRoot}`));
 | 
						|
    process.exit(1);
 | 
						|
  }
 | 
						|
 | 
						|
  const releaseOutputs = await buildReleaseOutput(false);
 | 
						|
 | 
						|
  if (releaseOutputs === null) {
 | 
						|
    error(red(`  ✘   Could not build release output. Please check output above.`));
 | 
						|
    process.exit(1);
 | 
						|
  }
 | 
						|
  info(green(` ✓  Built release output.`));
 | 
						|
 | 
						|
  for (const {outputPath, name} of releaseOutputs) {
 | 
						|
    exec(`yarn link --cwd ${outputPath}`);
 | 
						|
    exec(`yarn link --cwd ${projectRoot} ${name}`);
 | 
						|
  }
 | 
						|
 | 
						|
  info(green(` ✓  Linked release packages in provided project.`));
 | 
						|
}
 | 
						|
 | 
						|
/** CLI command module. */
 | 
						|
export const BuildAndLinkCommandModule: CommandModule<{}, BuildAndLinkOptions> = {
 | 
						|
  builder,
 | 
						|
  handler,
 | 
						|
  command: 'build-and-link <projectRoot>',
 | 
						|
  describe:
 | 
						|
      'Builds the release output, registers the outputs as linked, and links via yarn to the provided project',
 | 
						|
};
 |