From 2e86ecb65a2c6b6d5966d251f900d4d9cb9126b1 Mon Sep 17 00:00:00 2001 From: Saihajpreet Singh Date: Wed, 6 Jul 2022 12:58:51 -0500 Subject: [PATCH] feat: migrate to listr2 (#8005) * use listr2 * try custom renderer * make progress with errors * remove old listr stuff * make test happy * refactor * improve types * changeset * update changeset * Update .changeset/weak-monkeys-wink.md Co-authored-by: Laurin Quast Co-authored-by: Laurin Quast --- .changeset/weak-monkeys-wink.md | 17 + packages/graphql-codegen-cli/package.json | 10 +- packages/graphql-codegen-cli/src/codegen.ts | 451 +++++++++--------- .../src/utils/indentString.ts | 55 --- .../src/utils/listr-renderer.ts | 173 ------- yarn.lock | 281 +---------- 6 files changed, 245 insertions(+), 742 deletions(-) create mode 100644 .changeset/weak-monkeys-wink.md delete mode 100644 packages/graphql-codegen-cli/src/utils/indentString.ts delete mode 100644 packages/graphql-codegen-cli/src/utils/listr-renderer.ts diff --git a/.changeset/weak-monkeys-wink.md b/.changeset/weak-monkeys-wink.md new file mode 100644 index 00000000000..922ca2a85f7 --- /dev/null +++ b/.changeset/weak-monkeys-wink.md @@ -0,0 +1,17 @@ +--- +'@graphql-codegen/cli': patch +--- + +### Summary + +- Migrate to [`listr2`](https://listr2.kilic.dev) +- Remove custom renderer for `listr` +- Remove unused dependencies + +### Why + +[`listr`](https://github.com/SamVerschueren/listr) is not actively maintained and we have to maintain our custom renderer for it to display errors. Migrating to `listr2` it just works out of the almost similar to how it was working in past and is a actively maintained. + +### Dev notes +Big change for us is how errors were collected. In `listr` errors were thrown and were caught in the `end` function of our custom `listr` Renderer but with `listr2` we don't really get `Error` in `end` function always so instead we use the [context](https://listr2.kilic.dev/getting-started/the-concept-of-context) to collect errors from all the tasks and then show them after all the tasks are finished. + diff --git a/packages/graphql-codegen-cli/package.json b/packages/graphql-codegen-cli/package.json index abb27a5be29..9c8f4c8db1a 100644 --- a/packages/graphql-codegen-cli/package.json +++ b/packages/graphql-codegen-cli/package.json @@ -54,9 +54,7 @@ "@graphql-tools/utils": "^8.8.0", "ansi-escapes": "^4.3.1", "chalk": "^4.1.0", - "change-case-all": "1.0.14", "chokidar": "^3.5.2", - "common-tags": "^1.8.0", "cosmiconfig": "^7.0.0", "cross-undici-fetch": "^0.4.11", "debounce": "^1.2.0", @@ -65,25 +63,23 @@ "inquirer": "^8.0.0", "is-glob": "^4.0.1", "json-to-pretty-yaml": "^1.2.2", - "listr": "^0.14.3", - "listr-update-renderer": "^0.5.0", + "listr2": "^4.0.5", "log-symbols": "^4.0.0", "mkdirp": "^1.0.4", "string-env-interpolation": "^1.0.1", "ts-log": "^2.2.3", - "wrap-ansi": "^7.0.0", "yaml": "^1.10.0", "yargs": "^17.0.0" }, "devDependencies": { + "@graphql-tools/merge": "8.3.0", "@types/debounce": "1.2.1", "@types/inquirer": "8.2.1", "@types/is-glob": "4.0.2", "@types/js-yaml": "4.0.5", - "@types/listr": "0.14.4", "@types/mkdirp": "1.0.2", - "@graphql-tools/merge": "8.3.0", "bdd-stdin": "0.2.0", + "change-case-all": "^1.0.14", "js-yaml": "4.1.0", "make-dir": "3.1.0", "prettier": "2.7.1" diff --git a/packages/graphql-codegen-cli/src/codegen.ts b/packages/graphql-codegen-cli/src/codegen.ts index 81b5d3c871e..eb64f18ad97 100644 --- a/packages/graphql-codegen-cli/src/codegen.ts +++ b/packages/graphql-codegen-cli/src/codegen.ts @@ -12,7 +12,6 @@ import { codegen } from '@graphql-codegen/core'; import { AggregateError } from '@graphql-tools/utils'; -import { Renderer, ErrorRenderer } from './utils/listr-renderer.js'; import { GraphQLError, GraphQLSchema, DocumentNode } from 'graphql'; import { getPluginByName } from './plugins.js'; import { getPresetByName } from './presets.js'; @@ -22,8 +21,7 @@ import fs from 'fs'; import path from 'path'; import { cpus } from 'os'; import { createRequire } from 'module'; -import Listr from 'listr'; -import { isListrError } from './utils/cli-error.js'; +import { Listr, ListrTask } from 'listr2'; /** * Poor mans ESM detection. @@ -53,6 +51,8 @@ const makeDefaultLoader = (from: string) => { }; }; +type Ctx = { errors: DetailedError[] | Error[] }; + function createCache(): (namespace: string, key: string, factory: () => Promise) => Promise { const cache = new Map>(); @@ -77,32 +77,6 @@ export async function executeCodegen(input: CodegenContext | Types.Config): Prom const config = context.getConfig(); const pluginContext = context.getPluginContext(); const result: Types.FileOutput[] = []; - const commonListrOptions = { - exitOnError: true, - }; - let listr: Listr; - - if (process.env.VERBOSE) { - listr = new Listr({ - ...commonListrOptions, - renderer: 'verbose', - nonTTYRenderer: 'verbose', - }); - } else if (process.env.NODE_ENV === 'test') { - listr = new Listr({ - ...commonListrOptions, - renderer: 'silent', - nonTTYRenderer: 'silent', - }); - } else { - listr = new Listr({ - ...commonListrOptions, - renderer: config.silent ? 'silent' : config.errorsOnly ? ErrorRenderer : Renderer, - nonTTYRenderer: config.silent ? 'silent' : 'default', - collapse: true, - clearOutput: false, - } as any); - } let rootConfig: { [key: string]: any } = {}; let rootSchemas: Types.Schema[]; @@ -111,7 +85,7 @@ export async function executeCodegen(input: CodegenContext | Types.Config): Prom const cache = createCache(); - function wrapTask(task: () => void | Promise, source: string, taskName: string) { + function wrapTask(task: () => void | Promise, source: string, taskName: string, ctx: Ctx) { return () => { return context.profiler.run(async () => { try { @@ -120,6 +94,7 @@ export async function executeCodegen(input: CodegenContext | Types.Config): Prom if (source && !(error instanceof GraphQLError)) { error.source = source; } + ctx.errors.push(error); throw error; } @@ -212,214 +187,228 @@ export async function executeCodegen(input: CodegenContext | Types.Config): Prom } } - listr.add({ - title: 'Parse configuration', - task: () => normalize(), - }); - - listr.add({ - title: 'Generate outputs', - task: () => { - return new Listr( - Object.keys(generates).map(filename => { - const outputConfig = generates[filename]; - const hasPreset = !!outputConfig.preset; - - return { - title: hasPreset + const isTest = process.env.NODE_ENV === 'test'; + + const tasks = new Listr( + [ + { + title: 'Parse Configuration', + task: () => normalize(), + }, + { + title: 'Generate outputs', + task: (ctx, task) => { + const generateTasks: ListrTask[] = Object.keys(generates).map(filename => { + const outputConfig = generates[filename]; + const hasPreset = !!outputConfig.preset; + + const title = hasPreset ? `Generate to ${filename} (using EXPERIMENTAL preset "${outputConfig.preset}")` - : `Generate ${filename}`, - task: () => { - let outputSchemaAst: GraphQLSchema; - let outputSchema: DocumentNode; - const outputFileTemplateConfig = outputConfig.config || {}; - let outputDocuments: Types.DocumentFile[] = []; - const outputSpecificSchemas = normalizeInstanceOrArray(outputConfig.schema); - const outputSpecificDocuments = normalizeInstanceOrArray(outputConfig.documents); - - return new Listr( - [ - { - title: 'Load GraphQL schemas', - task: wrapTask( - async () => { - debugLog(`[CLI] Loading Schemas`); - - const schemaPointerMap: any = {}; - const allSchemaUnnormalizedPointers = [...rootSchemas, ...outputSpecificSchemas]; - for (const unnormalizedPtr of allSchemaUnnormalizedPointers) { - if (typeof unnormalizedPtr === 'string') { - schemaPointerMap[unnormalizedPtr] = {}; - } else if (typeof unnormalizedPtr === 'object') { - Object.assign(schemaPointerMap, unnormalizedPtr); + : `Generate ${filename}`; + + return { + title, + task: (_, subTask) => { + let outputSchemaAst: GraphQLSchema; + let outputSchema: DocumentNode; + const outputFileTemplateConfig = outputConfig.config || {}; + let outputDocuments: Types.DocumentFile[] = []; + const outputSpecificSchemas = normalizeInstanceOrArray(outputConfig.schema); + const outputSpecificDocuments = normalizeInstanceOrArray( + outputConfig.documents + ); + + return subTask.newListr( + [ + { + title: 'Load GraphQL schemas', + task: wrapTask( + async () => { + debugLog(`[CLI] Loading Schemas`); + const schemaPointerMap: any = {}; + const allSchemaDenormalizedPointers = [...rootSchemas, ...outputSpecificSchemas]; + + for (const denormalizedPtr of allSchemaDenormalizedPointers) { + if (typeof denormalizedPtr === 'string') { + schemaPointerMap[denormalizedPtr] = {}; + } else if (typeof denormalizedPtr === 'object') { + Object.assign(schemaPointerMap, denormalizedPtr); + } } - } - - const hash = JSON.stringify(schemaPointerMap); - const result = await cache('schema', hash, async () => { - const outputSchemaAst = await context.loadSchema(schemaPointerMap); - const outputSchema = getCachedDocumentNodeFromSchema(outputSchemaAst); - return { - outputSchemaAst, - outputSchema, - }; - }); - - outputSchemaAst = await result.outputSchemaAst; - outputSchema = result.outputSchema; - }, - filename, - `Load GraphQL schemas: ${filename}` - ), - }, - { - title: 'Load GraphQL documents', - task: wrapTask( - async () => { - debugLog(`[CLI] Loading Documents`); - - // get different cache for shared docs and output specific docs - const documentPointerMap: any = {}; - const allDocumentsUnnormalizedPointers = [...rootDocuments, ...outputSpecificDocuments]; - for (const unnormalizedPtr of allDocumentsUnnormalizedPointers) { - if (typeof unnormalizedPtr === 'string') { - documentPointerMap[unnormalizedPtr] = {}; - } else if (typeof unnormalizedPtr === 'object') { - Object.assign(documentPointerMap, unnormalizedPtr); + + const hash = JSON.stringify(schemaPointerMap); + const result = await cache('schema', hash, async () => { + const outputSchemaAst = await context.loadSchema(schemaPointerMap); + const outputSchema = getCachedDocumentNodeFromSchema(outputSchemaAst); + return { + outputSchemaAst, + outputSchema, + }; + }); + + outputSchemaAst = result.outputSchemaAst; + outputSchema = result.outputSchema; + }, + filename, + `Load GraphQL schemas: ${filename}`, + ctx + ), + }, + { + title: 'Load GraphQL documents', + task: wrapTask( + async () => { + debugLog(`[CLI] Loading Documents`); + const documentPointerMap: any = {}; + const allDocumentsDenormalizedPointers = [...rootDocuments, ...outputSpecificDocuments]; + for (const denormalizedPtr of allDocumentsDenormalizedPointers) { + if (typeof denormalizedPtr === 'string') { + documentPointerMap[denormalizedPtr] = {}; + } else if (typeof denormalizedPtr === 'object') { + Object.assign(documentPointerMap, denormalizedPtr); + } } - } - const hash = JSON.stringify(documentPointerMap); - const result = await cache('documents', hash, async () => { - const documents = await context.loadDocuments(documentPointerMap); - return { - documents, + const hash = JSON.stringify(documentPointerMap); + const result = await cache('documents', hash, async () => { + const documents = await context.loadDocuments(documentPointerMap); + return { + documents, + }; + }); + + outputDocuments = result.documents; + }, + filename, + `Load GraphQL documents: ${filename}`, + ctx + ), + }, + { + title: 'Generate', + task: wrapTask( + async () => { + debugLog(`[CLI] Generating output`); + const normalizedPluginsArray = normalizeConfig(outputConfig.plugins); + + const pluginLoader = config.pluginLoader || makeDefaultLoader(context.cwd); + const pluginPackages = await Promise.all( + normalizedPluginsArray.map(plugin => getPluginByName(Object.keys(plugin)[0], pluginLoader)) + ); + + const preset: Types.OutputPreset = hasPreset + ? typeof outputConfig.preset === 'string' + ? await getPresetByName(outputConfig.preset, makeDefaultLoader(context.cwd)) + : outputConfig.preset + : null; + + const pluginMap: { [name: string]: CodegenPlugin } = Object.fromEntries( + pluginPackages.map((pkg, i) => { + const plugin = normalizedPluginsArray[i]; + const name = Object.keys(plugin)[0]; + return [name, pkg]; + }) + ); + + const mergedConfig = { + ...rootConfig, + ...(typeof outputFileTemplateConfig === 'string' + ? { value: outputFileTemplateConfig } + : outputFileTemplateConfig), + }; + + const outputs: Types.GenerateOptions[] = hasPreset + ? await context.profiler.run( + async () => + preset.buildGeneratesSection({ + baseOutputDir: filename, + presetConfig: outputConfig.presetConfig || {}, + plugins: normalizedPluginsArray, + schema: outputSchema, + schemaAst: outputSchemaAst, + documents: outputDocuments, + config: mergedConfig, + pluginMap, + pluginContext, + profiler: context.profiler, + }), + `Build Generates Section: ${filename}` + ) + : [ + { + filename, + plugins: normalizedPluginsArray, + schema: outputSchema, + schemaAst: outputSchemaAst, + documents: outputDocuments, + config: mergedConfig, + pluginMap, + pluginContext, + profiler: context.profiler, + }, + ]; + + const process = async (outputArgs: Types.GenerateOptions) => { + const output = await codegen({ + ...outputArgs, + cache, + }); + result.push({ + filename: outputArgs.filename, + content: output, + hooks: outputConfig.hooks || {}, + }); }; - }); - - outputDocuments = await result.documents; - }, - filename, - `Load GraphQL documents: ${filename}` - ), - }, + + await context.profiler.run(() => Promise.all(outputs.map(process)), `Codegen: ${filename}`); + }, + filename, + `Generate: ${filename}`, + ctx + ), + }, + ], { - title: 'Generate', - task: wrapTask( - async () => { - debugLog(`[CLI] Generating output`); - - const normalizedPluginsArray = normalizeConfig(outputConfig.plugins); - const pluginLoader = config.pluginLoader || makeDefaultLoader(context.cwd); - const pluginPackages = await Promise.all( - normalizedPluginsArray.map(plugin => getPluginByName(Object.keys(plugin)[0], pluginLoader)) - ); - const pluginMap: { [name: string]: CodegenPlugin } = {}; - const preset: Types.OutputPreset = hasPreset - ? typeof outputConfig.preset === 'string' - ? await getPresetByName(outputConfig.preset, makeDefaultLoader(context.cwd)) - : outputConfig.preset - : null; - - pluginPackages.forEach((pluginPackage, i) => { - const plugin = normalizedPluginsArray[i]; - const name = Object.keys(plugin)[0]; - - pluginMap[name] = pluginPackage; - }); - - const mergedConfig = { - ...rootConfig, - ...(typeof outputFileTemplateConfig === 'string' - ? { value: outputFileTemplateConfig } - : outputFileTemplateConfig), - }; - - let outputs: Types.GenerateOptions[] = []; - if (hasPreset) { - outputs = await context.profiler.run( - async () => - preset.buildGeneratesSection({ - baseOutputDir: filename, - presetConfig: outputConfig.presetConfig || {}, - plugins: normalizedPluginsArray, - schema: outputSchema, - schemaAst: outputSchemaAst, - documents: outputDocuments, - config: mergedConfig, - pluginMap, - pluginContext, - profiler: context.profiler, - }), - `Build Generates Section: ${filename}` - ); - } else { - outputs = [ - { - filename, - plugins: normalizedPluginsArray, - schema: outputSchema, - schemaAst: outputSchemaAst, - documents: outputDocuments, - config: mergedConfig, - pluginMap, - pluginContext, - profiler: context.profiler, - }, - ]; - } - - const process = async (outputArgs: Types.GenerateOptions) => { - const output = await codegen({ - ...outputArgs, - cache, - }); - result.push({ - filename: outputArgs.filename, - content: output, - hooks: outputConfig.hooks || {}, - }); - }; - - await context.profiler.run(() => Promise.all(outputs.map(process)), `Codegen: ${filename}`); - }, - filename, - `Generate: ${filename}` - ), - }, - ], - { - // it stops when one of tasks failed - exitOnError: true, - } - ); - }, - }; - }), - { - // it doesn't stop when one of tasks failed, to finish at least some of outputs - exitOnError: false, - concurrent: cpus().length, - } - ); - }, - }); - - try { - await listr.run(); - } catch (err) { - if (isListrError(err)) { - const allErrs = err.errors.map(subErr => - isDetailedError(subErr) - ? `${subErr.message} for "${subErr.source}"${subErr.details}` - : subErr.message || subErr.toString() - ); - const newErr = new AggregateError(err.errors, `${err.message} ${allErrs.join('\n\n')}`); - // Best-effort to all stack traces for debugging - newErr.stack = `${newErr.stack}\n\n${err.errors.map(subErr => subErr.stack).join('\n\n')}`; - throw newErr; + // it stops when of the tasks failed + exitOnError: true, + } + ); + }, + // It doesn't stop when one of tasks failed, to finish at least some of outputs + exitOnError: false, + concurrent: cpus().length, + }; + }); + + return task.newListr(generateTasks); + }, + }, + ], + { + rendererOptions: { + clearOutput: false, + collapse: true, + }, + ctx: { errors: [] }, + rendererSilent: isTest || config.silent, + exitOnError: true, } - throw err; + ); + + // All the errors throw in `listr2` are collected in context + // Running tasks doesn't throw anything + const executedContext = await tasks.run(); + + if (executedContext.errors.length > 0) { + const errors = executedContext.errors.map(subErr => + isDetailedError(subErr) + ? `${subErr.message} for "${subErr.source}"${subErr.details}` + : subErr.message || subErr.toString() + ); + const newErr = new AggregateError(executedContext.errors, `${errors.join('\n\n')}`); + // Best-effort to all stack traces for debugging + newErr.stack = `${newErr.stack}\n\n${executedContext.errors.map(subErr => subErr.stack).join('\n\n')}`; + throw newErr; } return result; diff --git a/packages/graphql-codegen-cli/src/utils/indentString.ts b/packages/graphql-codegen-cli/src/utils/indentString.ts deleted file mode 100644 index 9c1803bcbc8..00000000000 --- a/packages/graphql-codegen-cli/src/utils/indentString.ts +++ /dev/null @@ -1,55 +0,0 @@ -// https://github.com/sindresorhus/indent-string/blob/main/index.js -export interface IndentStringOptions { - /** - The string to use for the indent. - @default ' ' - */ - readonly indent?: string; - - /** - Also indent empty lines. - @default false - */ - readonly includeEmptyLines?: boolean; -} - -/** -Indent each line in a string. -@param string - The string to indent. -@param count - How many times you want `options.indent` repeated. Default: `1`. -@example -``` -import indentString from 'indent-string'; -indentString('Unicorns\nRainbows', 4); -//=> ' Unicorns\n Rainbows' -indentString('Unicorns\nRainbows', 4, {indent: '♥'}); -//=> '♥♥♥♥Unicorns\n♥♥♥♥Rainbows' -``` -*/ -export function indentString(string: string, count = 1, options: IndentStringOptions = {}) { - const { indent = ' ', includeEmptyLines = false } = options; - - if (typeof string !== 'string') { - throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof string}\``); - } - - if (typeof count !== 'number') { - throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof count}\``); - } - - if (count < 0) { - throw new RangeError(`Expected \`count\` to be at least 0, got \`${count}\``); - } - - if (typeof indent !== 'string') { - throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof indent}\``); - } - - if (count === 0) { - return string; - } - - const regex = includeEmptyLines ? /^/gm : /^(?!\s*$)/gm; - - return string.replace(regex, indent.repeat(count)); -} diff --git a/packages/graphql-codegen-cli/src/utils/listr-renderer.ts b/packages/graphql-codegen-cli/src/utils/listr-renderer.ts deleted file mode 100644 index 0f42d6ab633..00000000000 --- a/packages/graphql-codegen-cli/src/utils/listr-renderer.ts +++ /dev/null @@ -1,173 +0,0 @@ -import chalk from 'chalk'; -import { indentString } from './indentString.js'; -import logSymbol from 'log-symbols'; -import ansiEscapes from 'ansi-escapes'; -import wrapAnsi from 'wrap-ansi'; -import { stripIndent } from 'common-tags'; -import { ListrTask } from 'listr'; -import { DetailedError, isDetailedError } from '@graphql-codegen/plugin-helpers'; -import { Source } from 'graphql'; -import { debugLog, printLogs } from './debugging.js'; -import UpdateRenderer from 'listr-update-renderer'; - -export class Renderer { - private updateRenderer: any; - - constructor(tasks: ListrTask, options: any) { - this.updateRenderer = new UpdateRenderer(tasks, options); - } - - render() { - return this.updateRenderer.render(); - } - - end( - err: Error & { - errors?: (Error | DetailedError)[]; - details?: string; - } - ) { - this.updateRenderer.end(err); - - if (typeof err === 'undefined') { - logUpdate.clear(); - return; - } - - // persist the output - logUpdate.done(); - - // show errors - if (err) { - const errorCount = err.errors ? err.errors.length : 0; - - if (errorCount > 0) { - const count = indentString(chalk.red.bold(`Found ${errorCount} error${errorCount > 1 ? 's' : ''}`), 1); - const details = err.errors - .map(error => { - debugLog(`[CLI] Exited with an error`, error); - - return { msg: isDetailedError(error) ? error.details : null, rawError: error }; - }) - .map(({ msg, rawError }, i) => { - const source: string | Source | undefined = (err.errors[i] as any).source; - - msg = msg ? chalk.gray(indentString(stripIndent(`${msg}`), 4)) : null; - const stack = rawError.stack ? chalk.gray(indentString(stripIndent(rawError.stack), 4)) : null; - - if (source) { - const sourceOfError = typeof source === 'string' ? source : source.name; - const title = indentString(`${logSymbol.error} ${sourceOfError}`, 2); - - return [title, msg, stack, stack].filter(Boolean).join('\n'); - } - - return [msg, stack].filter(Boolean).join('\n'); - }) - .join('\n\n'); - logUpdate.emit(['', count, details, ''].join('\n\n')); - } else { - const details = err.details ? err.details : ''; - logUpdate.emit(`${chalk.red.bold(`${indentString(err.message, 2)}`)}\n${details}\n${chalk.grey(err.stack)}`); - } - } - - logUpdate.done(); - - printLogs(); - } -} - -const render = tasks => { - for (const task of tasks) { - task.subscribe( - event => { - if (event.type === 'SUBTASKS') { - render(task.subtasks); - return; - } - - if (event.type === 'DATA') { - logUpdate.emit(chalk.dim(`${event.data}`)); - } - logUpdate.done(); - }, - err => { - logUpdate.emit(err); - logUpdate.done(); - } - ); - } -}; - -export class ErrorRenderer { - private tasks: any; - - constructor(tasks, _options) { - this.tasks = tasks; - } - - render() { - render(this.tasks); - } - - static get nonTTY() { - return true; - } - - end() {} -} - -class LogUpdate { - private stream = process.stdout; - // state - private previousLineCount = 0; - private previousOutput = ''; - private previousWidth = this.getWidth(); - - emit(...args: string[]) { - let output = args.join(' ') + '\n'; - const width = this.getWidth(); - - if (output === this.previousOutput && this.previousWidth === width) { - return; - } - - this.previousOutput = output; - this.previousWidth = width; - - output = wrapAnsi(output, width, { - trim: false, - hard: true, - wordWrap: false, - }); - - this.stream.write(ansiEscapes.eraseLines(this.previousLineCount) + output); - this.previousLineCount = output.split('\n').length; - } - - clear() { - this.stream.write(ansiEscapes.eraseLines(this.previousLineCount)); - this.previousOutput = ''; - this.previousWidth = this.getWidth(); - this.previousLineCount = 0; - } - - done() { - this.previousOutput = ''; - this.previousWidth = this.getWidth(); - this.previousLineCount = 0; - } - - private getWidth() { - const { columns } = this.stream; - - if (!columns) { - return 80; - } - - return columns; - } -} - -const logUpdate = new LogUpdate(); diff --git a/yarn.lock b/yarn.lock index 204330476ea..768e3c8f53d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3469,13 +3469,6 @@ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz#0c8b74c50f29ee44f423f7416829c0bf8bb5eb27" integrity sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA== -"@samverschueren/stream-to-observable@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz#a21117b19ee9be70c379ec1877537ef2e1c63301" - integrity sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ== - dependencies: - any-observable "^0.3.0" - "@sideway/address@^4.1.3": version "4.1.4" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" @@ -3848,14 +3841,6 @@ dependencies: "@types/node" "*" -"@types/listr@0.14.4": - version "0.14.4" - resolved "https://registry.yarnpkg.com/@types/listr/-/listr-0.14.4.tgz#6ba2a4206615cf80d79d10f9ba9701c303cd57b6" - integrity sha512-+MWvidNujBUgJsi4yMVwEQQwaHe6oHedPSy+dwk3akGEeuIbvhWkK+TGsXSwbFup7Y0cCBb+wzzdD+yGKp7sOg== - dependencies: - "@types/node" "*" - rxjs "^6.5.1" - "@types/lodash.mergewith@4.6.6": version "4.6.6" resolved "https://registry.yarnpkg.com/@types/lodash.mergewith/-/lodash.mergewith-4.6.6.tgz#c4698f5b214a433ff35cb2c75ee6ec7f99d79f10" @@ -4457,11 +4442,6 @@ ansi-colors@^4.1.1, ansi-colors@^4.1.3: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-escapes@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -4469,16 +4449,6 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.1: dependencies: type-fest "^0.21.3" -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -4489,11 +4459,6 @@ ansi-regex@^6.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== - ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -4523,11 +4488,6 @@ antlr4ts@^0.5.0-alpha.3: resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== -any-observable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" - integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== - any-promise@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" @@ -5485,18 +5445,7 @@ chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^1.0.0, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -5505,7 +5454,7 @@ chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -change-case-all@1.0.14: +change-case-all@1.0.14, change-case-all@^1.0.14: version "1.0.14" resolved "https://registry.yarnpkg.com/change-case-all/-/change-case-all-1.0.14.tgz#bac04da08ad143278d0ac3dda7eccd39280bfba1" integrity sha512-CWVm2uT7dmSHdO/z1CXT/n47mWonyypzBbuCy5tN7uMg22BsfkhwT6oHmFCAk+gL1LOOxhdbB9SZz3J1KTY3gA== @@ -5639,13 +5588,6 @@ clean-stack@^3.0.0: dependencies: escape-string-regexp "4.0.0" -cli-cursor@^2.0.0, cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== - dependencies: - restore-cursor "^2.0.0" - cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -5658,14 +5600,6 @@ cli-spinners@^2.5.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== -cli-truncate@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" - integrity sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg== - dependencies: - slice-ansi "0.0.4" - string-width "^1.0.1" - cli-truncate@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" @@ -5724,11 +5658,6 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== - collect-v8-coverage@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" @@ -6489,11 +6418,6 @@ date-fns@2.28.0, date-fns@^2.16.1: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== -date-fns@^1.27.2: - version "1.30.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" - integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== - debounce@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" @@ -6799,11 +6723,6 @@ electron-to-chromium@^1.4.172: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.177.tgz#b6a4436eb788ca732556cd69f384b8a3c82118c5" integrity sha512-FYPir3NSBEGexSZUEeht81oVhHfLFl6mhUKSkjHN/iB/TwEIt/WHQrqVGfTLN5gQxwJCQkIJBe05eOXjI7omgg== -elegant-spinner@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" - integrity sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ== - elliptic@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -7064,7 +6983,7 @@ escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== @@ -7676,21 +7595,6 @@ fbjs@^3.0.0: setimmediate "^1.0.5" ua-parser-js "^0.7.30" -figures@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - integrity sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ== - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== - dependencies: - escape-string-regexp "^1.0.5" - figures@^3.0.0, figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -8294,13 +8198,6 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== - dependencies: - ansi-regex "^2.0.0" - has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" @@ -8695,11 +8592,6 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -indent-string@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ== - indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -8978,18 +8870,6 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -9080,13 +8960,6 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-observable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" - integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== - dependencies: - symbol-observable "^1.1.0" - is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -9114,11 +8987,6 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-promise@^2.1.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" - integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== - is-property@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" @@ -9153,11 +9021,6 @@ is-shared-array-buffer@^1.0.2: dependencies: call-bind "^1.0.2" -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -10102,35 +9965,6 @@ lint-staged@13.0.3: string-argv "^0.3.1" yaml "^2.1.1" -listr-silent-renderer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" - integrity sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA== - -listr-update-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" - integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== - dependencies: - chalk "^1.1.3" - cli-truncate "^0.2.1" - elegant-spinner "^1.0.1" - figures "^1.7.0" - indent-string "^3.0.0" - log-symbols "^1.0.2" - log-update "^2.3.0" - strip-ansi "^3.0.1" - -listr-verbose-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" - integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== - dependencies: - chalk "^2.4.1" - cli-cursor "^2.1.0" - date-fns "^1.27.2" - figures "^2.0.0" - listr2@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5" @@ -10145,21 +9979,6 @@ listr2@^4.0.5: through "^2.3.8" wrap-ansi "^7.0.0" -listr@^0.14.3: - version "0.14.3" - resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" - integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== - dependencies: - "@samverschueren/stream-to-observable" "^0.3.0" - is-observable "^1.1.0" - is-promise "^2.1.0" - is-stream "^1.1.0" - listr-silent-renderer "^1.1.1" - listr-update-renderer "^0.5.0" - listr-verbose-renderer "^0.5.0" - p-map "^2.0.0" - rxjs "^6.3.3" - load-script@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/load-script/-/load-script-1.0.0.tgz#0491939e0bee5643ee494a7e3da3d2bac70c6ca4" @@ -10300,13 +10119,6 @@ lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - integrity sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ== - dependencies: - chalk "^1.0.0" - log-symbols@^4.0.0, log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" @@ -10315,15 +10127,6 @@ log-symbols@^4.0.0, log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -log-update@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" - integrity sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg== - dependencies: - ansi-escapes "^3.0.0" - cli-cursor "^2.0.0" - wrap-ansi "^3.0.1" - log-update@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" @@ -11157,11 +10960,6 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -11553,11 +11351,6 @@ nullthrows@^1.0.0, nullthrows@^1.1.1: resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== - nwsapi@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.1.tgz#10a9f268fbf4c461249ebcfe38e359aa36e2577c" @@ -11678,13 +11471,6 @@ once@^1.3.0: dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== - dependencies: - mimic-fn "^1.0.0" - onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -12983,14 +12769,6 @@ resolve@^2.0.0-next.3: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -13101,7 +12879,7 @@ rw@1: resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== -rxjs@^6.3.3, rxjs@^6.5.1, rxjs@^6.6.7: +rxjs@^6.6.7: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -13383,11 +13161,6 @@ slash@^4.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - integrity sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw== - slice-ansi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" @@ -13721,23 +13494,6 @@ string-similarity@^4.0.1, string-similarity@^4.0.3: resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-4.0.4.tgz#42d01ab0b34660ea8a018da8f56a3309bb8b2a5b" integrity sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ== -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -13803,20 +13559,6 @@ stringify-entities@^4.0.0: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== - dependencies: - ansi-regex "^3.0.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -13905,11 +13647,6 @@ sucrase@^3.18.1, sucrase@^3.20.3: pirates "^4.0.1" ts-interface-checker "^0.1.9" -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -13956,7 +13693,7 @@ swap-case@^2.0.2: dependencies: tslib "^2.0.3" -symbol-observable@^1.0.2, symbol-observable@^1.1.0: +symbol-observable@^1.0.2: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== @@ -15213,14 +14950,6 @@ word-wrap@^1.2.3, word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wrap-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" - integrity sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"