diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 41f6fe4072..53fcff282f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -41,11 +41,11 @@ jobs: with: distribution: 'zulu' java-version: '8' - - name: Set up Node 14 + - name: Set up Node 16 uses: actions/setup-node@v3 with: cache: yarn - node-version: '14' + node-version: '16' - name: Set up Python 3.7 uses: actions/setup-python@v4 with: @@ -124,11 +124,11 @@ jobs: with: distribution: 'zulu' java-version: '8' - - name: Set up Node 14 + - name: Set up Node 16 uses: actions/setup-node@v3 with: cache: yarn - node-version: '14' + node-version: '16' - name: Set up Python 3.7 uses: actions/setup-python@v4 with: @@ -194,7 +194,7 @@ jobs: dotnet: ['6.0.x'] go: ['1.18'] java: ['8'] - node: ['14'] # EOL 2023-04-30 + node: ['16'] os: [ubuntu-latest] python: ['3.7'] # Add specific combinations to be tested against "node 14" (to restrict cardinality) @@ -205,7 +205,7 @@ jobs: dotnet: '6.0.x' go: '1.18' java: '8' - node: '14' + node: '16' python: '3.7' # Test using macOS - title: 'macOS' @@ -213,16 +213,9 @@ jobs: dotnet: '6.0.x' go: '1.18' java: '8' - node: '14' + node: '16' python: '3.7' # Test alternate Nodes - - title: 'Node 16' - java: '8' - dotnet: '6.0.x' - go: '1.18' - node: '16' # EOL 2023-09-11 - os: ubuntu-latest - python: '3.7' - title: 'Node 18' java: '8' dotnet: '6.0.x' @@ -230,11 +223,11 @@ jobs: node: '18' # EOL 2025-04-30 os: ubuntu-latest python: '3.7' - - title: 'Node 19' + - title: 'Node 20' java: '8' dotnet: '6.0.x' go: '1.18' - node: '19' # EOL 2023-06-01 + node: '20' # EOL 2023-09-11 os: ubuntu-latest python: '3.7' # Test alternate .NETs @@ -242,7 +235,7 @@ jobs: java: '8' dotnet: '7.0.x' go: '1.18' - node: '14' + node: '16' os: ubuntu-latest python: '3.7' # Test alternate Gos @@ -250,7 +243,7 @@ jobs: java: '8' dotnet: '6.0.x' go: '1.19' - node: '14' + node: '16' os: ubuntu-latest python: '3.7' # Test alternate Javas @@ -258,7 +251,7 @@ jobs: java: '11' dotnet: '6.0.x' go: '1.18' - node: '14' + node: '16' os: ubuntu-latest python: '3.7' # Test alternate Pythons @@ -267,28 +260,28 @@ jobs: dotnet: '6.0.x' go: '1.18' java: '8' - node: '14' + node: '16' os: ubuntu-latest - title: 'Python 3.9' python: '3.9' dotnet: '6.0.x' go: '1.18' java: '8' - node: '14' + node: '16' os: ubuntu-latest - title: 'Python 3.10' python: '3.10' dotnet: '6.0.x' go: '1.18' java: '8' - node: '14' + node: '16' os: ubuntu-latest - title: 'Python 3.11' python: '3.11' dotnet: '6.0.x' go: '1.18' java: '8' - node: '14' + node: '16' os: ubuntu-latest runs-on: ${{ matrix.os }} @@ -440,10 +433,10 @@ jobs: with: distribution: 'zulu' java-version: '8' - - name: Set up Node 14 + - name: Set up Node 16 uses: actions/setup-node@v3 with: - node-version: '14' + node-version: '16' - name: Set up Python 3.7 uses: actions/setup-python@v4 with: diff --git a/packages/jsii-pacmak/lib/builder.ts b/packages/jsii-pacmak/lib/builder.ts index 3544bf3573..f217b9b61b 100644 --- a/packages/jsii-pacmak/lib/builder.ts +++ b/packages/jsii-pacmak/lib/builder.ts @@ -1,4 +1,5 @@ import { Rosetta } from 'jsii-rosetta'; +import { ListrDefaultRenderer, ListrTaskWrapper } from 'listr2'; import * as path from 'path'; import * as logging from './logging'; @@ -51,6 +52,12 @@ export interface BuildOptions { * type checking is not possible. */ readonly runtimeTypeChecking: boolean; + + /** + * A function to report progress to the user (e.g: via the command line + * interface). + */ + readonly reportProgress: (message: string) => void; } /** @@ -59,7 +66,9 @@ export interface BuildOptions { * Building can happen one target at a time, or multiple targets at a time. */ export interface TargetBuilder { - buildModules(): Promise; + buildModules( + task: ListrTaskWrapper, + ): Promise; } /** @@ -80,7 +89,26 @@ export class IndependentPackageBuilder implements TargetBuilder { private readonly options: BuildOptions, ) {} - public async buildModules(): Promise { + public async buildModules( + task: ListrTaskWrapper, + ): Promise { + await task + .newListr( + this.modules.flatMap((modules) => + modules.map((module) => ({ + title: module.name, + task: async (options, _task) => { + if (options.codeOnly) { + return this.generateModuleCode(module, options); + } + return this.buildModule(module, options); + }, + })), + ), + { ctx: this.options }, + ) + .run(); + if (this.options.codeOnly) { await Promise.all( flatten(this.modules).map((module) => @@ -100,7 +128,9 @@ export class IndependentPackageBuilder implements TargetBuilder { private async generateModuleCode(module: JsiiModule, options: BuildOptions) { const outputDir = this.finalOutputDir(module, options); - logging.debug(`Generating ${this.targetName} code into ${outputDir}`); + options.reportProgress( + `Generating ${this.targetName} code into ${outputDir}`, + ); await this.makeTarget(module, options).generateCode( outputDir, module.tarball, @@ -112,12 +142,14 @@ export class IndependentPackageBuilder implements TargetBuilder { const outputDir = this.finalOutputDir(module, options); const src = await Scratch.make((tmpdir) => { - logging.debug(`Generating ${this.targetName} code into ${tmpdir}`); + options.reportProgress( + `Generating ${this.targetName} code into ${tmpdir}`, + ); return target.generateCode(tmpdir, module.tarball); }); try { - logging.debug(`Building ${src.directory} into ${outputDir}`); + options.reportProgress(`Building ${src.directory} into ${outputDir}`); return await target.build(src.directory, outputDir); } catch (err) { logging.warn(`Failed building ${this.targetName}`); diff --git a/packages/jsii-pacmak/lib/index.ts b/packages/jsii-pacmak/lib/index.ts index 8d1115759b..91772ef4be 100644 --- a/packages/jsii-pacmak/lib/index.ts +++ b/packages/jsii-pacmak/lib/index.ts @@ -2,6 +2,7 @@ import './suppress-jsii-upgrade-prompts'; import { TypeSystem } from 'jsii-reflect'; import { Rosetta, UnknownSnippetMode } from 'jsii-rosetta'; +import { Listr, ListrDefaultRenderer, ListrTaskWrapper } from 'listr2'; import { resolve } from 'path'; import { cwd } from 'process'; @@ -109,42 +110,39 @@ export async function pacmak({ const perLanguageDirectory = targetSets.length > 1 || forceSubdirectory; // We run all target sets in parallel for minimal wall clock time - await Promise.all( - mapParallelOrSerial( - targetSets, - async (targetSet) => { - logging.info( - `Packaging '${targetSet.targetType}' for ${describePackages( - targetSet, - )}`, - ); - return timers - .recordAsync(targetSet.targetType, () => - buildTargetsForLanguage( - targetSet.targetType, - targetSet.modulesSorted, - { - argv, - clean, - codeOnly, - fingerprint, - force, - perLanguageDirectory, - rosetta, - runtimeTypeChecking, - }, - ), - ) - .then( - () => logging.info(`${targetSet.targetType} finished`), - (err) => { - logging.warn(`${targetSet.targetType} failed`); - return Promise.reject(err); + await mapParallelOrSerial( + targetSets, + async (targetSet, task) => { + task.title = `Packaging '${ + targetSet.targetType + }' for ${describePackages(targetSet)}`; + return timers + .recordAsync(targetSet.targetType, () => + buildTargetsForLanguage( + targetSet.targetType, + targetSet.modulesSorted, + { + argv, + clean, + codeOnly, + fingerprint, + force, + perLanguageDirectory, + rosetta, + runtimeTypeChecking, }, - ); - }, - { parallel }, - ), + task, + ), + ) + .then( + () => logging.info(`${targetSet.targetType} finished`), + (err) => { + logging.warn(`${targetSet.targetType} failed`); + return Promise.reject(err); + }, + ); + }, + { parallel, title: (item) => `Packaging ${item.targetType}` }, ); } finally { if (clean) { @@ -319,6 +317,7 @@ async function buildTargetsForLanguage( rosetta: Rosetta; runtimeTypeChecking: boolean; }, + task: ListrTaskWrapper, ): Promise { // ``argv.target`` is guaranteed valid by ``yargs`` through the ``choices`` directive. const factory = ALL_BUILDERS[targetLanguage as TargetName]; @@ -326,16 +325,25 @@ async function buildTargetsForLanguage( throw new Error(`Unsupported target: '${targetLanguage}'`); } - return factory(modules, { - arguments: argv, - clean: clean, - codeOnly: codeOnly, - fingerprint: fingerprint, - force: force, - languageSubdirectory: perLanguageDirectory, - rosetta, - runtimeTypeChecking, - }).buildModules(); + const startedAt = Date.now(); + try { + return await factory(modules, { + arguments: argv, + clean: clean, + codeOnly: codeOnly, + fingerprint: fingerprint, + force: force, + languageSubdirectory: perLanguageDirectory, + rosetta, + runtimeTypeChecking, + reportProgress(message) { + task.output = message; + }, + }).buildModules(task); + } finally { + const duration = Date.now() - startedAt; + task.title += ` (${duration} ms)`; + } } //#endregion @@ -375,25 +383,30 @@ function sliceTargets( //#region Parallelization -function mapParallelOrSerial( +async function mapParallelOrSerial( collection: readonly T[], - mapper: (item: T) => Promise, - { parallel }: { parallel: boolean }, -): Array> { - const result = new Array>(); + mapper: ( + item: T, + task: ListrTaskWrapper, + ) => Promise, + { + parallel, + title, + }: { + readonly parallel: boolean; + readonly title?: (item: T) => string; + }, +): Promise { + const listr = new Listr([], { concurrent: parallel }); + for (const item of collection) { - result.push( - result.length === 0 || parallel - ? // Running parallel, or first element - mapper(item) - : // Wait for the previous promise, then make the next one - result[result.length - 1].then( - () => mapper(item), - (error) => Promise.reject(error), - ), - ); + listr.add({ + title: title && title(item), + task: async (ctx, task) => ctx.push(await mapper(item, task)), + }); } - return result; + + return listr.run([]); } //#endregion diff --git a/packages/jsii-pacmak/lib/targets/dotnet.ts b/packages/jsii-pacmak/lib/targets/dotnet.ts index 70727b8c9b..95dfa2dbe5 100644 --- a/packages/jsii-pacmak/lib/targets/dotnet.ts +++ b/packages/jsii-pacmak/lib/targets/dotnet.ts @@ -52,11 +52,12 @@ export class DotnetBuilder implements TargetBuilder { // Otherwise make a single tempdir to hold all sources, build them together and copy them back out const scratchDirs: Array> = []; try { + this.options.reportProgress(`Generating .NET aggregate source code`); const tempSourceDir = await this.generateAggregateSourceDir(this.modules); scratchDirs.push(tempSourceDir); // Build solution - logging.debug('Building .NET'); + this.options.reportProgress('Building .NET'); await shell( 'dotnet', ['build', '--force', '--configuration', 'Release'], diff --git a/packages/jsii-pacmak/lib/targets/java.ts b/packages/jsii-pacmak/lib/targets/java.ts index 67a7ad36dd..cca4f9d484 100644 --- a/packages/jsii-pacmak/lib/targets/java.ts +++ b/packages/jsii-pacmak/lib/targets/java.ts @@ -12,6 +12,7 @@ import { markDownToJavaDoc, ApiLocation, } from 'jsii-rosetta'; +import { ListrDefaultRenderer, ListrTaskWrapper } from 'listr2'; import * as path from 'path'; import * as xmlbuilder from 'xmlbuilder'; @@ -59,7 +60,9 @@ export class JavaBuilder implements TargetBuilder { private readonly options: BuildOptions, ) {} - public async buildModules(): Promise { + public async buildModules( + _task: ListrTaskWrapper, + ): Promise { if (this.modules.length === 0) { return; } @@ -81,6 +84,7 @@ export class JavaBuilder implements TargetBuilder { // Otherwise make a single tempdir to hold all sources, build them together and copy them back out const scratchDirs: Array> = []; try { + this.options.reportProgress('Generating aggregate source directory...'); const tempSourceDir = await this.generateAggregateSourceDir( this.modules, this.options, @@ -91,11 +95,12 @@ export class JavaBuilder implements TargetBuilder { // will be used. const target = this.makeTarget(this.modules[0], this.options); const tempOutputDir = await Scratch.make(async (dir) => { - logging.debug(`Building Java code to ${dir}`); + this.options.reportProgress(`Building Java code to ${dir}`); await target.build(tempSourceDir.directory, dir); }); scratchDirs.push(tempOutputDir); + this.options.reportProgress('Copying output artifacts...'); await this.copyOutArtifacts( tempOutputDir.directory, tempSourceDir.object, @@ -120,7 +125,7 @@ export class JavaBuilder implements TargetBuilder { where: string, ): Promise { const target = this.makeTarget(module, options); - logging.debug(`Generating Java code into ${where}`); + this.options.reportProgress(`Generating Java code into ${where}`); await target.generateCode(where, module.tarball); } @@ -129,7 +134,9 @@ export class JavaBuilder implements TargetBuilder { options: BuildOptions, ): Promise> { return Scratch.make(async (tmpDir: string) => { - logging.debug(`Generating aggregate Java source dir at ${tmpDir}`); + this.options.reportProgress( + `Generating aggregate Java source dir at ${tmpDir}`, + ); const ret: TemporaryJavaPackage[] = []; const generatedModules = modules @@ -193,7 +200,7 @@ export class JavaBuilder implements TargetBuilder { ) .end({ pretty: true }); - logging.debug(`Generated ${where}/pom.xml`); + this.options.reportProgress(`Generated ${where}/pom.xml`); await fs.writeFile(path.join(where, 'pom.xml'), aggregatePom); } @@ -201,7 +208,7 @@ export class JavaBuilder implements TargetBuilder { artifactsRoot: string, packages: TemporaryJavaPackage[], ) { - logging.debug('Copying out Java artifacts'); + this.options.reportProgress('Copying out Java artifacts'); // The artifacts directory looks like this: // /tmp/XXX/software/amazon/awscdk/something/v1.2.3 // /else/v1.2.3 @@ -323,7 +330,7 @@ export class JavaBuilder implements TargetBuilder { ) .end({ pretty: true }); - logging.debug(`Generated ${filePath}`); + this.options.reportProgress(`Generated ${filePath}`); await fs.writeFile(filePath, settings); return filePath; } diff --git a/packages/jsii-pacmak/package.json b/packages/jsii-pacmak/package.json index 395298d8c6..175a2d9602 100644 --- a/packages/jsii-pacmak/package.json +++ b/packages/jsii-pacmak/package.json @@ -17,7 +17,7 @@ "directory": "packages/jsii-pacmak" }, "engines": { - "node": ">= 14.6.0" + "node": ">= 16.0.0" }, "main": "lib/index.js", "types": "lib/index.d.ts", @@ -46,6 +46,7 @@ "fs-extra": "^10.1.0", "jsii-reflect": "^0.0.0", "jsii-rosetta": "^0.0.0", + "listr2": "^6.6.0", "semver": "^7.5.1", "spdx-license-list": "^6.6.0", "xmlbuilder": "^15.1.1", diff --git a/yarn.lock b/yarn.lock index 208f2ccc96..2dfb28c1e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2281,6 +2281,13 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.21.3" +ansi-escapes@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-5.0.0.tgz#b6a0caf0eef0c41af190e9a749e0c00ec04bb2a6" + integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== + dependencies: + type-fest "^1.0.2" + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -2310,7 +2317,7 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.1.0: +ansi-styles@^6.0.0, ansi-styles@^6.1.0: version "6.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== @@ -2863,6 +2870,13 @@ cli-cursor@3.1.0, cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" + integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== + dependencies: + restore-cursor "^4.0.0" + cli-spinners@2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" @@ -2882,6 +2896,14 @@ cli-table3@^0.6.2: optionalDependencies: "@colors/colors" "1.5.0" +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== + dependencies: + slice-ansi "^5.0.0" + string-width "^5.0.0" + cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" @@ -2984,7 +3006,7 @@ color-support@^1.1.3: resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== -colorette@^2.0.14: +colorette@^2.0.14, colorette@^2.0.20: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== @@ -3911,6 +3933,11 @@ eventemitter3@^4.0.4: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" @@ -4962,6 +4989,11 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" @@ -6262,6 +6294,18 @@ lines-and-columns@~2.0.3: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== +listr2@^6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-6.6.0.tgz#cb8a0f45fb93ae50c43fb34f934759f8de9395ce" + integrity sha512-qkLg7IeYcZGkxo5sZzl676xHwQzNZ8qAQLQSDMA88sLM1SDcabwyXD1mXHi/PGQHyt/mu81adJdkqsCSUSuQzQ== + dependencies: + cli-truncate "^3.1.0" + colorette "^2.0.20" + eventemitter3 "^5.0.1" + log-update "^5.0.1" + rfdc "^1.3.0" + wrap-ansi "^8.1.0" + load-json-file@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" @@ -6347,6 +6391,17 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +log-update@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-5.0.1.tgz#9e928bf70cb183c1f0c9e91d9e6b7115d597ce09" + integrity sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw== + dependencies: + ansi-escapes "^5.0.0" + cli-cursor "^4.0.0" + slice-ansi "^5.0.0" + strip-ansi "^7.0.1" + wrap-ansi "^8.0.1" + log4js@^6.9.1: version "6.9.1" resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.9.1.tgz#aba5a3ff4e7872ae34f8b4c533706753709e38b6" @@ -8095,6 +8150,14 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +restore-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" + integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -8315,6 +8378,14 @@ slash@^4.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" @@ -8525,7 +8596,7 @@ string-length@^4.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.1, string-width@^5.1.2: +string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== @@ -8980,6 +9051,11 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^1.0.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + typed-array-length@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" @@ -9372,7 +9448,7 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^8.1.0: +wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==