diff --git a/dev-infra/commit-message/cli.ts b/dev-infra/commit-message/cli.ts index ebdde827e4..90143ccee2 100644 --- a/dev-infra/commit-message/cli.ts +++ b/dev-infra/commit-message/cli.ts @@ -18,14 +18,16 @@ export function buildCommitMessageParser(localYargs: yargs.Argv) { return localYargs.help() .strict() .command( - 'restore-commit-message-draft', false, { - 'file-env-variable': { + 'restore-commit-message-draft', false, + args => { + return args.option('file-env-variable', { type: 'string', + array: true, conflicts: ['file'], required: true, description: - 'The key for the environment variable which holds the arguments for the ' + - 'prepare-commit-msg hook as described here: ' + + 'The key for the environment variable which holds the arguments for the\n' + + 'prepare-commit-msg hook as described here:\n' + 'https://git-scm.com/docs/githooks#_prepare_commit_msg', coerce: arg => { const [file, source] = (process.env[arg] || '').split(' '); @@ -34,10 +36,10 @@ export function buildCommitMessageParser(localYargs: yargs.Argv) { } return [file, source]; }, - } + }); }, args => { - restoreCommitMessage(args.fileEnvVariable[0], args.fileEnvVariable[1]); + restoreCommitMessage(args['file-env-variable'][0], args['file-env-variable'][1] as any); }) .command( 'pre-commit-validate', 'Validate the most recent commit message', { @@ -61,7 +63,7 @@ export function buildCommitMessageParser(localYargs: yargs.Argv) { } }, args => { - const file = args.file || args.fileEnvVariable || '.git/COMMIT_EDITMSG'; + const file = args.file || args['file-env-variable'] || '.git/COMMIT_EDITMSG'; validateFile(file); }) .command( diff --git a/dev-infra/format/cli.ts b/dev-infra/format/cli.ts index 8c635575ab..77dc650369 100644 --- a/dev-infra/format/cli.ts +++ b/dev-infra/format/cli.ts @@ -22,28 +22,31 @@ export function buildFormatParser(localYargs: yargs.Argv) { description: 'Run the formatter to check formatting rather than updating code format' }) .command( - 'all', 'Run the formatter on all files in the repository', {}, + 'all', 'Run the formatter on all files in the repository', args => args, ({check}) => { const executionCmd = check ? checkFiles : formatFiles; executionCmd(allFiles()); }) .command( - 'changed [shaOrRef]', 'Run the formatter on files changed since the provided sha/ref', {}, + 'changed [shaOrRef]', 'Run the formatter on files changed since the provided sha/ref', + args => args.positional('shaOrRef', {type: 'string'}), ({shaOrRef, check}) => { const sha = shaOrRef || 'master'; const executionCmd = check ? checkFiles : formatFiles; executionCmd(allChangedFilesSince(sha)); }) .command( - 'staged', 'Run the formatter on all staged files', {}, + 'staged', 'Run the formatter on all staged files', args => args, ({check}) => { const executionCmd = check ? checkFiles : formatFiles; executionCmd(allStagedFiles()); }) - .command('files ', 'Run the formatter on provided files', {}, ({check, files}) => { - const executionCmd = check ? checkFiles : formatFiles; - executionCmd(files); - }); + .command( + 'files ', 'Run the formatter on provided files', + args => args.positional('files', {array: true, type: 'string'}), ({check, files}) => { + const executionCmd = check ? checkFiles : formatFiles; + executionCmd(files!); + }); } if (require.main === module) { diff --git a/dev-infra/pr/discover-new-conflicts/cli.ts b/dev-infra/pr/discover-new-conflicts/cli.ts index 672afb3c14..27f83b69e9 100644 --- a/dev-infra/pr/discover-new-conflicts/cli.ts +++ b/dev-infra/pr/discover-new-conflicts/cli.ts @@ -12,18 +12,28 @@ import {error} from '../../utils/console'; import {discoverNewConflictsForPr} from './index'; +/** The options available to the discover-new-conflicts command via CLI. */ +export interface DiscoverNewConflictsCommandOptions { + date: number; + 'pr-number': number; +} + /** Builds the discover-new-conflicts pull request command. */ -export function buildDiscoverNewConflictsCommand(yargs: Argv) { - return yargs.option('date', { - description: 'Only consider PRs updated since provided date', - defaultDescription: '30 days ago', - coerce: Date.parse, - default: getThirtyDaysAgoDate, - }); +export function buildDiscoverNewConflictsCommand(yargs: Argv): + Argv { + return yargs + .option('date', { + description: 'Only consider PRs updated since provided date', + defaultDescription: '30 days ago', + coerce: (date) => typeof date === 'number' ? date : Date.parse(date), + default: getThirtyDaysAgoDate(), + }) + .positional('pr-number', {demandOption: true, type: 'number'}); } /** Handles the discover-new-conflicts pull request command. */ -export async function handleDiscoverNewConflictsCommand({prNumber, date}: Arguments) { +export async function handleDiscoverNewConflictsCommand( + {'pr-number': prNumber, date}: Arguments) { // If a provided date is not able to be parsed, yargs provides it as NaN. if (isNaN(date)) { error('Unable to parse the value provided via --date flag'); @@ -33,11 +43,11 @@ export async function handleDiscoverNewConflictsCommand({prNumber, date}: Argume } /** Gets a date object 30 days ago from today. */ -function getThirtyDaysAgoDate(): Date { +function getThirtyDaysAgoDate() { const date = new Date(); // Set the hours, minutes and seconds to 0 to only consider date. date.setHours(0, 0, 0, 0); // Set the date to 30 days in the past. date.setDate(date.getDate() - 30); - return date; + return date.getTime(); } diff --git a/dev-infra/pr/merge/cli.ts b/dev-infra/pr/merge/cli.ts index b1d30223d6..785b9fb2da 100644 --- a/dev-infra/pr/merge/cli.ts +++ b/dev-infra/pr/merge/cli.ts @@ -12,17 +12,26 @@ import {error, red, yellow} from '../../utils/console'; import {GITHUB_TOKEN_GENERATE_URL, mergePullRequest} from './index'; +/** The options available to the merge command via CLI. */ +export interface MergeCommandOptions { + 'github-token'?: string; + 'pr-number': number; +} + /** Builds the options for the merge command. */ -export function buildMergeCommand(yargs: Argv) { - return yargs.help().strict().option('github-token', { - type: 'string', - description: 'Github token. If not set, token is retrieved from the environment variables.' - }); +export function buildMergeCommand(yargs: Argv): Argv { + return yargs.help() + .strict() + .positional('pr-number', {demandOption: true, type: 'number'}) + .option('github-token', { + type: 'string', + description: 'Github token. If not set, token is retrieved from the environment variables.' + }); } /** Handles the merge command. i.e. performs the merge of a specified pull request. */ -export async function handleMergeCommand(args: Arguments) { - const githubToken = args.githubToken || process.env.GITHUB_TOKEN || process.env.TOKEN; +export async function handleMergeCommand(args: Arguments) { + const githubToken = args['github-token'] || process.env.GITHUB_TOKEN || process.env.TOKEN; if (!githubToken) { error(red('No Github token set. Please set the `GITHUB_TOKEN` environment variable.')); error(red('Alternatively, pass the `--github-token` command line flag.')); @@ -30,5 +39,5 @@ export async function handleMergeCommand(args: Arguments) { process.exit(1); } - await mergePullRequest(args.prNumber, githubToken); + await mergePullRequest(args['pr-number'], githubToken); } diff --git a/dev-infra/pr/rebase/cli.ts b/dev-infra/pr/rebase/cli.ts index 03a369d891..d06ace794a 100644 --- a/dev-infra/pr/rebase/cli.ts +++ b/dev-infra/pr/rebase/cli.ts @@ -15,17 +15,26 @@ import {rebasePr} from './index'; /** URL to the Github page where personal access tokens can be generated. */ export const GITHUB_TOKEN_GENERATE_URL = `https://github.com/settings/tokens`; -/** Builds the rebase pull request command. */ -export function buildRebaseCommand(yargs: Argv) { - return yargs.option('github-token', { - type: 'string', - description: 'Github token. If not set, token is retrieved from the environment variables.' - }); +/** The options available to the rebase command via CLI. */ +export interface RebaseCommandOptions { + 'github-token'?: string; + prNumber: number; } +/** Builds the rebase pull request command. */ +export function buildRebaseCommand(yargs: Argv): Argv { + return yargs + .option('github-token', { + type: 'string', + description: 'Github token. If not set, token is retrieved from the environment variables.' + }) + .positional('prNumber', {type: 'number', demandOption: true}); +} + + /** Handles the rebase pull request command. */ -export async function handleRebaseCommand(args: Arguments) { - const githubToken = args.githubToken || process.env.GITHUB_TOKEN || process.env.TOKEN; +export async function handleRebaseCommand(args: Arguments) { + const githubToken = args['github-token'] || process.env.GITHUB_TOKEN || process.env.TOKEN; if (!githubToken) { error('No Github token set. Please set the `GITHUB_TOKEN` environment variable.'); error('Alternatively, pass the `--github-token` command line flag.'); diff --git a/dev-infra/ts-circular-dependencies/index.ts b/dev-infra/ts-circular-dependencies/index.ts index df597bf6e2..fb90015f2f 100644 --- a/dev-infra/ts-circular-dependencies/index.ts +++ b/dev-infra/ts-circular-dependencies/index.ts @@ -30,20 +30,19 @@ export function tsCircularDependenciesBuilder(localYargs: yargs.Argv) { {type: 'string', demandOption: true, description: 'Path to the configuration file.'}) .option('warnings', {type: 'boolean', description: 'Prints all warnings.'}) .command( - 'check', 'Checks if the circular dependencies have changed.', {}, - (argv: yargs.Arguments) => { + 'check', 'Checks if the circular dependencies have changed.', args => args, + argv => { const {config: configArg, warnings} = argv; const configPath = isAbsolute(configArg) ? configArg : resolve(configArg); const config = loadTestConfig(configPath); - process.exit(main(false, config, warnings)); + process.exit(main(false, config, !!warnings)); }) - .command( - 'approve', 'Approves the current circular dependencies.', {}, (argv: yargs.Arguments) => { - const {config: configArg, warnings} = argv; - const configPath = isAbsolute(configArg) ? configArg : resolve(configArg); - const config = loadTestConfig(configPath); - process.exit(main(true, config, warnings)); - }); + .command('approve', 'Approves the current circular dependencies.', args => args, argv => { + const {config: configArg, warnings} = argv; + const configPath = isAbsolute(configArg) ? configArg : resolve(configArg); + const config = loadTestConfig(configPath); + process.exit(main(true, config, !!warnings)); + }); } /** diff --git a/package.json b/package.json index 4b7ad01010..2fcd6424bc 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "@types/shelljs": "^0.8.6", "@types/systemjs": "0.19.32", "@types/yaml": "^1.2.0", - "@types/yargs": "^11.1.1", + "@types/yargs": "^15.0.5", "@webcomponents/custom-elements": "^1.1.0", "angular": "npm:angular@1.7", "angular-1.5": "npm:angular@1.5", @@ -153,7 +153,7 @@ "typescript": "~3.9.5", "xhr2": "0.2.0", "yaml": "^1.7.2", - "yargs": "15.3.0" + "yargs": "^15.4.1" }, "// 2": "devDependencies are not used under Bazel. Many can be removed after test.sh is deleted.", "devDependencies": { diff --git a/yarn.lock b/yarn.lock index c234a1cc6e..54131051c6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2352,10 +2352,17 @@ resolved "https://registry.yarnpkg.com/@types/yaml/-/yaml-1.2.0.tgz#4ed577fc4ebbd6b829b28734e56d10c9e6984e09" integrity sha512-GW8b9qM+ebgW3/zjzPm0I1NxMvLaz/YKT9Ph6tTb+Fkeyzd9yLTvQ6ciQ2MorTRmb/qXmfjMerRpG4LviixaqQ== -"@types/yargs@^11.1.1": - version "11.1.5" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-11.1.5.tgz#8d71dfe4848ac5d714b75eca3df9cac75a4f8dac" - integrity sha512-1jmXgoIyzxQSm33lYgEXvegtkhloHbed2I0QGlTN66U2F9/ExqJWSCSmaWC0IB/g1tW+IYSp+tDhcZBYB1ZGog== +"@types/yargs-parser@*": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" + integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== + +"@types/yargs@^15.0.5": + version "15.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.5.tgz#947e9a6561483bdee9adffc983e91a6902af8b79" + integrity sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w== + dependencies: + "@types/yargs-parser" "*" "@types/yauzl@^2.9.1": version "2.9.1" @@ -16301,10 +16308,10 @@ yargs-parser@^15.0.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^18.1.0: - version "18.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.2.tgz#2f482bea2136dbde0861683abea7756d30b504f1" - integrity sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ== +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" @@ -16316,23 +16323,6 @@ yargs-parser@^9.0.2: dependencies: camelcase "^4.1.0" -yargs@15.3.0: - version "15.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.0.tgz#403af6edc75b3ae04bf66c94202228ba119f0976" - integrity sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.0" - yargs@^11.0.0: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.1.tgz#5052efe3446a4df5ed669c995886cc0f13702766" @@ -16384,6 +16374,23 @@ yargs@^14.2.3: y18n "^4.0.0" yargs-parser "^15.0.1" +yargs@^15.4.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + yauzl@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"