From 51f9bc9d72be3abbe3081dce2bf3573d6b637183 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Fri, 24 Feb 2023 13:15:05 +0000 Subject: [PATCH] Added handy links to the SDK when logging information about the workflows --- .changeset/ten-dancers-hang.md | 5 + .../api/v1/internal/workflows/$workflowP.ts | 6 +- apps/webapp/app/routes/api/v1/templates.ts | 10 + .../api/v2/internal/workflows/$workflowP.ts | 66 +++ apps/webapp/app/services/analytics.server.ts | 24 + .../workflows/registerWorkflow.server.ts | 12 +- apps/wss/src/server.ts | 23 +- packages/internal-bridge/src/logger.ts | 6 + .../internal-bridge/src/schemas/server.ts | 38 ++ packages/internal-platform/src/api/client.ts | 24 +- packages/trigger-sdk/package.json | 1 + packages/trigger-sdk/src/client.ts | 54 ++- pnpm-lock.yaml | 418 +++++++++++++++--- 13 files changed, 618 insertions(+), 69 deletions(-) create mode 100644 .changeset/ten-dancers-hang.md create mode 100644 apps/webapp/app/routes/api/v1/templates.ts create mode 100644 apps/webapp/app/routes/api/v2/internal/workflows/$workflowP.ts diff --git a/.changeset/ten-dancers-hang.md b/.changeset/ten-dancers-hang.md new file mode 100644 index 000000000..4673a42dd --- /dev/null +++ b/.changeset/ten-dancers-hang.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/sdk": minor +--- + +Added handly links to the dashboard in log feedback diff --git a/apps/webapp/app/routes/api/v1/internal/workflows/$workflowP.ts b/apps/webapp/app/routes/api/v1/internal/workflows/$workflowP.ts index 90d3d62b2..b531ade8b 100644 --- a/apps/webapp/app/routes/api/v1/internal/workflows/$workflowP.ts +++ b/apps/webapp/app/routes/api/v1/internal/workflows/$workflowP.ts @@ -37,8 +37,10 @@ export async function action({ request, params }: ActionArgs) { case "validationError": { return json({ error: result.errors }, { status: 400 }); } - + case "isArchived": { + return json({ id: result.data.id }); + } case "success": - return json(result.data); + return json({ id: result.data.workflow.id }); } } diff --git a/apps/webapp/app/routes/api/v1/templates.ts b/apps/webapp/app/routes/api/v1/templates.ts new file mode 100644 index 000000000..daf95e1b5 --- /dev/null +++ b/apps/webapp/app/routes/api/v1/templates.ts @@ -0,0 +1,10 @@ +import { json } from "@remix-run/server-runtime"; +import { prisma } from "~/db.server"; + +export async function loader() { + const templates = await prisma.template.findMany({ + orderBy: { priority: "asc" }, + }); + + return json(templates); +} diff --git a/apps/webapp/app/routes/api/v2/internal/workflows/$workflowP.ts b/apps/webapp/app/routes/api/v2/internal/workflows/$workflowP.ts new file mode 100644 index 000000000..b0ff58824 --- /dev/null +++ b/apps/webapp/app/routes/api/v2/internal/workflows/$workflowP.ts @@ -0,0 +1,66 @@ +import type { ActionArgs } from "@remix-run/server-runtime"; +import { json } from "@remix-run/server-runtime"; +import { z } from "zod"; +import { env } from "~/env.server"; +import { authenticateApiRequest } from "~/services/apiAuth.server"; +import { RegisterWorkflow } from "~/services/workflows/registerWorkflow.server"; + +// PUT /api/v2/internal/workflows/:workflowP +export async function action({ request, params }: ActionArgs) { + // first make sure this is a PUT request + if (request.method.toUpperCase() !== "PUT") { + return json({ error: "Method not allowed" }, { status: 405 }); + } + + // Next authenticate the request + const authenticatedEnv = await authenticateApiRequest(request); + + if (!authenticatedEnv) { + return json({ error: "Invalid or Missing API key" }, { status: 401 }); + } + + // Now parse the request body + const body = await request.json(); + + // And the params + const { workflowP } = z.object({ workflowP: z.string() }).parse(params); + + const registerWorkflow = new RegisterWorkflow(); + + const result = await registerWorkflow.call( + workflowP, + body, + authenticatedEnv.organization, + authenticatedEnv + ); + + switch (result.status) { + case "validationError": { + return json({ error: result.errors }, { status: 400 }); + } + case "isArchived": { + return json({ error: "Workflow is archived" }, { status: 400 }); + } + case "success": { + const { workflow, environment, organization, isNew } = result.data; + + const data = { + workflow: { + id: workflow.id, + slug: workflow.slug, + }, + environment: { + id: environment.id, + slug: environment.slug, + }, + organization: { + id: organization.id, + slug: organization.slug, + }, + url: `${env.APP_ORIGIN}/orgs/${organization.slug}/workflows/${workflow.slug}`, + }; + + return json(data, { status: isNew ? 201 : 200 }); + } + } +} diff --git a/apps/webapp/app/services/analytics.server.ts b/apps/webapp/app/services/analytics.server.ts index fea63c923..e584f1628 100644 --- a/apps/webapp/app/services/analytics.server.ts +++ b/apps/webapp/app/services/analytics.server.ts @@ -223,6 +223,30 @@ class BehaviouralAnalytics { }, }; + telemetry = { + capture: ({ + userId, + event, + properties, + organizationId, + environmentId, + }: { + userId: string; + event: string; + properties: Record; + organizationId?: string; + environmentId?: string; + }) => { + this.#capture({ + userId, + event, + eventProperties: properties, + organizationId, + environmentId, + }); + }, + }; + #capture(event: CaptureEvent) { if (this.client === undefined) return; let groups: Record = {}; diff --git a/apps/webapp/app/services/workflows/registerWorkflow.server.ts b/apps/webapp/app/services/workflows/registerWorkflow.server.ts index 34dd891e9..8abcffe4b 100644 --- a/apps/webapp/app/services/workflows/registerWorkflow.server.ts +++ b/apps/webapp/app/services/workflows/registerWorkflow.server.ts @@ -7,7 +7,7 @@ import { prisma } from "~/db.server"; import type { Organization } from "~/models/organization.server"; import type { RuntimeEnvironment } from "~/models/runtimeEnvironment.server"; import type { Workflow } from "~/models/workflow.server"; -import { appEventPublisher, taskQueue } from "../messageBroker.server"; +import { taskQueue } from "../messageBroker.server"; export class RegisterWorkflow { #prismaClient: PrismaClient; @@ -31,7 +31,7 @@ export class RegisterWorkflow { }; } - const workflow = await this.#upsertWorkflow( + const { workflow, isNew } = await this.#upsertWorkflow( slug, validation.data, organization @@ -39,7 +39,7 @@ export class RegisterWorkflow { if (workflow.isArchived) { return { - status: "success" as const, + status: "isArchived" as const, data: { id: workflow.id }, }; } @@ -73,7 +73,7 @@ export class RegisterWorkflow { return { status: "success" as const, - data: { id: workflow.id }, + data: { workflow, environment, organization, isNew }, }; } @@ -172,9 +172,11 @@ export class RegisterWorkflow { await taskQueue.publish("WORKFLOW_CREATED", { id: workflow.id, }); + + return { workflow, isNew: true }; } - return workflow; + return { workflow, isNew: false }; } async upsertSource( diff --git a/apps/wss/src/server.ts b/apps/wss/src/server.ts index 1ea28275b..8ee80de9b 100644 --- a/apps/wss/src/server.ts +++ b/apps/wss/src/server.ts @@ -283,9 +283,9 @@ export class TriggerServer { }, INITIALIZE_HOST: async (data) => { // Initialize workflow - const success = await this.#initializeWorkflow(data); + const response = await this.#initializeWorkflow(data); - if (success) { + if (response) { return { type: "success" as const }; } else { return { @@ -294,6 +294,19 @@ export class TriggerServer { }; } }, + INITIALIZE_HOST_V2: async (data) => { + // Initialize workflow + const response = await this.#initializeWorkflow(data); + + if (response) { + return { type: "success" as const, data: response }; + } else { + return { + type: "error" as const, + message: "Failed to connect to the Pulsar cluster", + }; + } + }, }, }); @@ -342,7 +355,7 @@ export class TriggerServer { } async #initializeWorkflow( - data: z.infer<(typeof ServerRPCSchema)["INITIALIZE_HOST"]["request"]> + data: z.infer<(typeof ServerRPCSchema)["INITIALIZE_HOST_V2"]["request"]> ) { if (this.#isInitialized) { throw new Error( @@ -373,7 +386,7 @@ export class TriggerServer { triggerTTL: data.triggerTTL, }); - this.#workflowId = response.id; + this.#workflowId = response.workflow.id; this.#logger.debug("Initializing trigger subscriber..."); @@ -487,7 +500,7 @@ export class TriggerServer { this.#isInitialized = true; - return true; + return response; } catch (error) { if (error instanceof ZodError) { this.#logger.error( diff --git a/packages/internal-bridge/src/logger.ts b/packages/internal-bridge/src/logger.ts index 313faa2ca..cc02e534a 100644 --- a/packages/internal-bridge/src/logger.ts +++ b/packages/internal-bridge/src/logger.ts @@ -38,6 +38,12 @@ export class Logger { console.log(`${this.#formatName()} `, ...[...args, ...this.#formatTags()]); } + logClean(...args: any[]) { + if (this.#level < 1) return; + + console.log(`${this.#formatName()} `, ...args); + } + error(...args: any[]) { if (this.#level < 2) return; diff --git a/packages/internal-bridge/src/schemas/server.ts b/packages/internal-bridge/src/schemas/server.ts index 1579cf084..8698786a4 100644 --- a/packages/internal-bridge/src/schemas/server.ts +++ b/packages/internal-bridge/src/schemas/server.ts @@ -86,6 +86,44 @@ export const ServerRPCSchema = { ]) .nullable(), }, + INITIALIZE_HOST_V2: { + request: z.object({ + apiKey: z.string(), + workflowId: z.string(), + workflowName: z.string(), + trigger: TriggerMetadataSchema, + packageVersion: z.string(), + packageName: z.string(), + triggerTTL: z.number().optional(), + }), + response: z + .discriminatedUnion("type", [ + z.object({ + type: z.literal("success"), + data: z.object({ + workflow: z.object({ + id: z.string(), + slug: z.string(), + }), + environment: z.object({ + id: z.string(), + slug: z.string(), + }), + organization: z.object({ + id: z.string(), + slug: z.string(), + }), + isNew: z.boolean(), + url: z.string(), + }), + }), + z.object({ + type: z.literal("error"), + message: z.string(), + }), + ]) + .nullable(), + }, START_WORKFLOW_RUN: { request: z.object({ runId: z.string(), diff --git a/packages/internal-platform/src/api/client.ts b/packages/internal-platform/src/api/client.ts index 4b1c1e724..7e09cdd53 100644 --- a/packages/internal-platform/src/api/client.ts +++ b/packages/internal-platform/src/api/client.ts @@ -6,11 +6,13 @@ import { Logger } from "../logger"; export class InternalApiClient { #apiKey: string; #baseUrl: string; + #v2BaseUrl: string; #logger: Logger; constructor(apiKey: string, baseUrl: string) { this.#apiKey = apiKey; this.#baseUrl = `${baseUrl}/api/v1/internal`; + this.#v2BaseUrl = `${baseUrl}/api/v2/internal`; this.#logger = new Logger("trigger.dev [internal-api]"); } @@ -18,6 +20,7 @@ export class InternalApiClient { const ResponseSchema = z.object({ organizationId: z.string(), env: z.string(), + organizationSlug: z.string(), }); const Response401Schema = z.object({ @@ -61,14 +64,26 @@ export class InternalApiClient { async registerWorkflow(workflow: WorkflowMetadata) { const responseSchema = z.object({ - id: z.string(), + workflow: z.object({ + id: z.string(), + slug: z.string(), + }), + environment: z.object({ + id: z.string(), + slug: z.string(), + }), + organization: z.object({ + id: z.string(), + slug: z.string(), + }), + url: z.string(), }); const validationResponseSchema = z.object({ error: z.string(), }); - const response = await fetch(this.#apiUrl(`/workflows/${workflow.id}`), { + const response = await fetch(this.#v2ApiUrl(`/workflows/${workflow.id}`), { method: "PUT", headers: this.#headers({ "Content-Type": "application/json" }), body: JSON.stringify(workflow), @@ -77,7 +92,9 @@ export class InternalApiClient { if (response.ok) { const rawBody = await response.json(); - return responseSchema.parse(rawBody); + const body = responseSchema.parse(rawBody); + + return { ...body, isNew: response.status === 201 }; } if (response.status === 400) { @@ -123,6 +140,7 @@ export class InternalApiClient { } #apiUrl = (path: string) => `${this.#baseUrl}${path}`; + #v2ApiUrl = (path: string) => `${this.#v2BaseUrl}${path}`; #headers = (additionalHeaders?: Record) => ({ Accept: "application/json", Authorization: `Bearer ${this.#apiKey}`, diff --git a/packages/trigger-sdk/package.json b/packages/trigger-sdk/package.json index d3d570169..8d7465762 100644 --- a/packages/trigger-sdk/package.json +++ b/packages/trigger-sdk/package.json @@ -41,6 +41,7 @@ "evt": "^2.4.13", "node-fetch": "2.6.x", "slug": "^6.0.0", + "terminal-link": "^3.0.0", "ulid": "^2.3.0", "uuid": "^9.0.0", "ws": "^8.11.0", diff --git a/packages/trigger-sdk/src/client.ts b/packages/trigger-sdk/src/client.ts index 0425b2143..a52da176d 100644 --- a/packages/trigger-sdk/src/client.ts +++ b/packages/trigger-sdk/src/client.ts @@ -15,6 +15,7 @@ import { ContextLogger } from "./logger"; import { Trigger, TriggerOptions } from "./trigger"; import { TriggerContext, TriggerFetch } from "./types"; import { generateErrorMessage, ErrorMessageOptions } from "zod-error"; +import terminalLink from "terminal-link"; const zodErrorMessageOptions: ErrorMessageOptions = { delimiter: { @@ -39,6 +40,23 @@ export class TriggerClient { #logger: Logger; #closedByUser = false; + #registerResponse?: { + workflow: { + id: string; + slug: string; + }; + environment: { + id: string; + slug: string; + }; + organization: { + id: string; + slug: string; + }; + isNew: boolean; + url: string; + }; + #responseCompleteCallbacks = new Map< string, { @@ -100,7 +118,25 @@ export class TriggerClient { this.#initializeRPC(); await this.#initializeHost(); - this.#logger.log(`✨ Connected and listening for events`); + if (this.#registerResponse?.isNew) { + this.#logger.logClean( + `🎉 Successfully registered "${ + this.#trigger.name + }" to trigger.dev 👉 ${terminalLink( + "View on dashboard", + this.#registerResponse.url, + { fallback: (text, url) => `${text}: (${url})` } + )}. Listening for events...` + ); + } else { + this.#logger.log( + `✨ Connected and listening for events 👉 ${terminalLink( + "View on dashboard", + this.#registerResponse!.url, + { fallback: (text, url) => `${text}: (${url})` } + )}` + ); + } } catch (error) { this.#logger.log(`🚩 Could not connect to trigger.dev`); @@ -599,7 +635,13 @@ export class TriggerClient { return this.#trigger.options .run(eventData, ctx) .then((output) => { - this.#logger.log(`Run ${data.id} complete 🏃`); + this.#logger.log( + `Run ${data.id} complete 👉 ${terminalLink( + "View on dashboard", + `${this.#registerResponse!.url}/runs/${data.id}`, + { fallback: (text, url) => `${text}: (${url})` } + )}` + ); return serverRPC.send("COMPLETE_WORKFLOW_RUN", { runId: data.id, @@ -676,7 +718,7 @@ export class TriggerClient { throw new Error("Cannot initialize host without an RPC connection"); } - const response = await this.#send("INITIALIZE_HOST", { + const response = await this.#send("INITIALIZE_HOST_V2", { apiKey: this.#apiKey, workflowId: this.#trigger.id, workflowName: this.#trigger.name, @@ -686,10 +728,16 @@ export class TriggerClient { triggerTTL: this.#options.triggerTTL, }); + if (!response) { + throw new Error("Could not initialize workflow with server"); + } + if (response?.type === "error") { throw new Error(response.message); } + this.#registerResponse = response.data; + this.#logger.debug("Successfully initialized workflow with server"); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ce0db98bd..7274d0137 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -92,13 +92,13 @@ importers: '@types/json-pointer': 1.0.31 '@types/morgan': 1.9.4 '@types/node': 18.14.0 - '@typescript-eslint/eslint-plugin': 5.53.0_bzepuo66bcyj4mepwnxofjvdli + '@typescript-eslint/eslint-plugin': 5.53.0_7kw3g6rralp5ps6mg3uyzz6azm concurrently: 7.6.0 dotenv: 16.0.3 eslint: 8.34.0 eslint-config-prettier: 8.6.0_eslint@8.34.0 eslint-config-standard-with-typescript: 34.0.0_e4cqfx33t3lusso5bte4gguj3u - eslint-plugin-import: 2.27.5_zycheyzypw6s5ouujsf5akzhsy + eslint-plugin-import: 2.27.5_eslint@8.34.0 eslint-plugin-n: 15.6.1_eslint@8.34.0 eslint-plugin-promise: 6.1.1_eslint@8.34.0 nock: 13.3.0 @@ -287,7 +287,7 @@ importers: '@aws-sdk/client-s3': 3.245.0 '@aws-sdk/s3-request-presigner': 3.245.0 '@cfworker/json-schema': 1.12.5 - '@codemirror/autocomplete': 6.4.0_eo6pz6bvsllvatnnwfprpuflde + '@codemirror/autocomplete': 6.4.0_czcfkg2f66rxeiodoti7r2gulu '@codemirror/commands': 6.1.3 '@codemirror/lang-javascript': 6.1.2 '@codemirror/lang-json': 6.0.1 @@ -325,7 +325,7 @@ importers: '@trigger.dev/slack': link:../../integrations/slack '@trigger.dev/whatsapp': link:../../integrations/whatsapp '@typeform/embed-react': 2.14.1_react@18.2.0 - '@uiw/react-codemirror': 4.19.5_aguurb4bmecpxzejz52amioxne + '@uiw/react-codemirror': 4.19.5_k4ec5g7vuuzzonc3d6xbjnmmle bcryptjs: 2.4.3 classnames: 2.3.2 clsx: 1.2.1 @@ -844,7 +844,7 @@ importers: tsup: ^6.5.0 zod: ^3.20.2 dependencies: - '@react-email/render': 0.0.3_react@18.2.0 + '@react-email/render': 0.0.3 debug: 4.3.4 zod: 3.20.2 devDependencies: @@ -955,6 +955,51 @@ importers: '@types/node': 16.18.11 typescript: 4.9.4 + packages/create-trigger: + specifiers: + '@types/degit': ^2.8.3 + '@types/fs-extra': ^11.0.1 + '@types/gradient-string': ^1.1.2 + '@types/inquirer': ^9.0.3 + '@types/node': '16' + '@types/node-fetch': ^2.6.2 + chalk: ^5.2.0 + commander: ^9.4.1 + degit: ^2.8.4 + execa: ^7.0.0 + fs-extra: ^11.1.0 + gradient-string: ^2.0.2 + inquirer: ^9.1.4 + node-fetch: ^3.3.0 + ora: ^6.1.2 + rimraf: ^3.0.2 + terminal-link: ^3.0.0 + tsup: ^6.5.0 + type-fest: ^3.6.0 + typescript: ^4.9.5 + dependencies: + '@types/degit': 2.8.3 + chalk: 5.2.0 + commander: 9.5.0 + degit: 2.8.4 + execa: 7.0.0 + fs-extra: 11.1.0 + gradient-string: 2.0.2 + inquirer: 9.1.4 + node-fetch: 3.3.0 + ora: 6.1.2 + terminal-link: 3.0.0 + devDependencies: + '@types/fs-extra': 11.0.1 + '@types/gradient-string': 1.1.2 + '@types/inquirer': 9.0.3 + '@types/node': 16.18.11 + '@types/node-fetch': 2.6.2 + rimraf: 3.0.2 + tsup: 6.6.3_typescript@4.9.5 + type-fest: 3.6.0 + typescript: 4.9.5 + packages/emails: specifiers: '@react-email/button': ^0.0.4 @@ -1148,6 +1193,7 @@ importers: node-fetch: 2.6.x rimraf: ^3.0.2 slug: ^6.0.0 + terminal-link: ^3.0.0 tsup: ^6.5.0 tsx: ^3.12.1 ulid: ^2.3.0 @@ -1161,6 +1207,7 @@ importers: evt: 2.4.13 node-fetch: 2.6.7 slug: 6.1.0 + terminal-link: 3.0.0 ulid: 2.3.0 uuid: 9.0.0 ws: 8.12.0 @@ -3784,13 +3831,12 @@ packages: prettier: 2.8.2 dev: false - /@codemirror/autocomplete/6.4.0_eo6pz6bvsllvatnnwfprpuflde: + /@codemirror/autocomplete/6.4.0_czcfkg2f66rxeiodoti7r2gulu: resolution: {integrity: sha512-HLF2PnZAm1s4kGs30EiqKMgD7XsYaQ0XJnMR0rofEWQ5t5D60SfqpDIkIh1ze5tiEbyUWm8+VJ6W1/erVvBMIA==} peerDependencies: '@codemirror/language': ^6.0.0 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 - '@lezer/common': ^1.0.0 dependencies: '@codemirror/language': 6.3.2 '@codemirror/state': 6.2.0 @@ -3810,7 +3856,7 @@ packages: /@codemirror/lang-javascript/6.1.2: resolution: {integrity: sha512-OcwLfZXdQ1OHrLiIcKCn7MqZ7nx205CMKlhe+vL88pe2ymhT9+2P+QhwkYGxMICj8TDHyp8HFKVwpiisUT7iEQ==} dependencies: - '@codemirror/autocomplete': 6.4.0_eo6pz6bvsllvatnnwfprpuflde + '@codemirror/autocomplete': 6.4.0_czcfkg2f66rxeiodoti7r2gulu '@codemirror/language': 6.3.2 '@codemirror/lint': 6.1.0 '@codemirror/state': 6.2.0 @@ -5523,6 +5569,16 @@ packages: react-dom: 18.2.0_react@18.2.0 dev: false + /@react-email/render/0.0.3: + resolution: {integrity: sha512-+4eOrLGdTCJjoJU3PunekErjo3PFnhSDFjVINBHrfJT+1wlVdhWfDo7hFdzXJx/JOOYqmnZTilU/umGLdRumKQ==} + engines: {node: '>=18.0.0'} + dependencies: + pretty: 2.0.0 + react-dom: 18.2.0 + transitivePeerDependencies: + - react + dev: false + /@react-email/render/0.0.3_react@18.2.0: resolution: {integrity: sha512-+4eOrLGdTCJjoJU3PunekErjo3PFnhSDFjVINBHrfJT+1wlVdhWfDo7hFdzXJx/JOOYqmnZTilU/umGLdRumKQ==} engines: {node: '>=18.0.0'} @@ -5638,7 +5694,7 @@ packages: eslint: 8.31.0 eslint-import-resolver-node: 0.3.6 eslint-import-resolver-typescript: 3.5.3_vz4tyq5r7fh66imfi352lmrvhq - eslint-plugin-import: 2.27.5_qdjeohovcytra7xto5vgmxssaq + eslint-plugin-import: 2.27.5_2ac3tknkazjoq5fxmuugu665ny eslint-plugin-jest: 26.9.0_y6565ziejixavcuubgd3r7fqr4 eslint-plugin-jest-dom: 4.0.3_eslint@8.31.0 eslint-plugin-jsx-a11y: 6.7.1_eslint@8.31.0 @@ -6354,6 +6410,10 @@ packages: '@types/ms': 0.7.31 dev: true + /@types/degit/2.8.3: + resolution: {integrity: sha512-CL7y71j2zaDmtPLD5Xq5S1Gv2dFoHl0/GBZm6s39Mj/ls28L3NzAOqf7H4H0/2TNVMgMjMVf9CAFYSjmXhi3bw==} + dev: false + /@types/eslint/8.4.10: resolution: {integrity: sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==} dependencies: @@ -6400,12 +6460,25 @@ packages: '@types/node': 18.14.0 dev: true + /@types/fs-extra/11.0.1: + resolution: {integrity: sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==} + dependencies: + '@types/jsonfile': 6.1.1 + '@types/node': 18.14.0 + dev: true + /@types/glob/7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.14.0 + /@types/gradient-string/1.1.2: + resolution: {integrity: sha512-zIet2KvHr2dkOCPI5ggQQ+WJVyfBSFaqK9sNelhgDjlE2K3Fu2muuPJwu5aKM3xoWuc3WXudVEMUwI1QWhykEQ==} + dependencies: + '@types/tinycolor2': 1.4.3 + dev: true + /@types/hast/2.3.4: resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} dependencies: @@ -6420,6 +6493,13 @@ packages: resolution: {integrity: sha512-K3e+NZlpCKd6Bd/EIdqjFJRFHbrq5TzPPLwREk5Iv/YoIjQrs6ljdAUCo+Lb2xFlGNOjGSE0dqsVD19cZL137w==} dev: true + /@types/inquirer/9.0.3: + resolution: {integrity: sha512-CzNkWqQftcmk2jaCWdBTf9Sm7xSw4rkI1zpU/Udw3HX5//adEZUIm9STtoRP1qgWj0CWQtJ9UTvqmO2NNjhMJw==} + dependencies: + '@types/through': 0.0.30 + rxjs: 7.8.0 + dev: true + /@types/is-ci/3.0.0: resolution: {integrity: sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==} dependencies: @@ -6468,6 +6548,12 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true + /@types/jsonfile/6.1.1: + resolution: {integrity: sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==} + dependencies: + '@types/node': 18.14.0 + dev: true + /@types/jsonwebtoken/9.0.1: resolution: {integrity: sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==} dependencies: @@ -6671,6 +6757,15 @@ packages: '@types/jest': 29.2.5 dev: true + /@types/through/0.0.30: + resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==} + dependencies: + '@types/node': 18.14.0 + dev: true + + /@types/tinycolor2/1.4.3: + resolution: {integrity: sha512-Kf1w9NE5HEgGxCRyIcRXR/ZYtDv0V8FVPtYHwLxl0O+maGX0erE77pQlD0gpP+/KByMZ87mOA79SjifhSB3PjQ==} + /@types/unist/2.0.6: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} dev: true @@ -6731,7 +6826,7 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin/5.53.0_bzepuo66bcyj4mepwnxofjvdli: + /@typescript-eslint/eslint-plugin/5.53.0_7kw3g6rralp5ps6mg3uyzz6azm: resolution: {integrity: sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -6742,7 +6837,6 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.48.1_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/scope-manager': 5.53.0 '@typescript-eslint/type-utils': 5.53.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/utils': 5.53.0_7kw3g6rralp5ps6mg3uyzz6azm @@ -7005,18 +7099,17 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@uiw/codemirror-extensions-basic-setup/4.19.5_tbeldtdcrf45b35pezgkzq2u4e: + /@uiw/codemirror-extensions-basic-setup/4.19.5_wd2tsis3in55bkaiwnc2c46tom: resolution: {integrity: sha512-1zt7ZPJ01xKkSW/KDy0FZNga0bngN1fC594wCVG7FBi60ehfcAucpooQ+JSPScKXopxcb+ugPKZvVLzr9/OfzA==} peerDependencies: '@codemirror/autocomplete': '>=6.0.0' '@codemirror/commands': '>=6.0.0' '@codemirror/language': '>=6.0.0' - '@codemirror/lint': '>=6.0.0' '@codemirror/search': '>=6.0.0' '@codemirror/state': '>=6.0.0' '@codemirror/view': '>=6.0.0' dependencies: - '@codemirror/autocomplete': 6.4.0_eo6pz6bvsllvatnnwfprpuflde + '@codemirror/autocomplete': 6.4.0_czcfkg2f66rxeiodoti7r2gulu '@codemirror/commands': 6.1.3 '@codemirror/language': 6.3.2 '@codemirror/lint': 6.1.0 @@ -7025,14 +7118,11 @@ packages: '@codemirror/view': 6.7.2 dev: false - /@uiw/react-codemirror/4.19.5_aguurb4bmecpxzejz52amioxne: + /@uiw/react-codemirror/4.19.5_k4ec5g7vuuzzonc3d6xbjnmmle: resolution: {integrity: sha512-ZCHh8d7beXbF8/t7F1+yHht6A9Y6CdKeOkZq4A09lxJEnyTQrj1FMf2zvfaqc7K23KNjkTCtSlbqKKbVDgrWaw==} peerDependencies: - '@babel/runtime': '>=7.11.0' '@codemirror/state': '>=6.0.0' - '@codemirror/theme-one-dark': '>=6.0.0' '@codemirror/view': '>=6.0.0' - codemirror: '>=6.0.0' react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: @@ -7041,14 +7131,13 @@ packages: '@codemirror/state': 6.2.0 '@codemirror/theme-one-dark': 6.1.0 '@codemirror/view': 6.7.2 - '@uiw/codemirror-extensions-basic-setup': 4.19.5_tbeldtdcrf45b35pezgkzq2u4e - codemirror: 6.0.1_@lezer+common@1.0.2 + '@uiw/codemirror-extensions-basic-setup': 4.19.5_wd2tsis3in55bkaiwnc2c46tom + codemirror: 6.0.1 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 transitivePeerDependencies: - '@codemirror/autocomplete' - '@codemirror/language' - - '@codemirror/lint' - '@codemirror/search' dev: false @@ -7261,6 +7350,20 @@ packages: type-fest: 0.21.3 dev: true + /ansi-escapes/5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: false + + /ansi-escapes/6.0.0: + resolution: {integrity: sha512-IG23inYII3dWlU2EyiAiGj6Bwal5GzsgPMwjYGvc1HPE2dgbj4ZB5ToWBKSquKw74nB3TIuOwaI6/jSULzfgrw==} + engines: {node: '>=14.16'} + dependencies: + type-fest: 3.6.0 + dev: false + /ansi-regex/2.1.1: resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} @@ -7273,7 +7376,6 @@ packages: /ansi-regex/6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} - dev: true /ansi-styles/3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} @@ -7295,7 +7397,6 @@ packages: /ansi-styles/6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - dev: true /ansicolors/0.3.2: resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} @@ -7751,6 +7852,14 @@ packages: inherits: 2.0.4 readable-stream: 3.6.0 + /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 + /blob-util/2.0.2: resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==} dev: true @@ -7879,6 +7988,13 @@ packages: base64-js: 1.5.1 ieee754: 1.2.1 + /buffer/6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + /buffers/0.1.1: resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} engines: {node: '>=0.2.0'} @@ -8135,6 +8251,11 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 + /chalk/5.2.0: + resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + /character-entities-html4/2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} dev: true @@ -8234,6 +8355,13 @@ packages: dependencies: restore-cursor: 3.1.0 + /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-progress/3.11.2: resolution: {integrity: sha512-lCPoS6ncgX4+rJu5bS3F/iCz17kZ9MPZ6dpuTtI0KXKABkhyXIdYB3Inby1OpaGti3YlI3EeEkM9AuWpelJrVA==} engines: {node: '>=4'} @@ -8307,6 +8435,11 @@ packages: engines: {node: '>= 10'} dev: true + /cli-width/4.0.0: + resolution: {integrity: sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==} + engines: {node: '>= 12'} + dev: false + /client-only/0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} dev: false @@ -8378,18 +8511,16 @@ packages: engines: {node: '>=0.10.0'} dev: false - /codemirror/6.0.1_@lezer+common@1.0.2: + /codemirror/6.0.1: resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==} dependencies: - '@codemirror/autocomplete': 6.4.0_eo6pz6bvsllvatnnwfprpuflde + '@codemirror/autocomplete': 6.4.0_czcfkg2f66rxeiodoti7r2gulu '@codemirror/commands': 6.1.3 '@codemirror/language': 6.3.2 '@codemirror/lint': 6.1.0 '@codemirror/search': 6.2.3 '@codemirror/state': 6.2.0 '@codemirror/view': 6.7.2 - transitivePeerDependencies: - - '@lezer/common' dev: false /collection-visit/1.0.0: @@ -8454,7 +8585,6 @@ packages: /commander/9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} - dev: true /common-tags/1.8.2: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} @@ -9016,6 +9146,12 @@ packages: vm2: 3.9.13 dev: true + /degit/2.8.4: + resolution: {integrity: sha512-vqYuzmSA5I50J882jd+AbAhQtgK6bdKUJIex1JNfEUPENCgYsxugzKVZlFyMwV4i06MmnV47/Iqi5Io86zf3Ng==} + engines: {node: '>=8.0.0'} + hasBin: true + dev: false + /delayed-stream/1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -9180,7 +9316,6 @@ packages: /eastasianwidth/0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true /ecc-jsbn/0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} @@ -9224,7 +9359,6 @@ packages: /emoji-regex/9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true /emojis-list/3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} @@ -9699,6 +9833,11 @@ packages: engines: {node: '>=10'} dev: true + /escape-string-regexp/5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: false + /escodegen/1.14.3: resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} engines: {node: '>=4.0'} @@ -9740,11 +9879,11 @@ packages: eslint-plugin-promise: ^6.0.0 typescript: '*' dependencies: - '@typescript-eslint/eslint-plugin': 5.53.0_bzepuo66bcyj4mepwnxofjvdli + '@typescript-eslint/eslint-plugin': 5.53.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/parser': 5.48.1_7kw3g6rralp5ps6mg3uyzz6azm eslint: 8.34.0 eslint-config-standard: 17.0.0_rwq7hzy2vtlwiajbw6pmw3rkzy - eslint-plugin-import: 2.27.5_zycheyzypw6s5ouujsf5akzhsy + eslint-plugin-import: 2.27.5_eslint@8.34.0 eslint-plugin-n: 15.6.1_eslint@8.34.0 eslint-plugin-promise: 6.1.1_eslint@8.34.0 typescript: 4.9.5 @@ -9761,7 +9900,7 @@ packages: eslint-plugin-promise: ^6.0.0 dependencies: eslint: 8.34.0 - eslint-plugin-import: 2.27.5_zycheyzypw6s5ouujsf5akzhsy + eslint-plugin-import: 2.27.5_eslint@8.34.0 eslint-plugin-n: 15.6.1_eslint@8.34.0 eslint-plugin-promise: 6.1.1_eslint@8.34.0 dev: true @@ -9804,7 +9943,7 @@ packages: debug: 4.3.4 enhanced-resolve: 5.12.0 eslint: 8.31.0 - eslint-plugin-import: 2.27.5_qdjeohovcytra7xto5vgmxssaq + eslint-plugin-import: 2.27.5_2ac3tknkazjoq5fxmuugu665ny get-tsconfig: 4.3.0 globby: 13.1.3 is-core-module: 2.11.0 @@ -9814,7 +9953,7 @@ packages: - supports-color dev: true - /eslint-module-utils/2.7.4_fqawsowff3yxll7f25e3byprdq: + /eslint-module-utils/2.7.4_eyqnu5kib2hfrvsonwfdq4ojse: resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: @@ -9835,7 +9974,6 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.48.1_7kw3g6rralp5ps6mg3uyzz6azm debug: 3.2.7 eslint: 8.34.0 eslint-import-resolver-node: 0.3.7 @@ -9843,7 +9981,7 @@ packages: - supports-color dev: true - /eslint-module-utils/2.7.4_sqt5xxn4ciiurbqrzlaarm6ama: + /eslint-module-utils/2.7.4_v73lhamtbyinynmwa5fn7kpmfq: resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: @@ -9868,6 +10006,7 @@ packages: debug: 3.2.7 eslint: 8.31.0 eslint-import-resolver-node: 0.3.7 + eslint-import-resolver-typescript: 3.5.3_vz4tyq5r7fh66imfi352lmrvhq transitivePeerDependencies: - supports-color dev: true @@ -9903,7 +10042,7 @@ packages: regexpp: 3.2.0 dev: true - /eslint-plugin-import/2.27.5_qdjeohovcytra7xto5vgmxssaq: + /eslint-plugin-import/2.27.5_2ac3tknkazjoq5fxmuugu665ny: resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: @@ -9921,7 +10060,7 @@ packages: doctrine: 2.1.0 eslint: 8.31.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.7.4_sqt5xxn4ciiurbqrzlaarm6ama + eslint-module-utils: 2.7.4_v73lhamtbyinynmwa5fn7kpmfq has: 1.0.3 is-core-module: 2.11.0 is-glob: 4.0.3 @@ -9936,7 +10075,7 @@ packages: - supports-color dev: true - /eslint-plugin-import/2.27.5_zycheyzypw6s5ouujsf5akzhsy: + /eslint-plugin-import/2.27.5_eslint@8.34.0: resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: @@ -9946,7 +10085,6 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.48.1_7kw3g6rralp5ps6mg3uyzz6azm array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 @@ -9954,7 +10092,7 @@ packages: doctrine: 2.1.0 eslint: 8.34.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.7.4_fqawsowff3yxll7f25e3byprdq + eslint-module-utils: 2.7.4_eyqnu5kib2hfrvsonwfdq4ojse has: 1.0.3 is-core-module: 2.11.0 is-glob: 4.0.3 @@ -10464,6 +10602,21 @@ packages: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + /execa/7.0.0: + resolution: {integrity: sha512-tQbH0pH/8LHTnwTrsKWideqi6rFB/QNUawEwrn+WHyz7PX1Tuz2u7wfTvbaNBdP5JD5LVWxNo8/A8CHNZ3bV6g==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: false + /executable/4.1.1: resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} engines: {node: '>=4'} @@ -10727,6 +10880,14 @@ packages: escape-string-regexp: 1.0.5 dev: true + /figures/5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} + dependencies: + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 + dev: false + /file-entry-cache/6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -10968,6 +11129,15 @@ packages: universalify: 2.0.0 dev: true + /fs-extra/11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + /fs-extra/7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -11379,6 +11549,14 @@ packages: /graceful-fs/4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + /gradient-string/2.0.2: + resolution: {integrity: sha512-rEDCuqUQ4tbD78TpzsMtt5OIf0cBCSDWSJtUDaF6JsAh+k0v9r++NzxNEG87oDZx9ZwGhD8DaezR2L/yrw0Jdw==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + tinygradient: 1.1.5 + dev: false + /grapheme-splitter/1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} @@ -11639,6 +11817,11 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + /human-signals/4.3.0: + resolution: {integrity: sha512-zyzVyMjpGBX2+6cDVZeFPCdtOtdsxOeseRhB9tkQ6xXmGUNrcnBzdEKPy3VPNYz+4gy1oukVOXcrJCunSyc6QQ==} + engines: {node: '>=14.18.0'} + dev: false + /humanize-duration/3.27.3: resolution: {integrity: sha512-iimHkHPfIAQ8zCDQLgn08pRqSVioyWvnGfaQ8gond2wf7Jq2jJ+24ykmnRyiz3fIldcn4oUuQXpjqKLhSVR7lw==} dev: false @@ -11743,6 +11926,27 @@ packages: wrap-ansi: 7.0.0 dev: true + /inquirer/9.1.4: + resolution: {integrity: sha512-9hiJxE5gkK/cM2d1mTEnuurGTAoHebbkX0BYl3h7iEg7FYfuNIom+nDfBCSWtvSnoSrWCeBxqqBZu26xdlJlXA==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 6.0.0 + chalk: 5.2.0 + cli-cursor: 4.0.0 + cli-width: 4.0.0 + external-editor: 3.1.0 + figures: 5.0.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 6.1.2 + run-async: 2.4.1 + rxjs: 7.8.0 + string-width: 5.1.2 + strip-ansi: 7.0.1 + through: 2.3.8 + wrap-ansi: 8.1.0 + dev: false + /internal-slot/1.0.4: resolution: {integrity: sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==} engines: {node: '>= 0.4'} @@ -12004,6 +12208,11 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} + /is-interactive/2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + dev: false + /is-invalid-path/0.1.0: resolution: {integrity: sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==} engines: {node: '>=0.10.0'} @@ -12119,6 +12328,11 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + /is-stream/3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + /is-string/1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -12156,6 +12370,11 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} + /is-unicode-supported/1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + dev: false + /is-valid-path/0.1.1: resolution: {integrity: sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==} engines: {node: '>=0.10.0'} @@ -12557,7 +12776,6 @@ packages: universalify: 2.0.0 optionalDependencies: graceful-fs: 4.2.10 - dev: true /jsonpath-plus/5.1.0: resolution: {integrity: sha512-890w2Pjtj0iswAxalRlt2kHthi6HKrXEfZcn+ZNZptv7F3rUGIeDuZo+C+h4vXBHLEsVjJrHeCm35nYeZLzSBQ==} @@ -12850,6 +13068,14 @@ packages: chalk: 4.1.2 is-unicode-supported: 0.1.0 + /log-symbols/5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + dependencies: + chalk: 5.2.0 + is-unicode-supported: 1.3.0 + dev: false + /log-update/4.0.0: resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} engines: {node: '>=10'} @@ -13532,6 +13758,11 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + /mimic-fn/4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: false + /mimic-response/1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} @@ -13725,7 +13956,6 @@ packages: /mute-stream/0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true /mz/2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -13935,6 +14165,13 @@ packages: dependencies: path-key: 3.1.1 + /npm-run-path/5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: false + /npmlog/4.1.2: resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} dependencies: @@ -14117,6 +14354,13 @@ packages: dependencies: mimic-fn: 2.1.0 + /onetime/6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: false + /ono/4.0.11: resolution: {integrity: sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==} dependencies: @@ -14174,6 +14418,21 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 + /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.2.0 + 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'} @@ -14429,6 +14688,11 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + /path-key/4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: false + /path-parse/1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -14968,6 +15232,15 @@ packages: shallow-equal: 1.2.1 dev: false + /react-dom/18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + scheduler: 0.23.0 + dev: false + /react-dom/18.2.0_react@18.2.0: resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: @@ -15550,6 +15823,14 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 + /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 + /ret/0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} @@ -15643,7 +15924,6 @@ packages: /run-async/2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} - dev: true /run-exclusive/2.2.18: resolution: {integrity: sha512-TXr1Gkl1iEAOCCpBTRm/2m0+1KGjORcWpZZ+VGGTe7dYX8E4y8/fMvrHk0zf+kclec2R//tpvdBxgG0bDgaJfw==} @@ -15660,7 +15940,6 @@ packages: resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} dependencies: tslib: 2.4.1 - dev: true /sade/1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} @@ -16201,7 +16480,6 @@ packages: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.0.1 - dev: true /string.prototype.matchall/4.0.8: resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} @@ -16278,7 +16556,6 @@ packages: engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 - dev: true /strip-bom/3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} @@ -16288,6 +16565,11 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + /strip-final-newline/3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: false + /strip-indent/3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -16371,7 +16653,6 @@ packages: dependencies: has-flag: 4.0.0 supports-color: 7.2.0 - dev: true /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} @@ -16518,6 +16799,14 @@ packages: engines: {node: '>=8'} dev: false + /terminal-link/3.0.0: + resolution: {integrity: sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==} + engines: {node: '>=12'} + dependencies: + ansi-escapes: 5.0.0 + supports-hyperlinks: 2.3.0 + dev: false + /test-exclude/6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -16565,7 +16854,6 @@ packages: /through/2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true /through2/2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -16595,6 +16883,17 @@ packages: resolution: {integrity: sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==} dev: true + /tinycolor2/1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + dev: false + + /tinygradient/1.1.5: + resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} + dependencies: + '@types/tinycolor2': 1.4.3 + tinycolor2: 1.6.0 + dev: false + /tinypool/0.3.0: resolution: {integrity: sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ==} engines: {node: '>=14.0.0'} @@ -17102,10 +17401,19 @@ packages: engines: {node: '>=8'} dev: false + /type-fest/1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: false + /type-fest/2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} + /type-fest/3.6.0: + resolution: {integrity: sha512-RqTRtKTzvPpNdDUp1dVkKQRunlPITk4mXeqFlAZoJsS+fLRn8AdPK0TcQDumGayhU7fjlBfiBjsq3pe3rIfXZQ==} + engines: {node: '>=14.16'} + /type-is/1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -17299,7 +17607,6 @@ packages: /universalify/2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} - dev: true /unload/2.2.0: resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==} @@ -17997,6 +18304,15 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 + /wrap-ansi/8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.0.1 + dev: false + /wrappy/1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}