diff --git a/packages/schema/package.json b/packages/schema/package.json index f8fb3d6e1..472ce3af4 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -94,6 +94,7 @@ "langium": "^0.5.0", "mixpanel": "^0.17.0", "node-machine-id": "^1.1.12", + "ora": "^6.1.2", "pluralize": "^8.0.0", "prisma": "~4.7.0", "promisify": "^0.0.3", diff --git a/packages/schema/src/generator/field-constraint/index.ts b/packages/schema/src/generator/field-constraint/index.ts index c3271d8d0..35d023722 100644 --- a/packages/schema/src/generator/field-constraint/index.ts +++ b/packages/schema/src/generator/field-constraint/index.ts @@ -1,7 +1,3 @@ -import { Context, Generator } from '../types'; -import { Project, SourceFile } from 'ts-morph'; -import * as path from 'path'; -import colors from 'colors'; import { DataModel, DataModelField, @@ -10,6 +6,9 @@ import { isLiteralExpr, LiteralExpr, } from '@lang/generated/ast'; +import * as path from 'path'; +import { Project, SourceFile } from 'ts-morph'; +import { Context, Generator } from '../types'; /** * Generates field constraint validators (run on both client and server side) @@ -19,7 +18,15 @@ export default class FieldConstraintGenerator implements Generator { return 'field-constraint'; } - async generate(context: Context): Promise { + get startMessage() { + return 'Generating field constraints...'; + } + + get successMessage() { + return 'Successfully generated field constraints'; + } + + async generate(context: Context) { const project = new Project(); const sf = project.createSourceFile( path.join( @@ -41,7 +48,7 @@ export default class FieldConstraintGenerator implements Generator { sf.formatText(); await project.save(); - console.log(colors.blue(` ✔️ Field constraint validators generated`)); + return []; } private generateConstraints(sf: SourceFile, model: DataModel) { diff --git a/packages/schema/src/generator/index.ts b/packages/schema/src/generator/index.ts index 96df4b145..ff01c6ac8 100644 --- a/packages/schema/src/generator/index.ts +++ b/packages/schema/src/generator/index.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-var-requires */ -import { Context } from './types'; +import { Context, Generator } from './types'; import * as fs from 'fs'; import colors from 'colors'; import PrismaGenerator from './prisma'; @@ -8,6 +8,7 @@ import ReactHooksGenerator from './react-hooks'; import { TypescriptCompilation } from './tsc'; import FieldConstraintGenerator from './field-constraint'; import telemetry from '../telemetry'; +import ora from 'ora'; /** * ZenStack code generator @@ -37,11 +38,8 @@ export class ZenStackGenerator { fs.mkdirSync(context.generatedCodeDir); } - const version = require('../../package.json').version; - console.log(colors.bold(`⌛️ Running ZenStack generator v${version}`)); - // TODO: plugin mechanism - const generators = [ + const generators: Generator[] = [ new PrismaGenerator(), new ServiceGenerator(), new ReactHooksGenerator(), @@ -49,6 +47,10 @@ export class ZenStackGenerator { new TypescriptCompilation(), ]; + const version = require('../../package.json').version; + console.log(colors.bold(`⌛️ Running ZenStack generator v${version}`)); + + const warnings: string[] = []; for (const generator of generators) { if ( includeGenerators && @@ -57,6 +59,7 @@ export class ZenStackGenerator { continue; } + const spinner = ora(generator.startMessage).start(); await telemetry.trackSpan( 'cli:generator:start', 'cli:generator:complete', @@ -64,8 +67,12 @@ export class ZenStackGenerator { { generator: generator.name, }, - () => generator.generate(context) + async () => { + const genWarnings = await generator.generate(context); + warnings.push(...genWarnings); + } ); + spinner.succeed(`${colors.cyan(generator.successMessage)}`); } console.log( @@ -73,5 +80,7 @@ export class ZenStackGenerator { colors.bold('👻 All generators completed successfully!') ) ); + + warnings.forEach((w) => console.warn(colors.yellow(w))); } } diff --git a/packages/schema/src/generator/prisma/index.ts b/packages/schema/src/generator/prisma/index.ts index 183c468ef..46ee852db 100644 --- a/packages/schema/src/generator/prisma/index.ts +++ b/packages/schema/src/generator/prisma/index.ts @@ -1,8 +1,7 @@ -import colors from 'colors'; -import { Context, Generator, GeneratorError } from '../types'; import { execSync } from '../../utils/exec-utils'; -import PrismaSchemaGenerator from './schema-generator'; +import { Context, Generator, GeneratorError } from '../types'; import QueryGuardGenerator from './query-guard-generator'; +import PrismaSchemaGenerator from './schema-generator'; /** * Generates Prisma schema and db client @@ -12,7 +11,15 @@ export default class PrismaGenerator implements Generator { return 'prisma'; } - async generate(context: Context): Promise { + get startMessage() { + return 'Generating Prisma client...'; + } + + get successMessage() { + return 'Successfully generated Prisma client'; + } + + async generate(context: Context) { // generate prisma schema const schemaFile = await new PrismaSchemaGenerator(context).generate(); @@ -22,9 +29,7 @@ export default class PrismaGenerator implements Generator { // generate prisma query guard await new QueryGuardGenerator(context).generate(); - console.log( - colors.blue(` ✔️ Prisma schema and query guard generated`) - ); + return []; } private async generatePrismaClient(schemaFile: string) { diff --git a/packages/schema/src/generator/react-hooks/index.ts b/packages/schema/src/generator/react-hooks/index.ts index 0c8e5e919..7a856bedd 100644 --- a/packages/schema/src/generator/react-hooks/index.ts +++ b/packages/schema/src/generator/react-hooks/index.ts @@ -1,10 +1,9 @@ -import { Context, Generator } from '../types'; -import { Project } from 'ts-morph'; -import * as path from 'path'; -import { paramCase } from 'change-case'; import { DataModel, isDataModel } from '@lang/generated/ast'; -import colors from 'colors'; +import { paramCase } from 'change-case'; +import * as path from 'path'; +import { Project } from 'ts-morph'; import { API_ROUTE_NAME, RUNTIME_PACKAGE } from '../constants'; +import { Context, Generator } from '../types'; /** * Generate react data query hooks code @@ -14,9 +13,18 @@ export default class ReactHooksGenerator implements Generator { return 'react-hooks'; } - async generate(context: Context): Promise { + get startMessage() { + return 'Generating React hooks...'; + } + + get successMessage(): string { + return 'Successfully generated React hooks'; + } + + async generate(context: Context) { const project = new Project(); const models: DataModel[] = []; + const warnings: string[] = []; for (const model of context.schema.declarations.filter( (d): d is DataModel => isDataModel(d) @@ -25,10 +33,8 @@ export default class ReactHooksGenerator implements Generator { (attr) => attr.decl.ref?.name === '@@allow' ); if (!hasAllowRule) { - console.warn( - colors.yellow( - `Not generating hooks for "${model.name}" because it doesn't have any @@allow rule` - ) + warnings.push( + `Not generating hooks for "${model.name}" because it doesn't have any @@allow rule` ); } else { models.push(model); @@ -40,8 +46,7 @@ export default class ReactHooksGenerator implements Generator { models.forEach((d) => this.generateModelHooks(project, context, d)); await project.save(); - - console.log(colors.blue(' ✔️ React hooks generated')); + return warnings; } private getValidator(model: DataModel, mode: 'create' | 'update') { diff --git a/packages/schema/src/generator/service/index.ts b/packages/schema/src/generator/service/index.ts index 3216832dd..efe67fcc0 100644 --- a/packages/schema/src/generator/service/index.ts +++ b/packages/schema/src/generator/service/index.ts @@ -1,6 +1,5 @@ import { DataModel, isDataModel } from '@lang/generated/ast'; import { camelCase } from 'change-case'; -import colors from 'colors'; import * as path from 'path'; import { Project } from 'ts-morph'; import { RUNTIME_PACKAGE } from '../constants'; @@ -14,7 +13,15 @@ export default class ServiceGenerator implements Generator { return 'service'; } - async generate(context: Context): Promise { + get startMessage() { + return 'Generating ZenStack service...'; + } + + get successMessage() { + return 'Successfully generated ZenStack service'; + } + + async generate(context: Context) { const project = new Project(); const sf = project.createSourceFile( path.join(context.generatedCodeDir, 'src/index.ts'), @@ -101,6 +108,6 @@ export default class ServiceGenerator implements Generator { sf.formatText(); await project.save(); - console.log(colors.blue(` ✔️ ZenStack service generated`)); + return []; } } diff --git a/packages/schema/src/generator/tsc/index.ts b/packages/schema/src/generator/tsc/index.ts index 50321f73d..713a5f7f2 100644 --- a/packages/schema/src/generator/tsc/index.ts +++ b/packages/schema/src/generator/tsc/index.ts @@ -1,5 +1,4 @@ /* eslint-disable @typescript-eslint/no-var-requires */ -import colors from 'colors'; import * as fs from 'fs'; import path from 'path'; import { execSync } from '../../utils/exec-utils'; @@ -10,6 +9,14 @@ export class TypescriptCompilation implements Generator { return 'tsc'; } + get startMessage() { + return 'Transpiling generated code...'; + } + + get successMessage() { + return 'Successfully transpiled all generated code'; + } + async generate(context: Context) { // generate package.json const packageJson = require(path.join( @@ -47,6 +54,6 @@ export class TypescriptCompilation implements Generator { ); } - console.log(colors.blue(' ✔️ Typescript source files transpiled')); + return []; } } diff --git a/packages/schema/src/generator/types.ts b/packages/schema/src/generator/types.ts index 49733e443..44f0f074b 100644 --- a/packages/schema/src/generator/types.ts +++ b/packages/schema/src/generator/types.ts @@ -8,7 +8,9 @@ export interface Context { export interface Generator { get name(): string; - generate(context: Context): Promise; + get startMessage(): string; + get successMessage(): string; + generate(context: Context): Promise; } export class GeneratorError extends Error { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 49c2b3b0f..492c056d1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -96,6 +96,7 @@ importers: langium-cli: ^0.5.0 mixpanel: ^0.17.0 node-machine-id: ^1.1.12 + ora: ^6.1.2 pluralize: ^8.0.0 prisma: ~4.7.0 promisify: ^0.0.3 @@ -126,6 +127,7 @@ importers: langium: 0.5.0 mixpanel: 0.17.0 node-machine-id: 1.1.12 + ora: 6.1.2 pluralize: 8.0.0 prisma: 4.7.0 promisify: 0.0.3 @@ -2301,6 +2303,11 @@ packages: engines: {node: '>=8'} dev: true + /ansi-regex/6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: false + /ansi-styles/3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -2565,7 +2572,6 @@ packages: /base64-js/1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true /bcryptjs/2.4.3: resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==} @@ -2591,6 +2597,14 @@ packages: readable-stream: 3.6.0 dev: true + /bl/5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: false + /boolbase/1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: true @@ -2657,6 +2671,13 @@ packages: ieee754: 1.2.1 dev: true + /buffer/6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + /busboy/1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -2730,6 +2751,11 @@ packages: supports-color: 7.2.0 dev: true + /chalk/5.1.2: + resolution: {integrity: sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + /change-case/4.1.2: resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} dependencies: @@ -2848,10 +2874,16 @@ packages: restore-cursor: 3.1.0 dev: true + /cli-cursor/4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: false + /cli-spinners/2.7.0: resolution: {integrity: sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==} engines: {node: '>=6'} - dev: true /cli-truncate/2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} @@ -2889,7 +2921,6 @@ packages: /clone/1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} - dev: true /co/4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} @@ -3175,7 +3206,6 @@ packages: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: clone: 1.0.4 - dev: true /define-properties/1.1.4: resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} @@ -4251,7 +4281,6 @@ packages: /ieee754/1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true /ignore/5.2.0: resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} @@ -4294,7 +4323,6 @@ packages: /inherits/2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true /ini/1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} @@ -4395,6 +4423,11 @@ packages: engines: {node: '>=8'} dev: true + /is-interactive/2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + dev: false + /is-negative-zero/2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} @@ -4471,6 +4504,11 @@ packages: engines: {node: '>=10'} dev: true + /is-unicode-supported/1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + dev: false + /is-weakref/1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: @@ -5673,6 +5711,14 @@ packages: is-unicode-supported: 0.1.0 dev: true + /log-symbols/5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + dependencies: + chalk: 5.1.2 + is-unicode-supported: 1.3.0 + dev: false + /loose-envify/1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -5804,7 +5850,6 @@ packages: /mimic-fn/2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - dev: true /mimic-response/3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} @@ -6126,7 +6171,6 @@ packages: engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 - dev: true /open/7.4.2: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} @@ -6171,6 +6215,21 @@ packages: wcwidth: 1.0.1 dev: true + /ora/6.1.2: + resolution: {integrity: sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + bl: 5.1.0 + chalk: 5.1.2 + cli-cursor: 4.0.0 + cli-spinners: 2.7.0 + is-interactive: 2.0.0 + is-unicode-supported: 1.3.0 + log-symbols: 5.1.0 + strip-ansi: 7.0.1 + wcwidth: 1.0.1 + dev: false + /os-tmpdir/1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -6604,7 +6663,6 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true /readdir-glob/1.1.2: resolution: {integrity: sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==} @@ -6700,6 +6758,14 @@ packages: signal-exit: 3.0.7 dev: true + /restore-cursor/4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + /retry/0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -6733,7 +6799,6 @@ packages: /safe-buffer/5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true /safe-regex-test/1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} @@ -6831,7 +6896,6 @@ packages: /signal-exit/3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true /simple-concat/1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} @@ -7001,7 +7065,6 @@ packages: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - dev: true /strip-ansi/6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -7010,6 +7073,13 @@ packages: ansi-regex: 5.0.1 dev: true + /strip-ansi/7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: false + /strip-bom/3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -7619,7 +7689,6 @@ packages: /util-deprecate/1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true /uuid/3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} @@ -7727,7 +7796,6 @@ packages: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: defaults: 1.0.4 - dev: true /webidl-conversions/3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}