diff --git a/packages/angular/cli/models/command.ts b/packages/angular/cli/models/command.ts index 6519393aae2f..067464c56da9 100644 --- a/packages/angular/cli/models/command.ts +++ b/packages/angular/cli/models/command.ts @@ -169,9 +169,7 @@ export abstract class Command abstract async run(options: T & Arguments): Promise; async validateAndRun(options: T & Arguments): Promise { - if (!(options.help === true || options.help === 'json' || options.help === 'JSON')) { - await this.validateScope(); - } + await this.validateScope(); await this.initialize(options); if (options.help === true) { diff --git a/scripts/validate-user-analytics.ts b/scripts/validate-user-analytics.ts index 725e2447ec81..b0d6600e4289 100644 --- a/scripts/validate-user-analytics.ts +++ b/scripts/validate-user-analytics.ts @@ -95,13 +95,26 @@ async function _checkDimensions(dimensionsTable: string, logger: logging.Logger) const commands = require('../packages/angular/cli/commands.json'); const ngPath = path.join(newProjectRoot, 'node_modules/.bin/ng'); - for (const commandName of Object.keys(commands)) { - const options = { cwd: newProjectRoot }; - const childLogger = logger.createChild(commandName); - const stdout = _exec(ngPath, [commandName, '--help=json'], options, childLogger); - commandDescription[commandName] = JSON.parse(stdout.trim()); + const options = { cwd: newProjectRoot }; + + function execCommands(commands: string[]) { + for (const commandName of commands) { + const childLogger = logger.createChild(commandName); + const stdout = _exec(ngPath, [commandName, '--help=json'], options, childLogger); + commandDescription[commandName] = JSON.parse(stdout.trim()); + } } + const commandsToRunInAProject = Object.keys(commands).filter(commandName => commandName !== 'new'); + // `ng new` is the only command that's required to run outside of an Angular project + const commandsToRunOutsideOfAProject = ['new']; + + execCommands(commandsToRunInAProject); + const angularJsonPath = path.join(newProjectRoot, 'angular.json'); + // Remove `angular.json` to ensure `ng new` is runnable in the same directory + fs.unlinkSync(angularJsonPath); + execCommands(commandsToRunOutsideOfAProject); + function _checkOptionsForAnalytics(options: Option[]) { for (const option of options) { if (option.subcommands) { diff --git a/tests/legacy-cli/e2e/tests/commands/help/help-hidden.ts b/tests/legacy-cli/e2e/tests/commands/help/help-hidden.ts index 5f88a787257c..a67a4748a792 100644 --- a/tests/legacy-cli/e2e/tests/commands/help/help-hidden.ts +++ b/tests/legacy-cli/e2e/tests/commands/help/help-hidden.ts @@ -14,7 +14,7 @@ export default function() { `); } }) - .then(() => silentNg('--help', 'new')) + .then(() => silentNg('--help', 'generate')) .then(({ stdout }) => { if (stdout.match(/--link-cli/)) { throw new Error(oneLine` diff --git a/tests/legacy-cli/e2e/tests/commands/help/help-json.ts b/tests/legacy-cli/e2e/tests/commands/help/help-json.ts index af4f18872990..e9d60bfc3df3 100644 --- a/tests/legacy-cli/e2e/tests/commands/help/help-json.ts +++ b/tests/legacy-cli/e2e/tests/commands/help/help-json.ts @@ -1,15 +1,27 @@ import { silentNg } from '../../../utils/process'; - +import { deleteFile } from '../../../utils/fs'; export default async function() { const commands = require('@angular/cli/commands.json'); - for (const commandName of Object.keys(commands)) { - const { stdout } = await silentNg(commandName, '--help=json'); - if (stdout.trim()) { - JSON.parse(stdout); - } else { - console.warn(`No JSON output for command [${commandName}].`); + async function execCommands(commands: string[]) { + for (const commandName of commands) { + const { stdout } = await silentNg(commandName, '--help=json'); + + if (stdout.trim()) { + JSON.parse(stdout); + } else { + console.warn(`No JSON output for command [${commandName}].`); + } } } + + const commandsToRunInAProject = Object.keys(commands).filter(commandName => commandName !== 'new'); + // `ng new` is the only command that's required to run outside of an Angular project + const commandsToRunOutsideOfAProject = ['new']; + + await execCommands(commandsToRunInAProject); + // Remove `angular.json` to ensure `ng new` is runnable in the same directory + await deleteFile('angular.json'); + await execCommands(commandsToRunOutsideOfAProject); }