mirror of
https://github.com/angular/angular-cli.git
synced 2025-05-20 13:32:43 +08:00
Apart from better code quality, this helps reduce the time of CLI bootstrapping time, as retrieving the package manager name is a rather expensive operator due to the number of process spawns. The package manager name isn't always needed until we run a command and therefore in some cases we can see an improvement of around `~600ms`. Ex: `ng b --help`. From ` 1.34s` to `0.76s`. This will be important when we eventually introduce auto complete as users will get faster loopback.
108 lines
3.5 KiB
TypeScript
108 lines
3.5 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 { Argv } from 'yargs';
|
|
import {
|
|
CommandModuleImplementation,
|
|
CommandScope,
|
|
Options,
|
|
OtherOptions,
|
|
} from '../../command-builder/command-module';
|
|
import {
|
|
DEFAULT_SCHEMATICS_COLLECTION,
|
|
SchematicsCommandArgs,
|
|
SchematicsCommandModule,
|
|
} from '../../command-builder/schematics-command-module';
|
|
import { VERSION } from '../../utilities/version';
|
|
|
|
interface NewCommandArgs extends SchematicsCommandArgs {
|
|
collection?: string;
|
|
}
|
|
|
|
export class NewCommandModule
|
|
extends SchematicsCommandModule
|
|
implements CommandModuleImplementation<NewCommandArgs>
|
|
{
|
|
private readonly schematicName = 'ng-new';
|
|
static override scope = CommandScope.Out;
|
|
protected override allowPrivateSchematics = true;
|
|
|
|
command = 'new [name]';
|
|
aliases = 'n';
|
|
describe = 'Creates a new Angular workspace.';
|
|
longDescriptionPath?: string | undefined;
|
|
|
|
override async builder(argv: Argv): Promise<Argv<NewCommandArgs>> {
|
|
const localYargs = (await super.builder(argv)).option('collection', {
|
|
alias: 'c',
|
|
describe: 'A collection of schematics to use in generating the initial application.',
|
|
type: 'string',
|
|
});
|
|
|
|
const {
|
|
options: { collectionNameFromArgs },
|
|
} = this.context.args;
|
|
|
|
const collectionName =
|
|
typeof collectionNameFromArgs === 'string'
|
|
? collectionNameFromArgs
|
|
: await this.getCollectionFromConfig();
|
|
|
|
const workflow = await this.getOrCreateWorkflowForBuilder(collectionName);
|
|
const collection = workflow.engine.createCollection(collectionName);
|
|
const options = await this.getSchematicOptions(collection, this.schematicName, workflow);
|
|
|
|
return this.addSchemaOptionsToCommand(localYargs, options);
|
|
}
|
|
|
|
async run(options: Options<NewCommandArgs> & OtherOptions): Promise<number | void> {
|
|
// Register the version of the CLI in the registry.
|
|
const collectionName = options.collection ?? (await this.getCollectionFromConfig());
|
|
const workflow = await this.getOrCreateWorkflowForExecution(collectionName, options);
|
|
workflow.registry.addSmartDefaultProvider('ng-cli-version', () => VERSION.full);
|
|
|
|
const { dryRun, force, interactive, defaults, collection, ...schematicOptions } = options;
|
|
|
|
// Compatibility check for NPM 7
|
|
if (
|
|
collectionName === '@schematics/angular' &&
|
|
!schematicOptions.skipInstall &&
|
|
(schematicOptions.packageManager === undefined || schematicOptions.packageManager === 'npm')
|
|
) {
|
|
this.context.packageManager.ensureCompatibility();
|
|
}
|
|
|
|
return this.runSchematic({
|
|
collectionName,
|
|
schematicName: this.schematicName,
|
|
schematicOptions,
|
|
executionOptions: {
|
|
dryRun,
|
|
force,
|
|
interactive,
|
|
defaults,
|
|
},
|
|
});
|
|
}
|
|
|
|
/** Find a collection from config that has an `ng-new` schematic. */
|
|
private async getCollectionFromConfig(): Promise<string> {
|
|
for (const collectionName of await this.getSchematicCollections()) {
|
|
const workflow = this.getOrCreateWorkflowForBuilder(collectionName);
|
|
const collection = workflow.engine.createCollection(collectionName);
|
|
const schematicsInCollection = collection.description.schematics;
|
|
|
|
if (Object.keys(schematicsInCollection).includes(this.schematicName)) {
|
|
return collectionName;
|
|
}
|
|
}
|
|
|
|
return DEFAULT_SCHEMATICS_COLLECTION;
|
|
}
|
|
}
|