From 40bd1b25910d1dc5384a94f7828d993d62f8b5f4 Mon Sep 17 00:00:00 2001 From: Jason Zukewich Date: Fri, 19 Jul 2019 11:19:31 -0600 Subject: [PATCH] Update/fix typedefs for listr (#36924) * update typedefs for listr * prettier fixes * fix tests * add to Definitions by section * add renderer type tests * make context generic --- types/listr/index.d.ts | 75 ++++++++++++++++++++++++++++---------- types/listr/listr-tests.ts | 40 +++++++++++++++++++- 2 files changed, 94 insertions(+), 21 deletions(-) diff --git a/types/listr/index.d.ts b/types/listr/index.d.ts index d50f9022d2..1935ce73e3 100644 --- a/types/listr/index.d.ts +++ b/types/listr/index.d.ts @@ -2,6 +2,7 @@ // Project: https://github.com/samverschueren/listr#readme // Definitions by: Dusan Radovanovic // Vladislav Polyakov +// Jason Zukewich // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // TypeScript Version: 2.8 @@ -11,41 +12,75 @@ import * as stream from "stream"; import { Observable } from "rxjs"; declare namespace Listr { - interface ListrRenderer { - nonTTY: boolean; - render(): void; - end(): void; - } + type ListrContext = any; + type ListrRendererValue = "silent" | "default" | "verbose" | ListrRendererClass; + type ListrTaskResult = string | Promise | Listr | stream.Readable | Observable; - interface ListrOptions { + interface ListrOptions { concurrent?: boolean | number; exitOnError?: boolean; - renderer?: "silent" | "default" | "verbose" | ListrRenderer; - nonTTYRenderer?: "silent" | "default" | "verbose" | ListrRenderer; + renderer?: ListrRendererValue; + nonTTYRenderer?: ListrRendererValue; } - interface ListrTask { + interface ListrEvent { + type: string; + } + + interface ListrTask { + title: string; + task: (ctx: Ctx, task: ListrTaskWrapper) => void | ListrTaskResult; + skip?: (ctx: Ctx) => void | boolean | string | Promise; + enabled?: (ctx: Ctx) => boolean | Promise | Observable; + } + + interface ListrTaskObject extends Observable { title: string; output?: string; - task: (ctx: any, task: ListrTaskWrapper) => void | string | Promise | stream.Readable | Listr | Observable; - skip?: (ctx: any, task: ListrTaskWrapper) => boolean | Promise | string | void | Observable; - enabled?: (ctx: any, task: ListrTaskWrapper) => boolean | Promise | Observable; + task: (ctx: Ctx, task: ListrTaskWrapper) => void | ListrTaskResult; + skip: (ctx: Ctx) => void | boolean | string | Promise; + subtasks: ReadonlyArray>; + state: string; + check: (ctx: Ctx) => void; + hasSubtasks: boolean; + isPending: boolean; + isSkipped: boolean; + isCompleted: boolean; + isEnabled: boolean; + hasFailed: boolean; + run: (ctx: Ctx, wrapper: ListrTaskWrapper) => Promise; } - interface ListrTaskWrapper { + interface ListrTaskWrapper { title: string; - output: any; + output: string; report(error: Error): void; skip(message: string): void; - run(ctx?: any): Promise; + run(ctx?: Ctx): Promise; + } + + interface ListrError extends Error { + context: Ctx; + } + + interface ListrRenderer { + render(): void; + end(err: Error): void; + } + interface ListrRendererClass { + nonTTY: boolean; + new(tasks: ReadonlyArray>, options: ListrOptions): ListrRenderer; } } -declare class Listr { - constructor(tasks?: ReadonlyArray, options?: Listr.ListrOptions); - constructor(options?: Listr.ListrOptions); - add(tasks: Listr.ListrTask | ReadonlyArray): void; - run(ctx?: any): Promise; +declare class Listr { + constructor(tasks?: ReadonlyArray>, options?: Listr.ListrOptions); + constructor(options?: Listr.ListrOptions); + tasks: ReadonlyArray>; + setRenderer(value: Listr.ListrRendererValue): void; + add(tasks: Listr.ListrTask | ReadonlyArray>): void; + render(): void; + run(ctx?: Ctx): Promise; } export = Listr; diff --git a/types/listr/listr-tests.ts b/types/listr/listr-tests.ts index e9ac72b5dc..a367ea414c 100644 --- a/types/listr/listr-tests.ts +++ b/types/listr/listr-tests.ts @@ -1,7 +1,12 @@ import Listr = require("listr"); import * as fs from "fs"; -const tasks = new Listr([ +interface Context { + foo: string; + yarn?: boolean; +} + +const tasks = new Listr([ { title: 'Git', task: () => { @@ -165,3 +170,36 @@ tasks.run({ }).then(ctx => { console.log(ctx); }); + +class CustomRenderer { + constructor(tasks: ReadonlyArray>, options: Listr.ListrOptions) {} + + static nonTTY = true; + + render() {} + end(err: Listr.ListrError) {} +} + +const tasks8 = new Listr( + [ + { + title: 'Success', + task: () => 'Foo', + }, + ], + { + renderer: CustomRenderer, + } +); + +const tasks9 = new Listr( + [ + { + title: 'Success', + task: () => 'Foo', + }, + ], + { + renderer: 'default', + } +);