Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixing lint errors in TypeScript #1208

Merged
merged 4 commits into from Mar 23, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
95 changes: 55 additions & 40 deletions typings/commander-tests.ts
@@ -1,11 +1,16 @@
import * as commander from './index';
import { Script } from 'vm';

// Test Commander usage with TypeScript.
// This is NOT a usable program, just used to test for compile errors!

// We declare lots of variables just to check types of right-side of expression, so disable this:
/* eslint-disable @typescript-eslint/no-unused-vars */

// This conflicts with esline rule saying no space!
/* eslint-disable @typescript-eslint/space-before-function-paren */

// Defined stricter type, as the options as properties `[key: string]: any`
// makes the type checking very weak.
// makes the type checking very weak.
// https://github.com/Microsoft/TypeScript/issues/25987#issuecomment-441224690
type KnownKeys<T> = {
[K in keyof T]: string extends K ? never : number extends K ? never : K
Expand All @@ -28,6 +33,7 @@ const errorInstance = new commander.CommanderError(1, 'code', 'message');

// Command properties
console.log(programWithOptions.someOption);
// eslint-disable-next-line dot-notation
console.log(programWithOptions['someOption']);
const theArgs = program.args;
const theCommands: commander.Command[] = program.commands;
Expand All @@ -47,14 +53,14 @@ const commandThis2: commander.Command = program.command('exec', 'exec descriptio
const addCommandThis: commander.Command = program.addCommand(new commander.Command('abc'));

// arguments
const argumentsThis: commander.Command = program.arguments('<cmd> [env]')
const argumentsThis: commander.Command = program.arguments('<cmd> [env]');

// exitOverride
const exitThis1: commander.Command = program.exitOverride();
const exitThis2: commander.Command = program.exitOverride((err):never => {
const exitThis2: commander.Command = program.exitOverride((err): never => {
return process.exit(err.exitCode);
});
const exitThis3: commander.Command = program.exitOverride((err):void => {
const exitThis3: commander.Command = program.exitOverride((err): void => {
if (err.code !== 'commander.executeSubCommandAsync') {
throw err;
} else {
Expand All @@ -63,57 +69,61 @@ const exitThis3: commander.Command = program.exitOverride((err):void => {
});

// action
const actionThis1: commander.Command = program.action(() => { });
const actionThis2: commander.Command = program.action(async () => { });
const actionThis1: commander.Command = program.action(() => {
// do nothing.
});
const actionThis2: commander.Command = program.action(async() => {
// do nothing.
});

// option
const optionThis1: commander.Command = program.option('-a,--alpha');
const optionThis2: commander.Command = program.option('-p, --peppers', 'Add peppers')
const optionThis3: commander.Command = program.option('-s, --string [value]', 'default string', 'value')
const optionThis2: commander.Command = program.option('-p, --peppers', 'Add peppers');
const optionThis3: commander.Command = program.option('-s, --string [value]', 'default string', 'value');
const optionThis4: commander.Command = program.option('-b, --boolean', 'default boolean', false);

// example coercion functions from README

function range(val: string) {
function range(val: string): Number[] {
return val.split('..').map(Number);
}

function myParseInt(value: string, dummyPrevious: number) {
function myParseInt(value: string, dummyPrevious: number): number {
return parseInt(value);
}

function increaseVerbosity(dummyValue: string, previous: number) {
function increaseVerbosity(dummyValue: string, previous: number): number {
return previous + 1;
}

function collect(value: string, previous: string[]) {
function collect(value: string, previous: string[]): string[] {
return previous.concat([value]);
}

function commaSeparatedList(value: string, dummyPrevious: string[]) {
function commaSeparatedList(value: string, dummyPrevious: string[]): string[] {
return value.split(',');
}

const optionThis5: commander.Command = program.option('-f, --float <number>', 'float argument', parseFloat)
const optionThis6: commander.Command = program.option('-f, --float <number>', 'float argument', parseFloat, 3.2)
const optionThis7: commander.Command = program.option('-i, --integer <number>', 'integer argument', myParseInt)
const optionThis8: commander.Command = program.option('-i, --integer <number>', 'integer argument', myParseInt, 5)
const optionThis9: commander.Command = program.option('-v, --verbose', 'verbosity that can be increased', increaseVerbosity, 0)
const optionThis10: commander.Command = program.option('-c, --collect <value>', 'repeatable value', collect, [])
const optionThis5: commander.Command = program.option('-f, --float <number>', 'float argument', parseFloat);
const optionThis6: commander.Command = program.option('-f, --float <number>', 'float argument', parseFloat, 3.2);
const optionThis7: commander.Command = program.option('-i, --integer <number>', 'integer argument', myParseInt);
const optionThis8: commander.Command = program.option('-i, --integer <number>', 'integer argument', myParseInt, 5);
const optionThis9: commander.Command = program.option('-v, --verbose', 'verbosity that can be increased', increaseVerbosity, 0);
const optionThis10: commander.Command = program.option('-c, --collect <value>', 'repeatable value', collect, []);
const optionThis11: commander.Command = program.option('-l, --list <items>', 'comma separated list', commaSeparatedList);

// requiredOption, same tests as option
const requiredOptionThis1: commander.Command = program.requiredOption('-a,--alpha');
const requiredOptionThis2: commander.Command = program.requiredOption('-p, --peppers', 'Add peppers')
const requiredOptionThis3: commander.Command = program.requiredOption('-s, --string [value]', 'default string', 'value')
const requiredOptionThis2: commander.Command = program.requiredOption('-p, --peppers', 'Add peppers');
const requiredOptionThis3: commander.Command = program.requiredOption('-s, --string [value]', 'default string', 'value');
const requiredOptionThis4: commander.Command = program.requiredOption('-b, --boolean', 'default boolean', false);

const requiredOptionThis5: commander.Command = program.requiredOption('-f, --float <number>', 'float argument', parseFloat)
const requiredOptionThis6: commander.Command = program.requiredOption('-f, --float <number>', 'float argument', parseFloat, 3.2)
const requiredOptionThis7: commander.Command = program.requiredOption('-i, --integer <number>', 'integer argument', myParseInt)
const requiredOptionThis8: commander.Command = program.requiredOption('-i, --integer <number>', 'integer argument', myParseInt, 5)
const requiredOptionThis9: commander.Command = program.requiredOption('-v, --verbose', 'verbosity that can be increased', increaseVerbosity, 0)
const requiredOptionThis10: commander.Command = program.requiredOption('-c, --collect <value>', 'repeatable value', collect, [])
const requiredOptionThis5: commander.Command = program.requiredOption('-f, --float <number>', 'float argument', parseFloat);
const requiredOptionThis6: commander.Command = program.requiredOption('-f, --float <number>', 'float argument', parseFloat, 3.2);
const requiredOptionThis7: commander.Command = program.requiredOption('-i, --integer <number>', 'integer argument', myParseInt);
const requiredOptionThis8: commander.Command = program.requiredOption('-i, --integer <number>', 'integer argument', myParseInt, 5);
const requiredOptionThis9: commander.Command = program.requiredOption('-v, --verbose', 'verbosity that can be increased', increaseVerbosity, 0);
const requiredOptionThis10: commander.Command = program.requiredOption('-c, --collect <value>', 'repeatable value', collect, []);
const requiredOptionThis11: commander.Command = program.requiredOption('-l, --list <items>', 'comma separated list', commaSeparatedList);

// storeOptionsAsProperties
Expand All @@ -133,47 +143,47 @@ const parseThis1: commander.Command = program.parse();
const parseThis2: commander.Command = program.parse(process.argv);
const parseThis3: commander.Command = program.parse(['node', 'script.js'], { from: 'node' });
const parseThis4: commander.Command = program.parse(['node', 'script.js'], { from: 'electron' });
const parseThis5: commander.Command = program.parse(['--option'], { from: "user" });
const parseThis5: commander.Command = program.parse(['--option'], { from: 'user' });

// parseAsync, same tests as parse
const parseAsyncThis1: Promise<commander.Command> = program.parseAsync();
const parseAsyncThis2: Promise<commander.Command> = program.parseAsync(process.argv);
const parseAsyncThis3: Promise<commander.Command> = program.parseAsync(['node', 'script.js'], { from: 'node' });
const parseAsyncThis4: Promise<commander.Command> = program.parseAsync(['node', 'script.js'], { from: 'electron' });
const parseAsyncThis5: Promise<commander.Command> = program.parseAsync(['--option'], { from: "user" });
const parseAsyncThis5: Promise<commander.Command> = program.parseAsync(['--option'], { from: 'user' });

// parseOptions (and ParseOptionsResult)
const { operands, unknown } = program.parseOptions(['node', 'script.js', 'hello']);

// opts
const opts = program.opts();
const optsVal1 = opts.foo;
// eslint-disable-next-line dot-notation
const opstVale2 = opts['bar'];

// description
const descriptionThis: commander.Command = program.description("my description");
const descriptionThis: commander.Command = program.description('my description');
const descriptionValue: string = program.description();

// alias
const aliasThis: commander.Command = program.alias("my alias");
const aliasThis: commander.Command = program.alias('my alias');
const aliasValue: string = program.alias();

// usage
const usageThis: commander.Command = program.usage("my usage");
const usageThis: commander.Command = program.usage('my usage');
const usageValue: string = program.usage();

// name
const nameThis: commander.Command = program.name("my-name");
const nameThis: commander.Command = program.name('my-name');
const nameValue: string = program.name();

// outputHelp
program.outputHelp();
program.outputHelp((str: string) => { return str });
program.outputHelp((str: string) => { return str; });

// help
program.help();
program.help((str: string) => { return str });

program.help((str: string) => { return str; });

// helpInformation
const helpInformnationValue: string = program.helpInformation();
Expand All @@ -184,18 +194,23 @@ const helpOptionThis2: commander.Command = program.helpOption('-h,--help', 'cust
const helpOptionThis3: commander.Command = program.helpOption(undefined, 'custom description');

// on
const onThis: commander.Command = program.on('--help', () => { })
const onThis: commander.Command = program.on('--help', () => {
// do nothing.
});

// createCommand

const createInstance1: commander.Command = program.createCommand();
const createInstance2: commander.Command = program.createCommand('name');

class MyCommand extends commander.Command {
createCommand(name?: string) {
createCommand(name?: string): MyCommand {
return new MyCommand(name);
}
myFunction() {}

myFunction(): void {
// do nothing.
}
}
const myProgram = new MyCommand();
myProgram.myFunction();
Expand Down