From 75e769bac103a7475c9c8eb2c8be3eb1bf9c7802 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adnan=20Rahi=C4=87?= Date: Tue, 13 Feb 2024 14:30:06 +0100 Subject: [PATCH 1/4] docs(cfw): Add better prerequisites explanation (#3633) docs(cfw): Add better prereqs and npx guide --- docs/docs/examples-tutorials/recipes.mdx | 1 + ...flare-workers-with-opentelemetry-tracetest.mdx | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/docs/docs/examples-tutorials/recipes.mdx b/docs/docs/examples-tutorials/recipes.mdx index 9686ac01bb..90865883fb 100644 --- a/docs/docs/examples-tutorials/recipes.mdx +++ b/docs/docs/examples-tutorials/recipes.mdx @@ -37,6 +37,7 @@ These recipes show how to trigger Tracetest test runs with message queues like K These recipes show how to run tests against Serverless Functions with Tracetest. - [Testing Vercel Functions with OpenTelemetry](/examples-tutorials/recipes/testing-vercel-functions-with-opentelemetry-tracetest) +- [Testing Cloudflare Workers with OpenTelemetry](/examples-tutorials/recipes/testing-cloudflare-workers-with-opentelemetry-tracetest) ## Trace Data Stores diff --git a/docs/docs/examples-tutorials/recipes/testing-cloudflare-workers-with-opentelemetry-tracetest.mdx b/docs/docs/examples-tutorials/recipes/testing-cloudflare-workers-with-opentelemetry-tracetest.mdx index 432b2f9711..184d1f2d5d 100644 --- a/docs/docs/examples-tutorials/recipes/testing-cloudflare-workers-with-opentelemetry-tracetest.mdx +++ b/docs/docs/examples-tutorials/recipes/testing-cloudflare-workers-with-opentelemetry-tracetest.mdx @@ -52,6 +52,9 @@ The Cloudflare Worker will fetch data from an external API, transform the data a - Create an [environment](/concepts/environments). - Create an [environment token](/concepts/environment-tokens). - Have access to the environment's [agent API key](/configuration/agent). + +### Cloudflare Account + - [Cloudflare Workers Account](https://workers.cloudflare.com/) - [Cloudflare D1 Database](https://developers.cloudflare.com/d1/get-started/) @@ -70,6 +73,18 @@ Before moving forward, run `npm i` in the root folder to install the dependencie npm i ``` +If you do not have [`npx`](https://www.npmjs.com/package/npx) installed, install it first. + +```bash title=Terminal +npm i npx -g +``` + +Run the command to login to your Cloudflare Workers account. + +```bash title=Terminal +npx wrangler login +``` + Run the command to create a D1 database both locally and in your Cloudflare Workers account. ```bash title=Terminal From fc565d503df944cf8dda8245aa73779463061fb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adnan=20Rahi=C4=87?= Date: Tue, 13 Feb 2024 14:30:17 +0100 Subject: [PATCH 2/4] docs(vercel): add prod env vars and test (#3632) docs(vercel): add prod env vars and test (todo: fix breaking deployment) --- .../.env.prod | 11 +++++++++++ .../test/api.pokemon.spec.prod.yaml | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 examples/integration-testing-vercel-functions/.env.prod create mode 100644 examples/integration-testing-vercel-functions/test/api.pokemon.spec.prod.yaml diff --git a/examples/integration-testing-vercel-functions/.env.prod b/examples/integration-testing-vercel-functions/.env.prod new file mode 100644 index 0000000000..fbed8a49c6 --- /dev/null +++ b/examples/integration-testing-vercel-functions/.env.prod @@ -0,0 +1,11 @@ +# OTLP HTTP +OTEL_EXPORTER_OTLP_ENDPOINT="https://.tracetest.io:443" + +# Vercel Postgres +POSTGRES_DATABASE="**********" +POSTGRES_HOST="**********" +POSTGRES_PASSWORD="**********" +POSTGRES_PRISMA_URL="**********" +POSTGRES_URL="**********" +POSTGRES_URL_NON_POOLING="**********" +POSTGRES_USER="**********" diff --git a/examples/integration-testing-vercel-functions/test/api.pokemon.spec.prod.yaml b/examples/integration-testing-vercel-functions/test/api.pokemon.spec.prod.yaml new file mode 100644 index 0000000000..8769d49863 --- /dev/null +++ b/examples/integration-testing-vercel-functions/test/api.pokemon.spec.prod.yaml @@ -0,0 +1,18 @@ +type: Test +spec: + id: p00W82OIR + name: Test API + trigger: + type: http + httpRequest: + method: GET + url: https://integration-testing-nextjs-vercel-functions.vercel.app/api/pokemon + body: "{\n \"id\": \"6\"\n}" + headers: + - key: Content-Type + value: application/json + specs: + - selector: span[tracetest.span.type="http"] + name: "All HTTP Spans: Status code is 200" + assertions: + - attr:http.status_code = 200 From 8adaa72b44e916d805f13d2ec61e31c5501aa3c7 Mon Sep 17 00:00:00 2001 From: Oscar Reyes Date: Tue, 13 Feb 2024 09:03:15 -0600 Subject: [PATCH 3/4] chore(examples): Adding Serverless Example (#3621) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(examples): Adding Serverless Example * chore(examples): Adding Automated Tracetest Tests * chore(examples): Adding Automated Tracetest Tests * chore(examples): adding readme.md * chore(examples): adding readme.md * chore(examples): adding recipe * feat(frontend): Updating prereqs and fomatting * Update docs/docs/examples-tutorials/recipes/testing-lambda-functions-with-opentelemetry-tracetest.mdx Co-authored-by: Adnan Rahić --------- Co-authored-by: Adnan Rahić --- .../img/serverless-results.png | Bin 0 -> 392331 bytes docs/docs/examples-tutorials/recipes.mdx | 3 +- ...functions-with-opentelemetry-tracetest.mdx | 286 + ...functions-with-opentelemetry-tracetest.mdx | 2 +- docs/sidebars.js | 5 + examples/quick-start-serverless/.env.template | 2 + examples/quick-start-serverless/.gitignore | 7 + examples/quick-start-serverless/.prettierrc | 3 + examples/quick-start-serverless/README.md | 11 + .../quick-start-serverless/package-lock.json | 8955 +++++++++++++++++ examples/quick-start-serverless/package.json | 34 + .../resources/dynamodb.yml | 12 + .../quick-start-serverless/serverless.yml | 45 + .../quick-start-serverless/src/dynamodb.ts | 35 + .../quick-start-serverless/src/handler.ts | 49 + .../src/lambda-wrapper.ts | 31 + examples/quick-start-serverless/src/types.ts | 20 + examples/quick-start-serverless/tracetest.ts | 67 + examples/quick-start-serverless/tsconfig.json | 14 + 19 files changed, 9578 insertions(+), 3 deletions(-) create mode 100644 docs/docs/examples-tutorials/img/serverless-results.png create mode 100644 docs/docs/examples-tutorials/recipes/testing-lambda-functions-with-opentelemetry-tracetest.mdx create mode 100644 examples/quick-start-serverless/.env.template create mode 100644 examples/quick-start-serverless/.gitignore create mode 100644 examples/quick-start-serverless/.prettierrc create mode 100644 examples/quick-start-serverless/README.md create mode 100644 examples/quick-start-serverless/package-lock.json create mode 100644 examples/quick-start-serverless/package.json create mode 100644 examples/quick-start-serverless/resources/dynamodb.yml create mode 100644 examples/quick-start-serverless/serverless.yml create mode 100644 examples/quick-start-serverless/src/dynamodb.ts create mode 100644 examples/quick-start-serverless/src/handler.ts create mode 100644 examples/quick-start-serverless/src/lambda-wrapper.ts create mode 100644 examples/quick-start-serverless/src/types.ts create mode 100644 examples/quick-start-serverless/tracetest.ts create mode 100644 examples/quick-start-serverless/tsconfig.json diff --git a/docs/docs/examples-tutorials/img/serverless-results.png b/docs/docs/examples-tutorials/img/serverless-results.png new file mode 100644 index 0000000000000000000000000000000000000000..b3332ba63b123d5201f9059e62ae0e18461edae9 GIT binary patch literal 392331 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®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≈ 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

aeu8BG^W_8hbZ3d~Y;UXz~l? zy-{G=L#W%iMOhXFhpbkqCV2|&?9rzVEl`83v4*~0rQ1yV1qwC~$8DTm_yUo2|7-y99`X|%>3#}(Hd)yhQ0M@kwoI*%(+UTOVUGBV-?98mqC)K;~{(O7Y< zaUN=z*JpQcj$Ny&A_14>8-FOQ$riYCA6xF!c3Exxn)@ofYBh{BS8Ld>AE9!l@6ho8 zQers>yB(=scgdk>mFA^QLf6J538**YX^3ds?Kx!+J!?(QCDGc;vqCQOIXyX=eIquw zKn9UuNw#)=nht19m2_vpJpBUHy4r0mwm9>REI}kXXw1T`m}}?QH65m*@E6r#yZr*4 zCDA)iO0DLvoYk#cshT?!=KaFiij=9XN#zfKz?}=|B@kKltLTtv(JF5&P(M~bDT5Ak z>Q3L(DxmK!lVQNwq5ByQw+*W>UwcIJiY@QcuqpNz7w8yN1M?F7btf-AP()XVWdO}1 zVo`yrO#Mo?ESy!H)s|4LKYK@?r42ZIwfd6|sbRh^gP6%{NI`JE9M;-`%1)~jpT>o&UdX?*hT(>uvZBJ(8sb~EwTINr zLCRSBKm*9S(@>K4#>K6miHK|{d8PfK&zZ59DK_QiypFMF?B{hkYe5qj!r7UC>@h*f zZ!g#lkdoiT54-2g^QNoqR~JQ5F_=C(XY_$l>=s-UR&vP-q*89{`%DUzVjIT~^PAT0 z@|&-iK%$Ji=mgmuMMaxP_tdw5v) z{K*4oz}(5RgR2`aN_s3Hf&o>d0yc^XID5*e;@Z{76tUz*|*C)-V z8~d*>I-S(*wZ?n_fYaog@~p6rq4N)P(;?zW$POeK>n^Z`@sugCr;V|5m;&L8NuiBt8I}aZ%kis+K4SRnRHRwM>1O-6SDeQi$0G6anun6^C5hJ( z+wEBG&sTCZ6l&zS=Dy@hs=b>3B{Tw%O;!nuoKDai-#thW4h4-&OPRhd5b zWwZ5$V8+z}!urJxv|)gcsW%&Ui_jz7X}bR}pedp!G~b~c(rzmWruG1H zlPO$|)9qqDVZTWV+wXU%TfLPPn%S~*#%!_mi!bVIRaUULYv>>YuQtxF1xv6>6BA!{ z)+uyRjF*P=B3aj{YDL?^qG2g$My~1#r1!xrp?j;~8V{`Xrm)-h7eG_+TKiV`PNW_R z`_0jRv}r5S_G0@rk_-dOEn?#@`CG&`wpP|ekUlUtgOghli4Z0G779mK{hX|olc z1&Jp0KTPu5p=^SSmRDkwc%?vl`f} zP4x*Hi|T1s26wEOJjfn$8AaQw%geE{#T{O2(X!_=!tTYa^6WRk2~}2W4LR`{^Et&Nv`OM0fG-7YNT4!lSIdy*m*3Xz#K8UVr0-_lOq8L$V&44@k zlIv6vrvF<=ayai)FEN9e9F5@8VyHXgCPUs{$gq(UHjd3lf-l#oO`W`lJ;|9C$=7H# zzueIk^gz?51SJnXTG)`axO{gn2`Sv;)vc?;Q*JlMExv~#gk%`>ANov6gYl)7>S}#< zBV3^|DE_@C&U3A|v3`WWTz0wv%)zmJ<>YEA>rI3WLbi5M6=hDkHMBK1UCAodQ|>N! zQ3zfBBq@}xmP_wGi^0jFA=b_8Vjx`DzLJ~D!*0)cda6H2Yp5siPVDH>+gwIVq#9C8 z*yfnxG{LBTE9wqmwL)PPHvJB;uSv|T2sy}i_v;xa`4cTg$zcK14X<6M4^}0Y;TT#) zcH5*I5RX1Tro~=_Ej#bAxGQE^)Zv?0mK3I@*x~!IYL#gbpR=fa7sRR`ovZ^NDz#K; zL(C|=Pp7dFhy&KWI`r-LH*md;Gz8rRQ21@q6tK4K2A%!QC1J=^Z*x6X`6IBQ!`gdc zO06sLTf+jIFLC@8xip+eb0j)s4b!Y%o+xCJ+LLSels%gJHc-RlN6GYUO&*3PQ&lyL z$=kn+IZT#AYUU$dobFkT>Km2s!R6u)AWze@BaaA#2)=;lUZA_VDiRl|kxwi0)lsT_ zVspTe#Lo;vOKW*EP^Y<9Iz>T%hn5g;9AP-evpge^ik~q9Vav2~eT3Di=_M!qpyext22&+H>@ar}B3celt;`Lw+-Yp8+

b>>uB?xVsY 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

FM3eDg5}fPEViKi|;ch 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

*+X&lD_4wfXs@RB41YFmU$4%&214#;P zqyS<|35K%~<{@!xf#VE*mo3>&ftc=O&H^9>cJ+8wiGbRofIc>98!v(2f z0I=Jhqsqm`z9mDg`VrS2`m}dfo>Pq+AZ$+lV1?t0M&-!AP^y4+vI0Y5f=#>GEtrAg zU^CHA5Vfej<~CwY0iwzdCsdrqN=Fmr#XN;~BT7_|pF zob;n^(~GQn$<2G=DRMlsXy{p(c0xg#h@ks3>Ft&jPfU18-NuKvdO+4`G1C1N?hfDZ zwIAENAIJSZ!)v9UTKQ9K44cu(TAys3UV(i@gX5<@*-1~kq)M&M>;I6@hmUKcb{%!- z$P00Cwz##GuikRPmW{2^_4lJeh-FclkhVY;-aJ>QEB!7{u3JR`Jlo*dt?X(u#E5Q~ z*#33J$I~W=+c=F+5MZCk`Y zXiH!Xw0O720TEbr-RQ3m9;`YZd#tjEKz{y|XG7e#mI(!IMw}$s?pRg7!CK$*^cH_>WK zjih?!igky*>vOzeYQHGIze;-Ku33M4){f>|AEF^dk))7zolBGN+=e%;bMLdAefFbz zd8}=F@Rq^*=N+`n4NnX+tgcGpZue^cmBFTQecy6IRE^zpf2Dp$>&5n*1c)j}NgfS2 z!C_4odNOEQubc=v^A;Nd_{M%9Z3S!bJ0*7FJtZ=J&z*t=(=lGW3pD%elwH9(sb}62>?KZ~Eo{#pDhNQ>xxT&3#NPhk3I^ue9k?|AlXf#?M#@xa(@EV<%Dnw7F=- z6Y(U-1QHfPV3%{q^HRydLiJYkwuy*TO8>TU-&-AqYjH9{vuTz|3g8$3_*)@?Q_}di zpLL4gP^^8IkfV-rS-PsrX8P*gZ%I242)}`@ISKy-TG?87m^e3#{A4Z+@qyfNzN-ccOuE4B4u}Fb)*7jfb!CRs?(af*k z%P$J5eFC+Rr*5{@D{DvI+{;9gn@^>?_m_mu4Ez$F9rGj7%KgIV^yaR;y79FE&#Rm0 z>+OxEnE_*=BE7BobnN$P&C+i2koZ!^hhvmy+mdAycP9$e;-ofFDraV8f9tFpOBw2% zIEa|ly35}SeA?G%GpC+>BMg4W;WODnZ&b^(d9a8jWlT_lBMsmTH){GB;Xgk&`Y|xS zMvYqu8eS5<_8eJlmu8dP8K@EhE?gARbiw?ZAkkCyF_cq|0c>Hu;3^1M(J)WnKlzRY zNg?igysbt3nYOg=ezb|y(8eLQze2;|gI}y6FwYaN@>?sO)0Fjxxz=ZlF|JpG_WU-m zJLinL&1J?+@FbT63>V+ue0LX}+Igh($jT+jeT)$_qoCxX)f$jZAE1N#^NizHQk zvJwv;biMsk2USi{S}?>2mVa7~v~~3tVgO#PT^TOH;|rq_1;!OGjv&EUqk}VW4F_f{ zok5e!JjVZjEJL&tkbU(D)YPupCd-7LfcZLGbYd#;Mk4M%$&=bcjmrM+ZCf5GX1rTl z>@+qy-6=abE~P-0^qnK)N_X32FW?$tmaEGl`6O78wBHL#r9~&jeV}oxD3xQ@r5McvpYow+Dnq5T znQsR~M!$BK=(GNo=cAe~7G~hTWOcrSMW|Kbpq9wZ%dvEShV<78x;OH)vGSF+i_Xv; z_XW&HGAK>f+}UHGm2MwrS@K1pIE!e0Xt1g#<_0Bd(}NUFYi%0~w|EDJg?BL&WTvuO zesgh&&W}(efN~vB8!_9U5rXlvzbB=zC9G%Os^`$}zI*}wagx#{_z MQ_@l_duSE%e~*-*r~m)} literal 0 HcmV?d00001 diff --git a/docs/docs/examples-tutorials/recipes.mdx b/docs/docs/examples-tutorials/recipes.mdx index 90865883fb..596eb5d865 100644 --- a/docs/docs/examples-tutorials/recipes.mdx +++ b/docs/docs/examples-tutorials/recipes.mdx @@ -37,6 +37,7 @@ These recipes show how to trigger Tracetest test runs with message queues like K These recipes show how to run tests against Serverless Functions with Tracetest. - [Testing Vercel Functions with OpenTelemetry](/examples-tutorials/recipes/testing-vercel-functions-with-opentelemetry-tracetest) +- [Testing AWS Lambda Functions (Serverless Framework) with OpenTelemetry and Tracetest](/examples-tutorials/recipes/testing-lambda-functions-with-opentelemetry-tracetest) - [Testing Cloudflare Workers with OpenTelemetry](/examples-tutorials/recipes/testing-cloudflare-workers-with-opentelemetry-tracetest) ## Trace Data Stores @@ -96,8 +97,6 @@ This integration point uses the OpenTelemetry Collector as a router to send trac - [Sending traces to Sumo Logic from a Node.js app and fetching them from Sumo Logic with Tracetest](/examples-tutorials/recipes/running-tracetest-with-sumologic) - - ## CI/CD Automation These guides show integrations with CI/CD tools. diff --git a/docs/docs/examples-tutorials/recipes/testing-lambda-functions-with-opentelemetry-tracetest.mdx b/docs/docs/examples-tutorials/recipes/testing-lambda-functions-with-opentelemetry-tracetest.mdx new file mode 100644 index 0000000000..0041696883 --- /dev/null +++ b/docs/docs/examples-tutorials/recipes/testing-lambda-functions-with-opentelemetry-tracetest.mdx @@ -0,0 +1,286 @@ +--- +id: testing-lambda-functions-with-opentelemetry-tracetest +title: Testing AWS Lambda Functions (Serverless Framework) with OpenTelemetry and Tracetest +description: Quickstart on how to configure AWS Lambda functions with OpenTelemetry and Tracetest for enhancing your integration tests with trace-based testing. +hide_table_of_contents: false +keywords: + - tracetest + - trace-based testing + - observability + - distributed tracing + - testing + - end to end testing + - end-to-end testing + - integration testing + - lambda + - aws +image: https://res.cloudinary.com/djwdcmwdz/image/upload/v1698686403/docs/Blog_Thumbnail_14_rsvkmo.jpg +--- + +:::note +[Check out the source code on GitHub here.](https://github.com/kubeshop/tracetest/tree/main/examples/quick-start-serverless) +::: + +[Tracetest](https://tracetest.io/) is a testing tool based on [OpenTelemetry](https://opentelemetry.io/) that allows you to test your distributed application. It allows you to use data from distributed traces generated by OpenTelemetry to validate and assert if your application has the desired behavior defined by your test definitions. + +[AWS Lambda](https://aws.amazon.com/lambda/) is a serverless, event-driven compute service that lets you run code for virtually any type of application or backend service without provisioning or managing servers. You can trigger Lambda from over 200 AWS services and software as a service (SaaS) applications, and only pay for what you use. + +[The Serverless Framework](https://www.serverless.com/) is an open-source framework designed to help developers build and deploy serverless applications more efficiently. It abstracts away the underlying infrastructure management tasks, allowing developers to focus solely on writing code and defining the functions that comprise their applications. + +## Why is this important? + +Testing Serverless Functions has been a pain point for years. Not having visibility into the infrastructure and not knowing where a test fails causes the MTTR to be higher than for other tools. Including OpenTelemetry in AWS Lambda functions exposes telemetry that you can use for both production visibility and trace-based testing. + +This sample shows how to run integration tests against AWS Lambda Functions with the help of the Serverless Framework to manage resources, and using [OpenTelemetry](https://opentelemetry.io/) and Tracetest. + +The AWS Lambda function will fetch data from an external API, transform the data, and insert it into an AWS DynamoDB table. This particular flow has two failure points that are difficult to test. + +1. Validating that an external API request from an AWS Lambda function is successful. +2. Validating that the DynamoDB put request is successful. + +## Prerequisites + +**Tracetest Account**: + +- Copy the `.env.template` file to `.env`. +- Log into **the** [Tracetest app](https://app.tracetest.io/). +- This example is configured to use the OpenTelemetry Collector. Ensure the environment you will be utilizing to run this example is also configured to use the OpenTelemetry Tracing Backend by clicking on Settings, Tracing Backend, OpenTelemetry, and Save. +- Configure your environment to use [the cloud agent](https://docs.tracetest.io/concepts/cloud-agent), click the Click the Settings link and from the Agent tab select the "Run Agent in tracetest cloud" option. +- Fill out the [token](https://docs.tracetest.io/concepts/environment-tokens) and [agent url](https://docs.tracetest.io/concepts/cloud-agent) details by editing your .env file. You can find these values in the Settings area for your environment. +- Have your [AWS Account](https://aws.amazon.com/) with the [AWS CLI](https://aws.amazon.com/cli/) installed and configured. + +**AWS Lambda Functions Example:** + +Clone the [Tracetest GitHub Repo](https://github.com/kubeshop/tracetest) to your local machine, and open the Serverless quick start example app. + +```bash title=Terminal +git clone https://github.com/kubeshop/tracetest.git +cd tracetest/examples/quick-start-serverless +``` + +Before moving forward, run `npm i` in the root folder to install the dependencies. + +```bash title=Terminal +npm i +``` + +## Project Structure + +This is a [Serverless Framework](https://www.serverless.com/) project bootstrapped with [`serverless`](https://www.npmjs.com/package/serverless#quick-start). + +### 1. AWS Lambda Function + +The AWS Lambda Function code can be found in `src/` alongside the [OpenTelemetry wrapper configured as explained in the OpenTelemetry docs](https://opentelemetry.io/docs/languages/js/serverless/). + +### 2. Tracetest + +The `tracetest.ts` file contains the script that will execute the trace-based tests based on the serverless deployment. + +## AWS Lambda Function + +The AWS Lambda is a simple API, [contained in the `src/handler.ts` file](https://github.com/kubeshop/tracetest/blob/main/examples/quick-start-serverless/src/handler.ts). + +```typescript title=src/handler.ts +import { APIGatewayEvent, Handler } from "aws-lambda"; +import fetch from "node-fetch"; +import { Pokemon, RawPokemon } from "./types"; +import DynamoDb from "./dynamodb"; + +const Pokemon = (raw: RawPokemon): Pokemon => ({ + id: raw.id, + name: raw.name, + types: raw.types.map((type) => type.type.name), + imageUrl: raw.sprites.front_default, +}); + +const getPokemon = async (id: string): Promise => { + const url = `https://pokeapi.co/api/v2/pokemon/${id}`; + const res = await fetch(url); + + const raw = await res.json(); + + return Pokemon(raw); +}; + +const insertPokemon = async (pokemon: Pokemon) => { + await DynamoDb.put(pokemon); + + return DynamoDb.get(pokemon.id); +}; + +type TBody = { id: string }; + +export const importPokemon: Handler = async (event) => { + console.log(event); + + const { id = "" } = JSON.parse(event.body || "") as TBody; + + try { + const pokemon = await getPokemon(id); + const result = await insertPokemon(pokemon); + + return { + statusCode: 200, + body: JSON.stringify(result), + }; + } catch (error) { + return { + statusCode: 400, + body: error.message, + }; + } +}; +``` + +The OpenTelemetry tracing is [contained in the `src/lambda-wrapper.ts` file](https://github.com/kubeshop/tracetest/blob/main/examples/quick-start-serverless/src/lambda-wrapper.ts). Traces will be sent to the Tracetest Cloud Agent. + +```typescript title=src/lambda-wrapper.ts +const api = require("@opentelemetry/api"); +const { BatchSpanProcessor } = require("@opentelemetry/sdk-trace-base"); +const { OTLPTraceExporter } = require("@opentelemetry/exporter-trace-otlp-grpc"); +const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node"); +const { registerInstrumentations } = require("@opentelemetry/instrumentation"); +const { getNodeAutoInstrumentations } = require("@opentelemetry/auto-instrumentations-node"); + +api.diag.setLogger(new api.DiagConsoleLogger(), api.DiagLogLevel.ALL); + +const { COLLECTOR_ENDPOINT = "" } = process.env; + +const provider = new NodeTracerProvider(); + +const spanProcessor = new BatchSpanProcessor( + new OTLPTraceExporter({ + url: COLLECTOR_ENDPOINT, + }) +); + +provider.addSpanProcessor(spanProcessor); +provider.register(); + +registerInstrumentations({ + instrumentations: [ + getNodeAutoInstrumentations({ + "@opentelemetry/instrumentation-aws-lambda": { + disableAwsContextPropagation: true, + }, + }), + ], +}); +``` + +## Set up Environment Variables + +Copy the `.env.template` and create a `.env` file in the same directory. Add token and Cloud Agent endpoint. + +```txt title=.env +TRACETEST_AGENT_ENDPOINT= +TRACETEST_API_KEY= +``` + +## The Tracetest Script + +The `tracetest.ts` file contains the script that will execute the trace-based tests based on the serverless deployment. + +```typescript title=tracetest.ts +import Tracetest from "@tracetest/client"; +import { TestResource } from "@tracetest/client/dist/modules/openapi-client"; +import { config } from "dotenv"; + +config(); + +const { TRACETEST_API_TOKEN = "", ENDPOINT = "" } = process.env; + +const definition: TestResource = { + type: "Test", + spec: { + id: "ZV1G3v2IR", + name: "Serverless: Import Pokemon", + trigger: { + type: "http", + httpRequest: { + method: "POST", + url: "${var:ENDPOINT}/import", + body: '{"id": "${var:POKEMON_ID}"}\n', + headers: [ + { + key: "Content-Type", + value: "application/json", + }, + ], + }, + }, + specs: [ + { + selector: 'span[tracetest.span.type="database"]', + name: "All Database Spans: Processing time is less than 100ms", + assertions: ["attr:tracetest.span.duration < 100ms"], + }, + { + selector: 'span[tracetest.span.type="http"]', + name: "All HTTP Spans: Status code is 200", + assertions: ["attr:http.status_code = 200"], + }, + { + selector: + 'span[name="tracetest-serverless-dev-api"] span[tracetest.span.type="http" name="GET" http.method="GET"]', + name: "The request matches the pokemon Id", + assertions: ['attr:http.url = "https://pokeapi.co/api/v2/pokemon/${var:POKEMON_ID}"'], + }, + ], + }, +}; + +const main = async () => { + const tracetest = await Tracetest(TRACETEST_API_TOKEN); + + const test = await tracetest.newTest(definition); + await tracetest.runTest(test, { + variables: [ + { + key: "ENDPOINT", + value: ENDPOINT.trim(), + }, + { + key: "POKEMON_ID", + value: `${Math.floor(Math.random() * 100) + 1}`, + }, + ], + }); + console.log(await tracetest.getSummary()); +}; + +main(); +``` + +The output from the `tracetest.ts` script will show the test results with links to the Tracetest App. + +```bash title=Terminal +> tracetest-serverless@1.0.0 test +> ENDPOINT="$(serverless info --verbose | grep HttpApiUrl | sed s/HttpApiUrl\:\ //g)" ts-node tracetest.ts + + +Successful: 1 +Failed: 0 + +[✔️ Serverless: Import Pokemon] #21 - https://app.tracetest.io/organizations/ttorg_ced62e34638d965e/environments/ttenv_a613d93805243f83/test/ZV1G3v2IR/run/21 +``` + +### Tracetest App Results + +![Tracetest App Results](../img/serverless-results.png) + +To run the tests without deploying the serverless stack, you can use the `npm test` command. + +### Running the example + +Spin up the deployment and test execution. + +```bash title=Terminal +npm start +``` + +This will trigger the serverless deploy command and immediately run the [trace-based tests using the Tracetest Typescript integration](../../tools-and-integrations/typescript.mdx) after completion. + +## Learn More + +Feel free to check out our [examples in GitHub](https://github.com/kubeshop/tracetest/tree/main/examples) and join our [Slack Community](https://dub.sh/tracetest-community) for more info! diff --git a/docs/docs/examples-tutorials/recipes/testing-vercel-functions-with-opentelemetry-tracetest.mdx b/docs/docs/examples-tutorials/recipes/testing-vercel-functions-with-opentelemetry-tracetest.mdx index 76ddcb89a1..fe81709f21 100644 --- a/docs/docs/examples-tutorials/recipes/testing-vercel-functions-with-opentelemetry-tracetest.mdx +++ b/docs/docs/examples-tutorials/recipes/testing-vercel-functions-with-opentelemetry-tracetest.mdx @@ -48,7 +48,7 @@ The Vercel function will fetch data from an external API, transform the data and **Vercel Functions Example:** -Clone the [Tracetest GitHub Repo](https://github.com/kubeshop/pokeshop) to your local machine, and open the Vercel example app. +Clone the [Tracetest GitHub Repo](https://github.com/kubeshop/tracetest) to your local machine, and open the Vercel example app. ```bash git clone https://github.com/kubeshop/tracetest.git diff --git a/docs/sidebars.js b/docs/sidebars.js index 4ad961b64c..317d8be3ef 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -146,6 +146,11 @@ const sidebars = { id: "examples-tutorials/recipes/testing-vercel-functions-with-opentelemetry-tracetest", label: "Testing Vercel Functions", }, + { + type: "doc", + id: "examples-tutorials/recipes/testing-lambda-functions-with-opentelemetry-tracetest", + label: "Testing AWS Lambda Functions", + }, { type: "doc", id: "examples-tutorials/recipes/testing-cloudflare-workers-with-opentelemetry-tracetest", diff --git a/examples/quick-start-serverless/.env.template b/examples/quick-start-serverless/.env.template new file mode 100644 index 0000000000..5786e49065 --- /dev/null +++ b/examples/quick-start-serverless/.env.template @@ -0,0 +1,2 @@ +TRACETEST_AGENT_ENDPOINT= +TRACETEST_API_KEY= \ No newline at end of file diff --git a/examples/quick-start-serverless/.gitignore b/examples/quick-start-serverless/.gitignore new file mode 100644 index 0000000000..bbf4f8ce5f --- /dev/null +++ b/examples/quick-start-serverless/.gitignore @@ -0,0 +1,7 @@ +# package directories +node_modules +jspm_packages + +# Serverless directories +.serverless +.env \ No newline at end of file diff --git a/examples/quick-start-serverless/.prettierrc b/examples/quick-start-serverless/.prettierrc new file mode 100644 index 0000000000..544138be45 --- /dev/null +++ b/examples/quick-start-serverless/.prettierrc @@ -0,0 +1,3 @@ +{ + "singleQuote": true +} diff --git a/examples/quick-start-serverless/README.md b/examples/quick-start-serverless/README.md new file mode 100644 index 0000000000..8f4661cb16 --- /dev/null +++ b/examples/quick-start-serverless/README.md @@ -0,0 +1,11 @@ +# Testing AWS Lambda Functions (Serverless Framework) with OpenTelemetry and Tracetest + +This is a project bootstrapped with [Serverless Framework](https://www.serverless.com/). + +## Quick Start + +[Read the full quick-start recipe in the documentation, here.](https://docs.tracetest.io/examples-tutorials/recipes/testing-lambda-functions-with-opentelemetry-tracetest) + +## Learn more + +Feel free to check out the [docs](https://docs.tracetest.io/), and join our [Slack Community](https://dub.sh/tracetest-community) for more info! diff --git a/examples/quick-start-serverless/package-lock.json b/examples/quick-start-serverless/package-lock.json new file mode 100644 index 0000000000..69597ded59 --- /dev/null +++ b/examples/quick-start-serverless/package-lock.json @@ -0,0 +1,8955 @@ +{ + "name": "tracetest-serverless", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "tracetest-serverless", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@aws-sdk/client-dynamodb": "^3.509.0", + "@aws-sdk/lib-dynamodb": "^3.509.0", + "@opentelemetry/api": "^1.7.0", + "@opentelemetry/auto-instrumentations-node": "^0.41.1", + "@opentelemetry/exporter-trace-otlp-grpc": "^0.48.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.48.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation-fetch": "^0.48.0", + "@opentelemetry/sdk-trace-base": "^1.21.0", + "@opentelemetry/sdk-trace-node": "^1.21.0", + "@tracetest/client": "^0.0.27", + "@types/aws-lambda": "^8.10.133", + "@types/node": "^20.11.17", + "dotenv": "^16.4.1", + "node-fetch": "^2.7.0" + }, + "devDependencies": { + "serverless-plugin-typescript": "^2.1.5", + "ts-node": "^10.9.2", + "typescript": "^5.3.3" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/client-cloudformation": { + "version": "3.509.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.509.0.tgz", + "integrity": "sha512-zv3JKJvV8804cSLD6ema0y+bU3EGKuhE+renCF77GuaukLIxxpYCfU8+DPfVRXraGthhgyI1kzf7v4PfTkFYdQ==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.507.0", + "@aws-sdk/core": "3.496.0", + "@aws-sdk/credential-provider-node": "3.509.0", + "@aws-sdk/middleware-host-header": "3.502.0", + "@aws-sdk/middleware-logger": "3.502.0", + "@aws-sdk/middleware-recursion-detection": "3.502.0", + "@aws-sdk/middleware-signing": "3.502.0", + "@aws-sdk/middleware-user-agent": "3.502.0", + "@aws-sdk/region-config-resolver": "3.502.0", + "@aws-sdk/types": "3.502.0", + "@aws-sdk/util-endpoints": "3.502.0", + "@aws-sdk/util-user-agent-browser": "3.502.0", + "@aws-sdk/util-user-agent-node": "3.502.0", + "@smithy/config-resolver": "^2.1.1", + "@smithy/core": "^1.3.1", + "@smithy/fetch-http-handler": "^2.4.1", + "@smithy/hash-node": "^2.1.1", + "@smithy/invalid-dependency": "^2.1.1", + "@smithy/middleware-content-length": "^2.1.1", + "@smithy/middleware-endpoint": "^2.4.1", + "@smithy/middleware-retry": "^2.1.1", + "@smithy/middleware-serde": "^2.1.1", + "@smithy/middleware-stack": "^2.1.1", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/node-http-handler": "^2.3.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/url-parser": "^2.1.1", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-body-length-browser": "^2.1.1", + "@smithy/util-body-length-node": "^2.2.1", + "@smithy/util-defaults-mode-browser": "^2.1.1", + "@smithy/util-defaults-mode-node": "^2.1.1", + "@smithy/util-endpoints": "^1.1.1", + "@smithy/util-retry": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", + "@smithy/util-waiter": "^2.1.1", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cloudformation/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@aws-sdk/client-dynamodb": { + "version": "3.509.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.509.0.tgz", + "integrity": "sha512-9mAG7laBHpP/jFJLcNrjv/lebsYH3fTUM83rpmdeqw8nfQHAlD/xTHEJDPc5iZeD/rQl8/KENpqTvhKfOkcC/A==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.507.0", + "@aws-sdk/core": "3.496.0", + "@aws-sdk/credential-provider-node": "3.509.0", + "@aws-sdk/middleware-endpoint-discovery": "3.502.0", + "@aws-sdk/middleware-host-header": "3.502.0", + "@aws-sdk/middleware-logger": "3.502.0", + "@aws-sdk/middleware-recursion-detection": "3.502.0", + "@aws-sdk/middleware-user-agent": "3.502.0", + "@aws-sdk/region-config-resolver": "3.502.0", + "@aws-sdk/types": "3.502.0", + "@aws-sdk/util-endpoints": "3.502.0", + "@aws-sdk/util-user-agent-browser": "3.502.0", + "@aws-sdk/util-user-agent-node": "3.502.0", + "@smithy/config-resolver": "^2.1.1", + "@smithy/core": "^1.3.1", + "@smithy/fetch-http-handler": "^2.4.1", + "@smithy/hash-node": "^2.1.1", + "@smithy/invalid-dependency": "^2.1.1", + "@smithy/middleware-content-length": "^2.1.1", + "@smithy/middleware-endpoint": "^2.4.1", + "@smithy/middleware-retry": "^2.1.1", + "@smithy/middleware-serde": "^2.1.1", + "@smithy/middleware-stack": "^2.1.1", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/node-http-handler": "^2.3.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/url-parser": "^2.1.1", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-body-length-browser": "^2.1.1", + "@smithy/util-body-length-node": "^2.2.1", + "@smithy/util-defaults-mode-browser": "^2.1.1", + "@smithy/util-defaults-mode-node": "^2.1.1", + "@smithy/util-endpoints": "^1.1.1", + "@smithy/util-middleware": "^2.1.1", + "@smithy/util-retry": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", + "@smithy/util-waiter": "^2.1.1", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-dynamodb/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.507.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.507.0.tgz", + "integrity": "sha512-pFeaKwqv4tXD6QVxWC2V4N62DUoP3bPSm/mCe2SPhaNjNsmwwA53viUHz/nwxIbs8w4vV44UQsygb0AgKm+HoQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.496.0", + "@aws-sdk/middleware-host-header": "3.502.0", + "@aws-sdk/middleware-logger": "3.502.0", + "@aws-sdk/middleware-recursion-detection": "3.502.0", + "@aws-sdk/middleware-user-agent": "3.502.0", + "@aws-sdk/region-config-resolver": "3.502.0", + "@aws-sdk/types": "3.502.0", + "@aws-sdk/util-endpoints": "3.502.0", + "@aws-sdk/util-user-agent-browser": "3.502.0", + "@aws-sdk/util-user-agent-node": "3.502.0", + "@smithy/config-resolver": "^2.1.1", + "@smithy/core": "^1.3.1", + "@smithy/fetch-http-handler": "^2.4.1", + "@smithy/hash-node": "^2.1.1", + "@smithy/invalid-dependency": "^2.1.1", + "@smithy/middleware-content-length": "^2.1.1", + "@smithy/middleware-endpoint": "^2.4.1", + "@smithy/middleware-retry": "^2.1.1", + "@smithy/middleware-serde": "^2.1.1", + "@smithy/middleware-stack": "^2.1.1", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/node-http-handler": "^2.3.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/url-parser": "^2.1.1", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-body-length-browser": "^2.1.1", + "@smithy/util-body-length-node": "^2.2.1", + "@smithy/util-defaults-mode-browser": "^2.1.1", + "@smithy/util-defaults-mode-node": "^2.1.1", + "@smithy/util-endpoints": "^1.1.1", + "@smithy/util-retry": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.507.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.507.0.tgz", + "integrity": "sha512-ms5CH2ImhqqCIbo5irxayByuPOlVAmSiqDVfjZKwgIziqng2bVgNZMeKcT6t0bmrcgScEAVnZwY7j/iZTIw73g==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.507.0", + "@aws-sdk/core": "3.496.0", + "@aws-sdk/middleware-host-header": "3.502.0", + "@aws-sdk/middleware-logger": "3.502.0", + "@aws-sdk/middleware-recursion-detection": "3.502.0", + "@aws-sdk/middleware-signing": "3.502.0", + "@aws-sdk/middleware-user-agent": "3.502.0", + "@aws-sdk/region-config-resolver": "3.502.0", + "@aws-sdk/types": "3.502.0", + "@aws-sdk/util-endpoints": "3.502.0", + "@aws-sdk/util-user-agent-browser": "3.502.0", + "@aws-sdk/util-user-agent-node": "3.502.0", + "@smithy/config-resolver": "^2.1.1", + "@smithy/core": "^1.3.1", + "@smithy/fetch-http-handler": "^2.4.1", + "@smithy/hash-node": "^2.1.1", + "@smithy/invalid-dependency": "^2.1.1", + "@smithy/middleware-content-length": "^2.1.1", + "@smithy/middleware-endpoint": "^2.4.1", + "@smithy/middleware-retry": "^2.1.1", + "@smithy/middleware-serde": "^2.1.1", + "@smithy/middleware-stack": "^2.1.1", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/node-http-handler": "^2.3.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/url-parser": "^2.1.1", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-body-length-browser": "^2.1.1", + "@smithy/util-body-length-node": "^2.2.1", + "@smithy/util-defaults-mode-browser": "^2.1.1", + "@smithy/util-defaults-mode-node": "^2.1.1", + "@smithy/util-endpoints": "^1.1.1", + "@smithy/util-retry": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/credential-provider-node": "^3.507.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.507.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.507.0.tgz", + "integrity": "sha512-TOWBe0ApEh32QOib0R+irWGjd1F9wnhbGV5PcB9SakyRwvqwG5MKOfYxG7ocoDqLlaRwzZMidcy/PV8/OEVNKg==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.496.0", + "@aws-sdk/middleware-host-header": "3.502.0", + "@aws-sdk/middleware-logger": "3.502.0", + "@aws-sdk/middleware-recursion-detection": "3.502.0", + "@aws-sdk/middleware-user-agent": "3.502.0", + "@aws-sdk/region-config-resolver": "3.502.0", + "@aws-sdk/types": "3.502.0", + "@aws-sdk/util-endpoints": "3.502.0", + "@aws-sdk/util-user-agent-browser": "3.502.0", + "@aws-sdk/util-user-agent-node": "3.502.0", + "@smithy/config-resolver": "^2.1.1", + "@smithy/core": "^1.3.1", + "@smithy/fetch-http-handler": "^2.4.1", + "@smithy/hash-node": "^2.1.1", + "@smithy/invalid-dependency": "^2.1.1", + "@smithy/middleware-content-length": "^2.1.1", + "@smithy/middleware-endpoint": "^2.4.1", + "@smithy/middleware-retry": "^2.1.1", + "@smithy/middleware-serde": "^2.1.1", + "@smithy/middleware-stack": "^2.1.1", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/node-http-handler": "^2.3.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/url-parser": "^2.1.1", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-body-length-browser": "^2.1.1", + "@smithy/util-body-length-node": "^2.2.1", + "@smithy/util-defaults-mode-browser": "^2.1.1", + "@smithy/util-defaults-mode-node": "^2.1.1", + "@smithy/util-endpoints": "^1.1.1", + "@smithy/util-middleware": "^2.1.1", + "@smithy/util-retry": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/credential-provider-node": "^3.507.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.496.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.496.0.tgz", + "integrity": "sha512-yT+ug7Cw/3eJi7x2es0+46x12+cIJm5Xv+GPWsrTFD1TKgqO/VPEgfDtHFagDNbFmjNQA65Ygc/kEdIX9ICX/A==", + "dependencies": { + "@smithy/core": "^1.3.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/signature-v4": "^2.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.502.0.tgz", + "integrity": "sha512-KIB8Ae1Z7domMU/jU4KiIgK4tmYgvuXlhR54ehwlVHxnEoFPoPuGHFZU7oFn79jhhSLUFQ1lRYMxP0cEwb7XeQ==", + "dependencies": { + "@aws-sdk/types": "3.502.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.503.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.503.1.tgz", + "integrity": "sha512-rTdlFFGoPPFMF2YjtlfRuSgKI+XsF49u7d98255hySwhsbwd3Xp+utTTPquxP+CwDxMHbDlI7NxDzFiFdsoZug==", + "dependencies": { + "@aws-sdk/types": "3.502.0", + "@smithy/fetch-http-handler": "^2.4.1", + "@smithy/node-http-handler": "^2.3.1", + "@smithy/property-provider": "^2.1.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/util-stream": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.507.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.507.0.tgz", + "integrity": "sha512-2CnyduoR9COgd7qH1LPYK8UggGqVs8R4ASDMB5bwGxbg9ZerlStDiHpqvJNNg1k+VlejBr++utxfmHd236XgmQ==", + "dependencies": { + "@aws-sdk/client-sts": "3.507.0", + "@aws-sdk/credential-provider-env": "3.502.0", + "@aws-sdk/credential-provider-process": "3.502.0", + "@aws-sdk/credential-provider-sso": "3.507.0", + "@aws-sdk/credential-provider-web-identity": "3.507.0", + "@aws-sdk/types": "3.502.0", + "@smithy/credential-provider-imds": "^2.2.1", + "@smithy/property-provider": "^2.1.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.509.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.509.0.tgz", + "integrity": "sha512-uXT8wIq1k+m0mS/pC9U1cUTIjUB7/4PgxyiYsTxYPIULtWnQXltAlcPU3QzKTJMP60sqftRYZ2jFDLAVsipQxw==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.502.0", + "@aws-sdk/credential-provider-http": "3.503.1", + "@aws-sdk/credential-provider-ini": "3.507.0", + "@aws-sdk/credential-provider-process": "3.502.0", + "@aws-sdk/credential-provider-sso": "3.507.0", + "@aws-sdk/credential-provider-web-identity": "3.507.0", + "@aws-sdk/types": "3.502.0", + "@smithy/credential-provider-imds": "^2.2.1", + "@smithy/property-provider": "^2.1.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.502.0.tgz", + "integrity": "sha512-fJJowOjQ4infYQX0E1J3xFVlmuwEYJAFk0Mo1qwafWmEthsBJs+6BR2RiWDELHKrSK35u4Pf3fu3RkYuCtmQFw==", + "dependencies": { + "@aws-sdk/types": "3.502.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.507.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.507.0.tgz", + "integrity": "sha512-6WBjou52QukFpDi4ezb19bcAx/bM8ge8qnJnRT02WVRmU6zFQ5yLD2fW1MFsbX3cwbey+wSqKd5FGE1Hukd5wQ==", + "dependencies": { + "@aws-sdk/client-sso": "3.507.0", + "@aws-sdk/token-providers": "3.507.0", + "@aws-sdk/types": "3.502.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.507.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.507.0.tgz", + "integrity": "sha512-f+aGMfazBimX7S06224JRYzGTaMh1uIhfj23tZylPJ05KxTVi5IO1RoqeI/uHLJ+bDOx+JHBC04g/oCdO4kHvw==", + "dependencies": { + "@aws-sdk/client-sts": "3.507.0", + "@aws-sdk/types": "3.502.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/endpoint-cache": { + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.495.0.tgz", + "integrity": "sha512-XCDrpiS50WaPzPzp7FwsChPHtX9PQQUU4nRzcn2N7IkUtpcFCUx8m1PAZe086VQr6hrbdeE4Z4j8hUPNwVdJGQ==", + "dependencies": { + "mnemonist": "0.38.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/lib-dynamodb": { + "version": "3.509.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.509.0.tgz", + "integrity": "sha512-jKcQQ7qBWllD4QNY0VNm5vanCs1yWTD8QA6sSWQQUHl2TpUOyklV9ghCGhtQXbb0ppH0az0oVrFaz0z7+whlWQ==", + "dependencies": { + "@aws-sdk/util-dynamodb": "3.509.0", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-dynamodb": "^3.0.0" + } + }, + "node_modules/@aws-sdk/middleware-endpoint-discovery": { + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.502.0.tgz", + "integrity": "sha512-DQBbyelebBshYPTb5ah25sAdMTQKYBUYE0If66sXHNUQAdUg28z076kE4E8p8RxyfGHqESN2MrqfIjQpEnjcqg==", + "dependencies": { + "@aws-sdk/endpoint-cache": "3.495.0", + "@aws-sdk/types": "3.502.0", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.502.0.tgz", + "integrity": "sha512-EjnG0GTYXT/wJBmm5/mTjDcAkzU8L7wQjOzd3FTXuTCNNyvAvwrszbOj5FlarEw5XJBbQiZtBs+I5u9+zy560w==", + "dependencies": { + "@aws-sdk/types": "3.502.0", + "@smithy/protocol-http": "^3.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.502.0.tgz", + "integrity": "sha512-FDyv6K4nCoHxbjLGS2H8ex8I0KDIiu4FJgVRPs140ZJy6gE5Pwxzv6YTzZGLMrnqcIs9gh065Lf6DjwMelZqaw==", + "dependencies": { + "@aws-sdk/types": "3.502.0", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.502.0.tgz", + "integrity": "sha512-hvbyGJbxeuezxOu8VfFmcV4ql1hKXLxHTe5FNYfEBat2KaZXVhc1Hg+4TvB06/53p+E8J99Afmumkqbxs2esUA==", + "dependencies": { + "@aws-sdk/types": "3.502.0", + "@smithy/protocol-http": "^3.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.502.0.tgz", + "integrity": "sha512-4hF08vSzJ7L6sB+393gOFj3s2N6nLusYS0XrMW6wYNFU10IDdbf8Z3TZ7gysDJJHEGQPmTAesPEDBsasGWcMxg==", + "dependencies": { + "@aws-sdk/types": "3.502.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/signature-v4": "^2.1.1", + "@smithy/types": "^2.9.1", + "@smithy/util-middleware": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.502.0.tgz", + "integrity": "sha512-TxbBZbRiXPH0AUxegqiNd9aM9zNSbfjtBs5MEfcBsweeT/B2O7K1EjP9+CkB8Xmk/5FLKhAKLr19b1TNoE27rw==", + "dependencies": { + "@aws-sdk/types": "3.502.0", + "@aws-sdk/util-endpoints": "3.502.0", + "@smithy/protocol-http": "^3.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.502.0.tgz", + "integrity": "sha512-mxmsX2AGgnSM+Sah7mcQCIneOsJQNiLX0COwEttuf8eO+6cLMAZvVudH3BnWTfea4/A9nuri9DLCqBvEmPrilg==", + "dependencies": { + "@aws-sdk/types": "3.502.0", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/types": "^2.9.1", + "@smithy/util-config-provider": "^2.2.1", + "@smithy/util-middleware": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.507.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.507.0.tgz", + "integrity": "sha512-ehOINGjoGJc6Puzon7ev4bXckkaZx18WNgMTNttYJhj3vTpj5LPSQbI/5SS927bEbpGMFz1+hJ6Ra5WGfbTcEQ==", + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.507.0", + "@aws-sdk/types": "3.502.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.502.0.tgz", + "integrity": "sha512-M0DSPYe/gXhwD2QHgoukaZv5oDxhW3FfvYIrJptyqUq3OnPJBcDbihHjrE0PBtfh/9kgMZT60/fQ2NVFANfa2g==", + "dependencies": { + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-dynamodb": { + "version": "3.509.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.509.0.tgz", + "integrity": "sha512-wvlcYicawWCwvklfpTJrLn+S2oTfpOG4Q/uWvQJgv3Z3SVr5Yp3OjUvMKCRUGVu1r+thedvx6LZWecoGXfQivA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-dynamodb": "^3.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.502.0.tgz", + "integrity": "sha512-6LKFlJPp2J24r1Kpfoz5ESQn+1v5fEjDB3mtUKRdpwarhm3syu7HbKlHCF3KbcCOyahobvLvhoedT78rJFEeeg==", + "dependencies": { + "@aws-sdk/types": "3.502.0", + "@smithy/types": "^2.9.1", + "@smithy/util-endpoints": "^1.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.495.0.tgz", + "integrity": "sha512-MfaPXT0kLX2tQaR90saBT9fWQq2DHqSSJRzW+MZWsmF+y5LGCOhO22ac/2o6TKSQm7h0HRc2GaADqYYYor62yg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.502.0.tgz", + "integrity": "sha512-v8gKyCs2obXoIkLETAeEQ3AM+QmhHhst9xbM1cJtKUGsRlVIak/XyyD+kVE6kmMm1cjfudHpHKABWk9apQcIZQ==", + "dependencies": { + "@aws-sdk/types": "3.502.0", + "@smithy/types": "^2.9.1", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.502.0.tgz", + "integrity": "sha512-9RjxpkGZKbTdl96tIJvAo+vZoz4P/cQh36SBUt9xfRfW0BtsaLyvSrvlR5wyUYhvRcC12Axqh/8JtnAPq//+Vw==", + "dependencies": { + "@aws-sdk/types": "3.502.0", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.0.tgz", + "integrity": "sha512-tx+eoEsqkMkLCHR4OOplwNIaJ7SVZWzeVKzEMBz8VR+TbssgBYOP4a0P+KQiQ6LaTG4SGaIEu7YTS8xOmkOWLA==", + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@hapi/b64": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", + "integrity": "sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw==", + "dependencies": { + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/boom": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", + "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", + "dependencies": { + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/bourne": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.1.0.tgz", + "integrity": "sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q==" + }, + "node_modules/@hapi/cryptiles": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-5.1.0.tgz", + "integrity": "sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA==", + "dependencies": { + "@hapi/boom": "9.x.x" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/iron": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-6.0.0.tgz", + "integrity": "sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw==", + "dependencies": { + "@hapi/b64": "5.x.x", + "@hapi/boom": "9.x.x", + "@hapi/bourne": "2.x.x", + "@hapi/cryptiles": "5.x.x", + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/podium": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-4.1.3.tgz", + "integrity": "sha512-ljsKGQzLkFqnQxE7qeanvgGj4dejnciErYd30dbrYzUOF/FyS/DOF97qcrT3bhoVwCYmxa6PEMhxfCPlnUcD2g==", + "dependencies": { + "@hapi/hoek": "9.x.x", + "@hapi/teamwork": "5.x.x", + "@hapi/validate": "1.x.x" + } + }, + "node_modules/@hapi/teamwork": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@hapi/teamwork/-/teamwork-5.1.1.tgz", + "integrity": "sha512-1oPx9AE5TIv+V6Ih54RP9lTZBso3rP8j4Xhb6iSVwPXtAM+sDopl5TFMv5Paw73UnpZJ9gjcrTE1BXrWt9eQrg==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@hapi/validate": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@hapi/validate/-/validate-1.1.3.tgz", + "integrity": "sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA==", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "dev": true, + "peer": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.7.0.tgz", + "integrity": "sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.48.0.tgz", + "integrity": "sha512-1/aMiU4Eqo3Zzpfwu51uXssp5pzvHFObk8S9pKAiXb1ne8pvg1qxBQitYL1XUiAMEXFzgjaidYG2V6624DRhhw==", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node": { + "version": "0.41.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.41.1.tgz", + "integrity": "sha512-gQG0mHlPVBQveuemqNYkrL4IB3T6v2e5sMiDI6FQzFWeLzzFrC04R4fY6AE1YmkhOyteCDpHL/U6CULP2mkt8w==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation-amqplib": "^0.34.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.38.0", + "@opentelemetry/instrumentation-aws-sdk": "^0.38.1", + "@opentelemetry/instrumentation-bunyan": "^0.35.0", + "@opentelemetry/instrumentation-cassandra-driver": "^0.35.0", + "@opentelemetry/instrumentation-connect": "^0.33.0", + "@opentelemetry/instrumentation-cucumber": "^0.3.0", + "@opentelemetry/instrumentation-dataloader": "^0.6.0", + "@opentelemetry/instrumentation-dns": "^0.33.0", + "@opentelemetry/instrumentation-express": "^0.35.0", + "@opentelemetry/instrumentation-fastify": "^0.33.0", + "@opentelemetry/instrumentation-fs": "^0.9.0", + "@opentelemetry/instrumentation-generic-pool": "^0.33.0", + "@opentelemetry/instrumentation-graphql": "^0.37.0", + "@opentelemetry/instrumentation-grpc": "^0.48.0", + "@opentelemetry/instrumentation-hapi": "^0.34.0", + "@opentelemetry/instrumentation-http": "^0.48.0", + "@opentelemetry/instrumentation-ioredis": "^0.37.0", + "@opentelemetry/instrumentation-knex": "^0.33.0", + "@opentelemetry/instrumentation-koa": "^0.37.0", + "@opentelemetry/instrumentation-lru-memoizer": "^0.34.0", + "@opentelemetry/instrumentation-memcached": "^0.33.0", + "@opentelemetry/instrumentation-mongodb": "^0.39.0", + "@opentelemetry/instrumentation-mongoose": "^0.35.0", + "@opentelemetry/instrumentation-mysql": "^0.35.0", + "@opentelemetry/instrumentation-mysql2": "^0.35.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.34.0", + "@opentelemetry/instrumentation-net": "^0.33.0", + "@opentelemetry/instrumentation-pg": "^0.38.0", + "@opentelemetry/instrumentation-pino": "^0.35.0", + "@opentelemetry/instrumentation-redis": "^0.36.0", + "@opentelemetry/instrumentation-redis-4": "^0.36.0", + "@opentelemetry/instrumentation-restify": "^0.35.0", + "@opentelemetry/instrumentation-router": "^0.34.0", + "@opentelemetry/instrumentation-socket.io": "^0.36.0", + "@opentelemetry/instrumentation-tedious": "^0.7.0", + "@opentelemetry/instrumentation-winston": "^0.34.0", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.28.6", + "@opentelemetry/resource-detector-aws": "^1.3.6", + "@opentelemetry/resource-detector-container": "^0.3.6", + "@opentelemetry/resource-detector-gcp": "^0.29.6", + "@opentelemetry/resources": "^1.12.0", + "@opentelemetry/sdk-node": "^0.48.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.4.1" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.21.0.tgz", + "integrity": "sha512-t0iulGPiMjG/NrSjinPQoIf8ST/o9V0dGOJthfrFporJlNdlKIQPfC7lkrV+5s2dyBThfmSbJlp/4hO1eOcDXA==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.21.0.tgz", + "integrity": "sha512-KP+OIweb3wYoP7qTYL/j5IpOlu52uxBv5M4+QhSmmUfLyTgu1OIS71msK3chFo1D6Y61BIH3wMiMYRCxJCQctA==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.48.0.tgz", + "integrity": "sha512-+qRQXUbdRW6aNRT5yWOG3G6My1VxxKeqgUyLkkdIjkT20lvymjiN2RpBfGMtAf/oqnuRknf9snFl9VSIO2gniw==", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.21.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.48.0", + "@opentelemetry/otlp-transformer": "0.48.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.48.0.tgz", + "integrity": "sha512-QEZKbfWqXrbKVpr2PHd4KyKI0XVOhUYC+p2RPV8s+2K5QzZBE3+F9WlxxrXDfkrvGmpQAZytBoHQQYA3AGOtpw==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/otlp-exporter-base": "0.48.0", + "@opentelemetry/otlp-transformer": "0.48.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.48.0.tgz", + "integrity": "sha512-hVXr/8DYlAKAzQYMsCf3ZsGweS6NTK3IHIEqmLokJZYcvJQBEEazeAdISfrL/utWnapg1Qnpw8u+W6SpxNzmTw==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/otlp-exporter-base": "0.48.0", + "@opentelemetry/otlp-proto-exporter-base": "0.48.0", + "@opentelemetry/otlp-transformer": "0.48.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.21.0.tgz", + "integrity": "sha512-J0ejrOx52s1PqvjNalIHvY/4v9ZxR2r7XS7WZbwK3qpVYZlGVq5V1+iCNweqsKnb/miUt/4TFvJBc9f5Q/kGcA==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.48.0.tgz", + "integrity": "sha512-sjtZQB5PStIdCw5ovVTDGwnmQC+GGYArJNgIcydrDSqUTdYBnMrN9P4pwQZgS3vTGIp+TU1L8vMXGe51NVmIKQ==", + "dependencies": { + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.7.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.34.0.tgz", + "integrity": "sha512-lVGRkyGnjFJv9O8oO/+uT40nrNj4UO+UN0k8708guy/toVgxsVpv4PtdWJTjbtu89UDk9gUxq62jpHxqrVaNnw==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-lambda": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.38.0.tgz", + "integrity": "sha512-MIPvM8S4LqGKE+IAnYVCRUnEjaWbPsbqL4p2BnGcox08e6+JQe+0d16DI0cKVSFZOzV5T/or3ewQ/bB0lPm8yg==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/propagator-aws-xray": "^1.3.1", + "@opentelemetry/resources": "^1.8.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/aws-lambda": "8.10.122" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-lambda/node_modules/@types/aws-lambda": { + "version": "8.10.122", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.122.tgz", + "integrity": "sha512-vBkIh9AY22kVOCEKo5CJlyCgmSWvasC+SWUxL/x/vOwRobMpI/HG1xp/Ae3AqmSiZeLUbOhW0FCD3ZjqqUxmXw==" + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk": { + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.38.1.tgz", + "integrity": "sha512-/Tupb4UfVVkmcopq2H2nr2D/pHLF0riVw2biQQUJ/jGIkfrOgUMMKbShi2RQE4Zy8NFv3xaDn4/pNxzodLBy3w==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/propagation-utils": "^0.30.6", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.35.0.tgz", + "integrity": "sha512-bQ8OzV7nVTA+oGiTzLjUmRFAbnXi0U/Z4VJCpj+1DRsaAaMT17eRpAOh22LQR0JBnv2vBm8CvIQl4CcAnsB46g==", + "dependencies": { + "@opentelemetry/api-logs": "^0.48.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@types/bunyan": "1.8.9" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cassandra-driver": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.35.0.tgz", + "integrity": "sha512-NlJkEiP37/WQvtSyYe4zxaBcaoweO/2+UtDssldk9NFmFutLHyMT/P5q5fe8i73ylmkPOAZnN8P48oHOhZHM1g==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.33.0.tgz", + "integrity": "sha512-EAMmUC2/KfeZl4qNgUsiVqT5Jti0jDl4GHi4TpDg41VBEJkRX/0+JcPBWgdFUgEfeiZr0GPVQud4i8jAwJ+ORw==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/connect": "3.4.36" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cucumber": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.3.0.tgz", + "integrity": "sha512-nM9BL0t2Nxwbb41MXxNXTDL0zq7FXhOX9F3OiAqYUJHqb7BHyzV9KoQ+Ao1BjqJR91hUm1OFNgHAk3y8uiuq4w==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.6.0.tgz", + "integrity": "sha512-jkPdn83WV/TcnhQ5bOIoYcJGvMxXyYlCzbqfuB6HsMqf3CqpdgBQYlMuKi6qIfD4QWYt2R992yglNxPLuJ7xeg==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.33.0.tgz", + "integrity": "sha512-QDJadJOQg9CLqMC79r4T5ugN4C4lb6eJYLmHgnLg3fh1JUGfyjQHtD3T7lH0P8251Mnt5m8zjDDbPKcqK2aGcw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.35.0.tgz", + "integrity": "sha512-ZmSB4WMd88sSecOL7DlghzdBl56/8ymb02n+xEJ/6zUgONuw/1uoTh1TAaNPKfEWdNLoLKXQm+Gd2zBrUVOX0w==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.33.0.tgz", + "integrity": "sha512-sl3q9Mt+yM6GlZJKhfLUIRrVEYqfmI0hqYLha5OFG5rLrgnZCCZVy8ra4+Pa40ecH1409cvwwBPf7k9AHEQBTw==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fetch": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fetch/-/instrumentation-fetch-0.48.0.tgz", + "integrity": "sha512-y4Zw9VeUUMaowg3aXYZXcaUJQ7IKfpR6sjClrAQOJwWG8LYFpM6NIRSoAeJv/ShfxWWCPWC0P4zgXcKRqpURFQ==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/instrumentation": "0.48.0", + "@opentelemetry/sdk-trace-web": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.9.0.tgz", + "integrity": "sha512-Xp31lb2Sj50ppsJ393650HxSi5IJIgddXxrUeVljmsabdmECPUj0YAt/Wwb1oIHFn04iL9Tq4VkF/otlLaI9ww==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.33.0.tgz", + "integrity": "sha512-QMSSOfIqMJhXqFryLVbAMsgRktNHdhMEpsOgEiHurLfvAJhyEOBcTTUuo6Laqt50IIzIm3YuHL9ZtEl9fve2ag==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.37.0.tgz", + "integrity": "sha512-WL5Qn1aRudJDxVN0Ao73/yzXBGBJAH1Fd2tteuGXku/Qw9hYQ936CgoO66GWmSiq2lyjsojAk1t5f+HF9j3NXw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.48.0.tgz", + "integrity": "sha512-MmJHkbqaulqfECjotRtco9AXOq+D1HLq53wI7UFeE8bl8kISP9iMkt+A7PrtPFpRGCglwFvSa0djId6EWsP0DQ==", + "dependencies": { + "@opentelemetry/instrumentation": "0.48.0", + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.34.0.tgz", + "integrity": "sha512-qUENVxwCYbRbJ8HBY54ZL1Z9q1guCEurW6tCFFJJKQFu/MKEw7GSFImy5DR2Mp8b5ggZO36lYFcx0QUxfy4GJg==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/hapi__hapi": "20.0.13" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.48.0.tgz", + "integrity": "sha512-uXqOsLhW9WC3ZlGm6+PSX0xjSDTCfy4CMjfYj6TPWusOO8dtdx040trOriF24y+sZmS3M+5UQc6/3/ZxBJh4Mw==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/instrumentation": "0.48.0", + "@opentelemetry/semantic-conventions": "1.21.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.37.0.tgz", + "integrity": "sha512-xBPfu03IIG8x1pmt1Dx+XrBO4ZB4UjEcrouGbp6eV3dLQ7eJPYZgfNXmsqkpsxgNQuVCi2a3WEAwZ5Wl2hk7Vw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/redis-common": "^0.36.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/ioredis4": "npm:@types/ioredis@^4.28.10" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.33.0.tgz", + "integrity": "sha512-7L3Q8Yy5vY4W4zpRrjKEc0OpVPYyERtDz5dAumKjkJsEVPANr7E8Cc+No6VjZGeN+HgFFwEo+jcQCTWJzdxvRw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.37.0.tgz", + "integrity": "sha512-EfuGv1RJCSZh77dDc3PtvZXGwcsTufn9tU6T9VOTFcxovpyJ6w0og73eD0D02syR8R+kzv6rg1TeS8+lj7pyrQ==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/koa": "2.14.0", + "@types/koa__router": "12.0.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.34.0.tgz", + "integrity": "sha512-m1kXrc11XNj7cC6sfcsYqd+kuCcN2wI9LXpB2l2BZCogqxHCgjuVoiXvT6K9LfO4tLefcvhoK0N8XuVJ8xyyOw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.33.0.tgz", + "integrity": "sha512-TdGT5ytt8o7FTIsQvx010ykYbqu+IfGoOKA+IXLHdX1+l7vFWyv3ZOzQbRDmA4rxujJAAPf/n4/D7QECyedE/g==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/memcached": "^2.2.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.39.0.tgz", + "integrity": "sha512-m9dMj39pcCshzlfCEn2lGrlNo7eV5fb9pGBnPyl/Am9Crh7Or8vOqvByCNd26Dgf5J978zTdLGF+6tM8j1WOew==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/sdk-metrics": "^1.9.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.35.0.tgz", + "integrity": "sha512-gReBMWD2Oa/wBGRWyg6B2dbPHhgkpOqDio31gE3DbC4JaqCsMByyeix75rZSzZ71RQmVh3d4jRLsqUtNVBzcyg==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.35.0.tgz", + "integrity": "sha512-QKRHd3aFA2vKOPzIZ9Q3UIxYeNPweB62HGlX2l3shOKrUhrtTg2/BzaKpHQBy2f2nO2mxTF/mOFeVEDeANnhig==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/mysql": "2.15.22" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.35.0.tgz", + "integrity": "sha512-DI9NXYJBbQ72rjz1KCKerQFQE+Z4xRDoyYek6JpITv5BlhPboA8zKkltxyQLL06Y2RTFYslw1gvg+x9CWlRzJw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@opentelemetry/sql-common": "^0.40.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.34.0.tgz", + "integrity": "sha512-HvbcCVAMZEIFrJ0Si9AfjxOr14KcH5h/lq5zLQ8AjZJpW0WaeO/ox5UgFi3J73Br91WbZHRgbXxMeodNycJJuA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-net": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.33.0.tgz", + "integrity": "sha512-x6awrqF0YfEhGGNE2JtEWvB+zEls7mFvLDii54DnWxpQU69+AqKCW/ZwC91EDefOMGSYBckL0uEn6XNOgkTTbw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.38.0.tgz", + "integrity": "sha512-Q7V/OJ1OZwaWYNOP/E9S6sfS03Z+PNU1SAjdAoXTj5j4u4iJSMSieLRWXFaHwsbefIOMkYvA00EBKF9IgbgbLA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@opentelemetry/sql-common": "^0.40.0", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.4" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.35.0.tgz", + "integrity": "sha512-gMfJ5Qy793mbaAGnQE3yp1Cb0y4np74rBPu20Oy/v8TTgPQOEV5PyNI0GNGggmZQIJSkdtYa8Ndb3huH3iZE5g==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.36.0.tgz", + "integrity": "sha512-rKFylIacEBwLxKFrPvxpVi8hHY9qXfQSybYnYNyF/VxUWMGYDPMpbCnTQkiVR5u+tIhwSvhSDG2YQEq6syHUIQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/redis-common": "^0.36.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.36.0.tgz", + "integrity": "sha512-XO0EV2TxUsaRdcp79blyLGG5JWWl7NWVd/XNbU8vY7CuYUfRhWiTXYoM4PI+lwkAnUPvPtyiOzYs9px23GnibA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/redis-common": "^0.36.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.35.0.tgz", + "integrity": "sha512-0ghtxsGJxHEwJfIzxDN3FCbNiTXqwv2jV6ip716jyjWN3f6MuRHm7NPWI/KNvu+IjqDj16KRGZG7nUAEB1ojog==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-router": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.34.0.tgz", + "integrity": "sha512-7LsonkdnQi35eF7CWl8394QDgyd811gCawJ6QuS8GbWNIvZ3S2f9j+Zy0fWSmFgO28ruW1pUG51ql8xdXWa8TA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-socket.io": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.36.0.tgz", + "integrity": "sha512-c9Zc6WKxTZtMaOj01kmJGLKabEj805YgTav4l9vgojHrf6MH1fTlw+SGvOKhfPfzmu2QhNORAfqPAB1poDwqEQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.7.0.tgz", + "integrity": "sha512-o/5my8ZOuxACPSzMaXdPnQiMpmOPIJoTj+DRcs4vEJxk+KwlVNucoafSMpWQEyTNNuq2JI87Ru6Di2mp5T20EQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/tedious": "^4.0.10" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-winston": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.34.0.tgz", + "integrity": "sha512-Ejssv6Uih7ipoNGYQLXd+cKZdEfTfTJ/vzpUSeYiJZ36mVYER1f8fs9Kb7jTKjHD55g2s6cUJj9lifbDFI4EEw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.48.0.tgz", + "integrity": "sha512-T4LJND+Ugl87GUONoyoQzuV9qCn4BFIPOnCH1biYqdGhc2JahjuLqVD9aefwLzGBW638iLAo88Lh68h2F1FLiA==", + "dependencies": { + "@opentelemetry/core": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.48.0.tgz", + "integrity": "sha512-Vdp56RK9OU+Oeoy3YQC/UMOWglKQ9qvgGr49FgF4r8vk5DlcTUgVS0m3KG8pykmRPA+5ZKaDuqwPw5aTvWmHFw==", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.21.0", + "@opentelemetry/otlp-exporter-base": "0.48.0", + "protobufjs": "^7.2.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-proto-exporter-base": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.48.0.tgz", + "integrity": "sha512-14GSTvPZPfrWsB54fYMGb8v+Uge5xGXyz0r2rf4SzcRnO2hXCPHEuL3yyL50emaKPAY+fj29Dm0bweawe8UA6A==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/otlp-exporter-base": "0.48.0", + "protobufjs": "^7.2.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.48.0.tgz", + "integrity": "sha512-yuoS4cUumaTK/hhxW3JUy3wl2U4keMo01cFDrUOmjloAdSSXvv1zyQ920IIH4lymp5Xd21Dj2/jq2LOro56TJg==", + "dependencies": { + "@opentelemetry/api-logs": "0.48.0", + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-logs": "0.48.0", + "@opentelemetry/sdk-metrics": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/propagation-utils": { + "version": "0.30.6", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.6.tgz", + "integrity": "sha512-qvnYee5I/xrBY5XClUlOASIOdoTbnFGNI6+ViKqdoErF2xKmhysXcmxlJNzQFNDK0muTfjvJMZcFyEielARk7g==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/propagator-aws-xray": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.3.1.tgz", + "integrity": "sha512-6fDMzFlt5r6VWv7MUd0eOpglXPFqykW8CnOuUxJ1VZyLy6mV1bzBlzpsqEmhx1bjvZYvH93vhGkQZqrm95mlrQ==", + "dependencies": { + "@opentelemetry/core": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.21.0.tgz", + "integrity": "sha512-3ZTobj2VDIOzLsIvvYCdpw6tunxUVElPxDvog9lS49YX4hohHeD84A8u9Ns/6UYUcaN5GSoEf891lzhcBFiOLA==", + "dependencies": { + "@opentelemetry/core": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.21.0.tgz", + "integrity": "sha512-8TQSwXjBmaDx7JkxRD7hdmBmRK2RGRgzHX1ArJfJhIc5trzlVweyorzqQrXOvqVEdEg+zxUMHkL5qbGH/HDTPA==", + "dependencies": { + "@opentelemetry/core": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/redis-common": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.1.tgz", + "integrity": "sha512-YjfNEr7DK1Ymc5H0bzhmqVvMcCs+PUEUerzrpTFdHfZxj3HpnnjZTIFKx/gxiL/sajQ8dxycjlreoYTVYKBXlw==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { + "version": "0.28.6", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.28.6.tgz", + "integrity": "sha512-VuJXc+oDQ/SYRHBCQbEshl0WJtEMvgfSkTDBq+WSxj6y9sKe0HCt55Sxeb5nLmBdtCYWMQFniHe2K4GLSjDZVw==", + "dependencies": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-aws": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.3.6.tgz", + "integrity": "sha512-hFJ19yFwChqGCv1uMkXtjZU9BG8GcChe8cRCAkGWg1RZADse5S2ausf3D8pYw1cR3ktJtuAmRrGZniT6TDUPDw==", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-container": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.3.6.tgz", + "integrity": "sha512-psxtzQakVuZKFl/ukn+nPW4Ixn+KPHGsWJMYKndmXrsgdFri78X+MHR0wLOO41Zn79sc35DiSk+GdJ24cCylbg==", + "dependencies": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-gcp": { + "version": "0.29.6", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.6.tgz", + "integrity": "sha512-cx03fXPknmiVW0hpWAJr0Nr8xwkwRB8VNWPvNrmP7UzJ8eEztY9lHnVke4ZVFaVGvm/4EFxk2y5hPNggbIezoA==", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "gcp-metadata": "^6.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.21.0.tgz", + "integrity": "sha512-1Z86FUxPKL6zWVy2LdhueEGl9AHDJcx+bvHStxomruz6Whd02mE3lNUMjVJ+FGRoktx/xYQcxccYb03DiUP6Yw==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.48.0.tgz", + "integrity": "sha512-lRcA5/qkSJuSh4ItWCddhdn/nNbVvnzM+cm9Fg1xpZUeTeozjJDBcHnmeKoOaWRnrGYBdz6UTY6bynZR9aBeAA==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.8.0", + "@opentelemetry/api-logs": ">=0.39.1" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.21.0.tgz", + "integrity": "sha512-on1jTzIHc5DyWhRP+xpf+zrgrREXcHBH4EDAfaB5mIG7TWpKxNXooQ1JCylaPsswZUv4wGnVTinr4HrBdGARAQ==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.48.0.tgz", + "integrity": "sha512-3o3GS6t+VLGVFCV5bqfGOcWIgOdkR/UE6Qz7hHksP5PXrVBeYsPqts7cPma5YXweaI3r3h26mydg9PqQIcqksg==", + "dependencies": { + "@opentelemetry/api-logs": "0.48.0", + "@opentelemetry/core": "1.21.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.48.0", + "@opentelemetry/exporter-trace-otlp-http": "0.48.0", + "@opentelemetry/exporter-trace-otlp-proto": "0.48.0", + "@opentelemetry/exporter-zipkin": "1.21.0", + "@opentelemetry/instrumentation": "0.48.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-logs": "0.48.0", + "@opentelemetry/sdk-metrics": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0", + "@opentelemetry/sdk-trace-node": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.21.0.tgz", + "integrity": "sha512-yrElGX5Fv0umzp8Nxpta/XqU71+jCAyaLk34GmBzNcrW43nqbrqvdPs4gj4MVy/HcTjr6hifCDCYA3rMkajxxA==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.21.0.tgz", + "integrity": "sha512-1pdm8jnqs+LuJ0Bvx6sNL28EhC8Rv7NYV8rnoXq3GIQo7uOHBDAFSj7makAfbakrla7ecO1FRfI8emnR4WvhYA==", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.21.0", + "@opentelemetry/core": "1.21.0", + "@opentelemetry/propagator-b3": "1.21.0", + "@opentelemetry/propagator-jaeger": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-web": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-web/-/sdk-trace-web-1.21.0.tgz", + "integrity": "sha512-MxkmY/UNXkDiZj7JUu5T7wWt8Ai4NJEwSjGoQQ9YLvgLUIivvaIo9Mne+Q+KLOUG2v/uhivz3qzxbCODVa0c1A==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.21.0.tgz", + "integrity": "sha512-lkC8kZYntxVKr7b8xmjCVUgE0a8xgDakPyDo9uSWavXPyYqLgYYGdEd2j8NxihRyb6UwpX3G/hFUF4/9q2V+/g==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.0.tgz", + "integrity": "sha512-vSqRJYUPJVjMFQpYkQS3ruexCPSZJ8esne3LazLwtCPaPRvzZ7WG3tX44RouAn7w4wMp8orKguBqtt+ng2UTnw==", + "dependencies": { + "@opentelemetry/core": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@serverless/dashboard-plugin": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@serverless/dashboard-plugin/-/dashboard-plugin-7.2.0.tgz", + "integrity": "sha512-Gqzgef+KmrX1OxJW9aubrIN6AvPrtDARMv+NegMNEe+pfkZA/IMuZiSyYUaHgARokdw2/IALOysTLgdFJIrXvA==", + "dev": true, + "peer": true, + "dependencies": { + "@aws-sdk/client-cloudformation": "^3.410.0", + "@aws-sdk/client-sts": "^3.410.0", + "@serverless/event-mocks": "^1.1.1", + "@serverless/platform-client": "^4.5.1", + "@serverless/utils": "^6.14.0", + "child-process-ext": "^3.0.1", + "chokidar": "^3.5.3", + "flat": "^5.0.2", + "fs-extra": "^9.1.0", + "js-yaml": "^4.1.0", + "jszip": "^3.10.1", + "lodash": "^4.17.21", + "memoizee": "^0.4.15", + "ncjsm": "^4.3.2", + "node-dir": "^0.1.17", + "node-fetch": "^2.6.8", + "open": "^7.4.2", + "semver": "^7.3.8", + "simple-git": "^3.16.0", + "timers-ext": "^0.1.7", + "type": "^2.7.2", + "uuid": "^8.3.2", + "yamljs": "^0.3.0" + }, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/@serverless/dashboard-plugin/node_modules/child-process-ext": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/child-process-ext/-/child-process-ext-3.0.2.tgz", + "integrity": "sha512-oBePsLbQpTJFxzwyCvs9yWWF0OEM6vGGepHwt1stqmX7QQqOuDc8j2ywdvAs9Tvi44TT7d9ackqhR4Q10l1u8w==", + "dev": true, + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "es5-ext": "^0.10.62", + "log": "^6.3.1", + "split2": "^3.2.2", + "stream-promise": "^3.2.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@serverless/dashboard-plugin/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "peer": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@serverless/dashboard-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "peer": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@serverless/dashboard-plugin/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "peer": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@serverless/dashboard-plugin/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@serverless/dashboard-plugin/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "peer": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@serverless/dashboard-plugin/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@serverless/dashboard-plugin/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@serverless/dashboard-plugin/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@serverless/event-mocks": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@serverless/event-mocks/-/event-mocks-1.1.1.tgz", + "integrity": "sha512-YAV5V/y+XIOfd+HEVeXfPWZb8C6QLruFk9tBivoX2roQLWVq145s4uxf8D0QioCueuRzkukHUS4JIj+KVoS34A==", + "dev": true, + "peer": true, + "dependencies": { + "@types/lodash": "^4.14.123", + "lodash": "^4.17.11" + } + }, + "node_modules/@serverless/platform-client": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@serverless/platform-client/-/platform-client-4.5.1.tgz", + "integrity": "sha512-XltmO/029X76zi0LUFmhsnanhE2wnqH1xf+WBt5K8gumQA9LnrfwLgPxj+VA+mm6wQhy+PCp7H5SS0ZPu7F2Cw==", + "dev": true, + "peer": true, + "dependencies": { + "adm-zip": "^0.5.5", + "archiver": "^5.3.0", + "axios": "^1.6.2", + "fast-glob": "^3.2.7", + "https-proxy-agent": "^5.0.0", + "ignore": "^5.1.8", + "isomorphic-ws": "^4.0.1", + "js-yaml": "^3.14.1", + "jwt-decode": "^2.2.0", + "minimatch": "^3.0.4", + "querystring": "^0.2.1", + "run-parallel-limit": "^1.1.0", + "throat": "^5.0.0", + "traverse": "^0.6.6", + "ws": "^7.5.3" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/@serverless/platform-client/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@serverless/platform-client/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@serverless/platform-client/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "peer": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@serverless/platform-client/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@serverless/utils": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@serverless/utils/-/utils-6.15.0.tgz", + "integrity": "sha512-7eDbqKv/OBd11jjdZjUwFGN8sHWkeUqLeHXHQxQ1azja2IM7WIH+z/aLgzR6LhB3/MINNwtjesDpjGqTMj2JKQ==", + "dev": true, + "peer": true, + "dependencies": { + "archive-type": "^4.0.0", + "chalk": "^4.1.2", + "ci-info": "^3.8.0", + "cli-progress-footer": "^2.3.2", + "content-disposition": "^0.5.4", + "d": "^1.0.1", + "decompress": "^4.2.1", + "event-emitter": "^0.3.5", + "ext": "^1.7.0", + "ext-name": "^5.0.0", + "file-type": "^16.5.4", + "filenamify": "^4.3.0", + "get-stream": "^6.0.1", + "got": "^11.8.6", + "inquirer": "^8.2.5", + "js-yaml": "^4.1.0", + "jwt-decode": "^3.1.2", + "lodash": "^4.17.21", + "log": "^6.3.1", + "log-node": "^8.0.3", + "make-dir": "^4.0.0", + "memoizee": "^0.4.15", + "ms": "^2.1.3", + "ncjsm": "^4.3.2", + "node-fetch": "^2.6.11", + "open": "^8.4.2", + "p-event": "^4.2.0", + "supports-color": "^8.1.1", + "timers-ext": "^0.1.7", + "type": "^2.7.2", + "uni-global": "^1.0.0", + "uuid": "^8.3.2", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/@serverless/utils/node_modules/jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==", + "dev": true, + "peer": true + }, + "node_modules/@serverless/utils/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "peer": true + }, + "node_modules/@serverless/utils/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.1.1.tgz", + "integrity": "sha512-1+qdrUqLhaALYL0iOcN43EP6yAXXQ2wWZ6taf4S2pNGowmOc5gx+iMQv+E42JizNJjB0+gEadOXeV1Bf7JWL1Q==", + "dependencies": { + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.1.1.tgz", + "integrity": "sha512-lxfLDpZm+AWAHPFZps5JfDoO9Ux1764fOgvRUBpHIO8HWHcSN1dkgsago1qLRVgm1BZ8RCm8cgv99QvtaOWIhw==", + "dependencies": { + "@smithy/node-config-provider": "^2.2.1", + "@smithy/types": "^2.9.1", + "@smithy/util-config-provider": "^2.2.1", + "@smithy/util-middleware": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.3.2.tgz", + "integrity": "sha512-tYDmTp0f2TZVE18jAOH1PnmkngLQ+dOGUlMd1u67s87ieueNeyqhja6z/Z4MxhybEiXKOWFOmGjfTZWFxljwJw==", + "dependencies": { + "@smithy/middleware-endpoint": "^2.4.1", + "@smithy/middleware-retry": "^2.1.1", + "@smithy/middleware-serde": "^2.1.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/util-middleware": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.2.1.tgz", + "integrity": "sha512-7XHjZUxmZYnONheVQL7j5zvZXga+EWNgwEAP6OPZTi7l8J4JTeNh9aIOfE5fKHZ/ee2IeNOh54ZrSna+Vc6TFA==", + "dependencies": { + "@smithy/node-config-provider": "^2.2.1", + "@smithy/property-provider": "^2.1.1", + "@smithy/types": "^2.9.1", + "@smithy/url-parser": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.1.1.tgz", + "integrity": "sha512-E8KYBxBIuU4c+zrpR22VsVrOPoEDzk35bQR3E+xm4k6Pa6JqzkDOdMyf9Atac5GPNKHJBdVaQ4JtjdWX2rl/nw==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.9.1", + "@smithy/util-hex-encoding": "^2.1.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.4.1.tgz", + "integrity": "sha512-VYGLinPsFqH68lxfRhjQaSkjXM7JysUOJDTNjHBuN/ykyRb2f1gyavN9+VhhPTWCy32L4yZ2fdhpCs/nStEicg==", + "dependencies": { + "@smithy/protocol-http": "^3.1.1", + "@smithy/querystring-builder": "^2.1.1", + "@smithy/types": "^2.9.1", + "@smithy/util-base64": "^2.1.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.1.1.tgz", + "integrity": "sha512-Qhoq0N8f2OtCnvUpCf+g1vSyhYQrZjhSwvJ9qvR8BUGOtTXiyv2x1OD2e6jVGmlpC4E4ax1USHoyGfV9JFsACg==", + "dependencies": { + "@smithy/types": "^2.9.1", + "@smithy/util-buffer-from": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.1.1.tgz", + "integrity": "sha512-7WTgnKw+VPg8fxu2v9AlNOQ5yaz6RA54zOVB4f6vQuR0xFKd+RzlCpt0WidYTsye7F+FYDIaS/RnJW4pxjNInw==", + "dependencies": { + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.1.1.tgz", + "integrity": "sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.1.1.tgz", + "integrity": "sha512-rSr9ezUl9qMgiJR0UVtVOGEZElMdGFyl8FzWEF5iEKTlcWxGr2wTqGfDwtH3LAB7h+FPkxqv4ZU4cpuCN9Kf/g==", + "dependencies": { + "@smithy/protocol-http": "^3.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.4.1.tgz", + "integrity": "sha512-XPZTb1E2Oav60Ven3n2PFx+rX9EDsU/jSTA8VDamt7FXks67ekjPY/XrmmPDQaFJOTUHJNKjd8+kZxVO5Ael4Q==", + "dependencies": { + "@smithy/middleware-serde": "^2.1.1", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/url-parser": "^2.1.1", + "@smithy/util-middleware": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.1.1.tgz", + "integrity": "sha512-eMIHOBTXro6JZ+WWzZWd/8fS8ht5nS5KDQjzhNMHNRcG5FkNTqcKpYhw7TETMYzbLfhO5FYghHy1vqDWM4FLDA==", + "dependencies": { + "@smithy/node-config-provider": "^2.2.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/service-error-classification": "^2.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/util-middleware": "^2.1.1", + "@smithy/util-retry": "^2.1.1", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.1.1.tgz", + "integrity": "sha512-D8Gq0aQBeE1pxf3cjWVkRr2W54t+cdM2zx78tNrVhqrDykRA7asq8yVJij1u5NDtKzKqzBSPYh7iW0svUKg76g==", + "dependencies": { + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.1.1.tgz", + "integrity": "sha512-KPJhRlhsl8CjgGXK/DoDcrFGfAqoqvuwlbxy+uOO4g2Azn1dhH+GVfC3RAp+6PoL5PWPb+vt6Z23FP+Mr6qeCw==", + "dependencies": { + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.2.1.tgz", + "integrity": "sha512-epzK3x1xNxA9oJgHQ5nz+2j6DsJKdHfieb+YgJ7ATWxzNcB7Hc+Uya2TUck5MicOPhDV8HZImND7ZOecVr+OWg==", + "dependencies": { + "@smithy/property-provider": "^2.1.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.3.1.tgz", + "integrity": "sha512-gLA8qK2nL9J0Rk/WEZSvgin4AppvuCYRYg61dcUo/uKxvMZsMInL5I5ZdJTogOvdfVug3N2dgI5ffcUfS4S9PA==", + "dependencies": { + "@smithy/abort-controller": "^2.1.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/querystring-builder": "^2.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.1.1.tgz", + "integrity": "sha512-FX7JhhD/o5HwSwg6GLK9zxrMUrGnb3PzNBrcthqHKBc3dH0UfgEAU24xnJ8F0uow5mj17UeBEOI6o3CF2k7Mhw==", + "dependencies": { + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.1.1.tgz", + "integrity": "sha512-6ZRTSsaXuSL9++qEwH851hJjUA0OgXdQFCs+VDw4tGH256jQ3TjYY/i34N4vd24RV3nrjNsgd1yhb57uMoKbzQ==", + "dependencies": { + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.1.1.tgz", + "integrity": "sha512-C/ko/CeEa8jdYE4gt6nHO5XDrlSJ3vdCG0ZAc6nD5ZIE7LBp0jCx4qoqp7eoutBu7VrGMXERSRoPqwi1WjCPbg==", + "dependencies": { + "@smithy/types": "^2.9.1", + "@smithy/util-uri-escape": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.1.1.tgz", + "integrity": "sha512-H4+6jKGVhG1W4CIxfBaSsbm98lOO88tpDWmZLgkJpt8Zkk/+uG0FmmqMuCAc3HNM2ZDV+JbErxr0l5BcuIf/XQ==", + "dependencies": { + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.1.tgz", + "integrity": "sha512-txEdZxPUgM1PwGvDvHzqhXisrc5LlRWYCf2yyHfvITWioAKat7srQvpjMAvgzf0t6t7j8yHrryXU9xt7RZqFpw==", + "dependencies": { + "@smithy/types": "^2.9.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.3.1.tgz", + "integrity": "sha512-2E2kh24igmIznHLB6H05Na4OgIEilRu0oQpYXo3LCNRrawHAcfDKq9004zJs+sAMt2X5AbY87CUCJ7IpqpSgdw==", + "dependencies": { + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.1.1.tgz", + "integrity": "sha512-Hb7xub0NHuvvQD3YwDSdanBmYukoEkhqBjqoxo+bSdC0ryV9cTfgmNjuAQhTPYB6yeU7hTR+sPRiFMlxqv6kmg==", + "dependencies": { + "@smithy/eventstream-codec": "^2.1.1", + "@smithy/is-array-buffer": "^2.1.1", + "@smithy/types": "^2.9.1", + "@smithy/util-hex-encoding": "^2.1.1", + "@smithy/util-middleware": "^2.1.1", + "@smithy/util-uri-escape": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.3.1.tgz", + "integrity": "sha512-YsTdU8xVD64r2pLEwmltrNvZV6XIAC50LN6ivDopdt+YiF/jGH6PY9zUOu0CXD/d8GMB8gbhnpPsdrjAXHS9QA==", + "dependencies": { + "@smithy/middleware-endpoint": "^2.4.1", + "@smithy/middleware-stack": "^2.1.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/types": "^2.9.1", + "@smithy/util-stream": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.9.1.tgz", + "integrity": "sha512-vjXlKNXyprDYDuJ7UW5iobdmyDm6g8dDG+BFUncAg/3XJaN45Gy5RWWWUVgrzIK7S4R1KWgIX5LeJcfvSI24bw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.1.1.tgz", + "integrity": "sha512-qC9Bv8f/vvFIEkHsiNrUKYNl8uKQnn4BdhXl7VzQRP774AwIjiSMMwkbT+L7Fk8W8rzYVifzJNYxv1HwvfBo3Q==", + "dependencies": { + "@smithy/querystring-parser": "^2.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.1.1.tgz", + "integrity": "sha512-UfHVpY7qfF/MrgndI5PexSKVTxSZIdz9InghTFa49QOvuu9I52zLPLUHXvHpNuMb1iD2vmc6R+zbv/bdMipR/g==", + "dependencies": { + "@smithy/util-buffer-from": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.1.1.tgz", + "integrity": "sha512-ekOGBLvs1VS2d1zM2ER4JEeBWAvIOUKeaFch29UjjJsxmZ/f0L3K3x0dEETgh3Q9bkZNHgT+rkdl/J/VUqSRag==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.2.1.tgz", + "integrity": "sha512-/ggJG+ta3IDtpNVq4ktmEUtOkH1LW64RHB5B0hcr5ZaWBmo96UX2cIOVbjCqqDickTXqBWZ4ZO0APuaPrD7Abg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.1.1.tgz", + "integrity": "sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==", + "dependencies": { + "@smithy/is-array-buffer": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.2.1.tgz", + "integrity": "sha512-50VL/tx9oYYcjJn/qKqNy7sCtpD0+s8XEBamIFo4mFFTclKMNp+rsnymD796uybjiIquB7VCB/DeafduL0y2kw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.1.1.tgz", + "integrity": "sha512-lqLz/9aWRO6mosnXkArtRuQqqZBhNpgI65YDpww4rVQBuUT7qzKbDLG5AmnQTCiU4rOquaZO/Kt0J7q9Uic7MA==", + "dependencies": { + "@smithy/property-provider": "^2.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.2.0.tgz", + "integrity": "sha512-iFJp/N4EtkanFpBUtSrrIbtOIBf69KNuve03ic1afhJ9/korDxdM0c6cCH4Ehj/smI9pDCfVv+bqT3xZjF2WaA==", + "dependencies": { + "@smithy/config-resolver": "^2.1.1", + "@smithy/credential-provider-imds": "^2.2.1", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/property-provider": "^2.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.1.1.tgz", + "integrity": "sha512-sI4d9rjoaekSGEtq3xSb2nMjHMx8QXcz2cexnVyRWsy4yQ9z3kbDpX+7fN0jnbdOp0b3KSTZJZ2Yb92JWSanLw==", + "dependencies": { + "@smithy/node-config-provider": "^2.2.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.1.1.tgz", + "integrity": "sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.1.1.tgz", + "integrity": "sha512-mKNrk8oz5zqkNcbcgAAepeJbmfUW6ogrT2Z2gDbIUzVzNAHKJQTYmH9jcy0jbWb+m7ubrvXKb6uMjkSgAqqsFA==", + "dependencies": { + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.1.1.tgz", + "integrity": "sha512-Mg+xxWPTeSPrthpC5WAamJ6PW4Kbo01Fm7lWM1jmGRvmrRdsd3192Gz2fBXAMURyXpaNxyZf6Hr/nQ4q70oVEA==", + "dependencies": { + "@smithy/service-error-classification": "^2.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.1.1.tgz", + "integrity": "sha512-J7SMIpUYvU4DQN55KmBtvaMc7NM3CZ2iWICdcgaovtLzseVhAqFRYqloT3mh0esrFw+3VEK6nQFteFsTqZSECQ==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.4.1", + "@smithy/node-http-handler": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-buffer-from": "^2.1.1", + "@smithy/util-hex-encoding": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.1.1.tgz", + "integrity": "sha512-saVzI1h6iRBUVSqtnlOnc9ssU09ypo7n+shdQ8hBTZno/9rZ3AuRYvoHInV57VF7Qn7B+pFJG7qTzFiHxWlWBw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.1.1.tgz", + "integrity": "sha512-BqTpzYEcUMDwAKr7/mVRUtHDhs6ZoXDi9NypMvMfOr/+u1NW7JgqodPDECiiLboEm6bobcPcECxzjtQh865e9A==", + "dependencies": { + "@smithy/util-buffer-from": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.1.1.tgz", + "integrity": "sha512-kYy6BLJJNif+uqNENtJqWdXcpqo1LS+nj1AfXcDhOpqpSHJSAkVySLyZV9fkmuVO21lzGoxjvd1imGGJHph/IA==", + "dependencies": { + "@smithy/abort-controller": "^2.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "peer": true, + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true, + "peer": true + }, + "node_modules/@tracetest/client": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/@tracetest/client/-/client-0.0.27.tgz", + "integrity": "sha512-JNO7AjPGoFie+egYyr7ZZgNVw9X59PIBvvMuhifd0Ofl1JOlXkPtXTM5WgocToZ6Pnmuk/zQEdVanFRt7r886g==", + "dependencies": { + "js-yaml": "^4.1.0" + }, + "peerDependencies": { + "@opentelemetry/sdk-trace-base": "^1.18.1" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.133", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.133.tgz", + "integrity": "sha512-sr852MAL/79rjDelXP6ZuJ6GwOvXIRrFAoC8a+w91mZ5XR71CuzSgo1d0+pG1qgfPhjFgaibu7SWaoC5BA7pyQ==" + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bunyan": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.9.tgz", + "integrity": "sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/connect": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/content-disposition": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", + "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==" + }, + "node_modules/@types/cookies": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz", + "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", + "dependencies": { + "@types/connect": "*", + "@types/express": "*", + "@types/keygrip": "*", + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.43", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", + "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/hapi__catbox": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/@types/hapi__catbox/-/hapi__catbox-10.2.6.tgz", + "integrity": "sha512-qdMHk4fBlwRfnBBDJaoaxb+fU9Ewi2xqkXD3mNjSPl2v/G/8IJbDpVRBuIcF7oXrcE8YebU5M8cCeKh1NXEn0w==" + }, + "node_modules/@types/hapi__hapi": { + "version": "20.0.13", + "resolved": "https://registry.npmjs.org/@types/hapi__hapi/-/hapi__hapi-20.0.13.tgz", + "integrity": "sha512-LP4IPfhIO5ZPVOrJo7H8c8Slc0WYTFAUNQX1U0LBPKyXioXhH5H2TawIgxKujIyOhbwoBbpvOsBf6o5+ToJIrQ==", + "dependencies": { + "@hapi/boom": "^9.0.0", + "@hapi/iron": "^6.0.0", + "@hapi/podium": "^4.1.3", + "@types/hapi__catbox": "*", + "@types/hapi__mimos": "*", + "@types/hapi__shot": "*", + "@types/node": "*", + "joi": "^17.3.0" + } + }, + "node_modules/@types/hapi__mimos": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/hapi__mimos/-/hapi__mimos-4.1.4.tgz", + "integrity": "sha512-i9hvJpFYTT/qzB5xKWvDYaSXrIiNqi4ephi+5Lo6+DoQdwqPXQgmVVOZR+s3MBiHoFqsCZCX9TmVWG3HczmTEQ==", + "dependencies": { + "@types/mime-db": "*" + } + }, + "node_modules/@types/hapi__shot": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.6.tgz", + "integrity": "sha512-h33NBjx2WyOs/9JgcFeFhkxnioYWQAZxOHdmqDuoJ1Qjxpcs+JGvSjEEoDeWfcrF+1n47kKgqph5IpfmPOnzbg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-assert": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.5.tgz", + "integrity": "sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true, + "peer": true + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, + "node_modules/@types/ioredis4": { + "name": "@types/ioredis", + "version": "4.28.10", + "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz", + "integrity": "sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/keygrip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", + "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/koa": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.14.0.tgz", + "integrity": "sha512-DTDUyznHGNHAl+wd1n0z1jxNajduyTh8R53xoewuerdBzGo6Ogj6F2299BFtrexJw4NtgjsI5SMPCmV9gZwGXA==", + "dependencies": { + "@types/accepts": "*", + "@types/content-disposition": "*", + "@types/cookies": "*", + "@types/http-assert": "*", + "@types/http-errors": "*", + "@types/keygrip": "*", + "@types/koa-compose": "*", + "@types/node": "*" + } + }, + "node_modules/@types/koa__router": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-12.0.3.tgz", + "integrity": "sha512-5YUJVv6NwM1z7m6FuYpKfNLTZ932Z6EF6xy2BbtpJSyn13DKNQEkXVffFVSnJHxvwwWh2SAeumpjAYUELqgjyw==", + "dependencies": { + "@types/koa": "*" + } + }, + "node_modules/@types/koa-compose": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", + "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", + "dependencies": { + "@types/koa": "*" + } + }, + "node_modules/@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", + "dev": true, + "peer": true + }, + "node_modules/@types/memcached": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz", + "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, + "node_modules/@types/mime-db": { + "version": "1.43.5", + "resolved": "https://registry.npmjs.org/@types/mime-db/-/mime-db-1.43.5.tgz", + "integrity": "sha512-/bfTiIUTNPUBnwnYvUxXAre5MhD88jgagLEQiQtIASjU+bwxd8kS/ASDA4a8ufd8m0Lheu6eeMJHEUpLHoJ28A==" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/mysql": { + "version": "2.15.22", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.22.tgz", + "integrity": "sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.11.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.17.tgz", + "integrity": "sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.4.tgz", + "integrity": "sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==", + "dependencies": { + "@types/pg": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/shimmer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.5.tgz", + "integrity": "sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww==" + }, + "node_modules/@types/tedious": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/2-thenable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/2-thenable/-/2-thenable-1.0.0.tgz", + "integrity": "sha512-HqiDzaLDFCXkcCO/SwoyhRwqYtINFHF7t9BDRq4x90TOKNAJpiqUt9X5lQ08bwxYzc067HUywDjGySpebHcUpw==", + "dev": true, + "peer": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.47" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "peer": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adm-zip": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", + "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "peer": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "peer": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "peer": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/archive-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==", + "dev": true, + "peer": true, + "dependencies": { + "file-type": "^4.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/archive-type/node_modules/file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "dev": true, + "peer": true, + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "peer": true, + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "peer": true + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "peer": true + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true, + "peer": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "peer": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", + "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sdk": { + "version": "2.1554.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1554.0.tgz", + "integrity": "sha512-MmCfg80CKCOFeC8K6UMSmDLPPGVesAglOzmO2IMEugHt10UsK2szOa+C31IHO2PEnjhn+l4WoVlaBAN/YQX+tQ==", + "dev": true, + "peer": true, + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-sdk/node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/aws-sdk/node_modules/uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "dev": true, + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/axios": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "dev": true, + "peer": true, + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "peer": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "peer": true + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "peer": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "peer": true, + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true, + "peer": true + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", + "dev": true, + "peer": true + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", + "dev": true, + "peer": true + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "peer": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "peer": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cachedir": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", + "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.6.tgz", + "integrity": "sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==", + "dev": true, + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "set-function-length": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "peer": true + }, + "node_modules/child-process-ext": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/child-process-ext/-/child-process-ext-2.1.1.tgz", + "integrity": "sha512-0UQ55f51JBkOFa+fvR76ywRzxiPwQS3Xe8oe5bZRphpv+dIMeerW5Zn5e4cUy4COJwVtJyU0R79RMnw+aCqmGA==", + "dev": true, + "peer": true, + "dependencies": { + "cross-spawn": "^6.0.5", + "es5-ext": "^0.10.53", + "log": "^6.0.0", + "split2": "^3.1.1", + "stream-promise": "^3.2.0" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "peer": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + }, + "node_modules/cli-color": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz", + "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==", + "dev": true, + "peer": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.61", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "peer": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-progress-footer": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/cli-progress-footer/-/cli-progress-footer-2.3.2.tgz", + "integrity": "sha512-uzHGgkKdeA9Kr57eyH1W5HGiNShP8fV1ETq04HDNM1Un6ShXbHhwi/H8LNV9L1fQXKjEw0q5FUkEVNuZ+yZdSw==", + "dev": true, + "peer": true, + "dependencies": { + "cli-color": "^2.0.2", + "d": "^1.0.1", + "es5-ext": "^0.10.61", + "mute-stream": "0.0.8", + "process-utils": "^4.0.0", + "timers-ext": "^0.1.7", + "type": "^2.6.0" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-sprintf-format": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cli-sprintf-format/-/cli-sprintf-format-1.1.1.tgz", + "integrity": "sha512-BbEjY9BEdA6wagVwTqPvmAwGB24U93rQPBFZUT8lNCDxXzre5LFHQUTJc70czjgUomVg8u8R5kW8oY9DYRFNeg==", + "dev": true, + "peer": true, + "dependencies": { + "cli-color": "^2.0.1", + "es5-ext": "^0.10.53", + "sprintf-kit": "^2.0.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cli-sprintf-format/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-sprintf-format/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "peer": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "peer": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "dev": true, + "peer": true, + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "peer": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "peer": true + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "peer": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "dev": true, + "peer": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "peer": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "peer": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/d/node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true, + "peer": true + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", + "dev": true, + "peer": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dev": true, + "peer": true, + "dependencies": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "peer": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, + "peer": true, + "dependencies": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar/node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "peer": true, + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/decompress-tar/node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-tar/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/decompress-tar/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "peer": true + }, + "node_modules/decompress-tar/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/decompress-tar/node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "peer": true, + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "peer": true, + "dependencies": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2/node_modules/file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "peer": true, + "dependencies": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz/node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", + "dev": true, + "peer": true, + "dependencies": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-unzip/node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip/node_modules/get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", + "dev": true, + "peer": true, + "dependencies": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "peer": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress/node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "peer": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/deferred": { + "version": "0.7.11", + "resolved": "https://registry.npmjs.org/deferred/-/deferred-0.7.11.tgz", + "integrity": "sha512-8eluCl/Blx4YOGwMapBvXRKxHXhA8ejDXYzEaK8+/gtcm8hRMhSLmXSqDmNUKNc/C8HNSmuyyp/hflhqDAvK2A==", + "dev": true, + "peer": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.50", + "event-emitter": "^0.3.5", + "next-tick": "^1.0.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/define-data-property": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz", + "integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==", + "dev": true, + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "peer": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz", + "integrity": "sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "dev": true, + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/duration": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", + "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", + "dev": true, + "peer": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.46" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "peer": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "hasInstallScript": true, + "peer": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "peer": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-set": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.6.tgz", + "integrity": "sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==", + "dev": true, + "peer": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "es6-iterator": "~2.0.3", + "es6-symbol": "^3.1.3", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "peer": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "peer": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esniff": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-1.1.3.tgz", + "integrity": "sha512-SLBLpfE7xWgF/HbzhVuAwqnJDRqSCNZqcqaIMVm+f+PbTp1kFRWu6BuT83SATb4Tp+ovr+S+u7vDH7/UErAOkw==", + "dev": true, + "peer": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/essentials": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/essentials/-/essentials-1.2.0.tgz", + "integrity": "sha512-kP/j7Iw7KeNE8b/o7+tr9uX2s1wegElGOoGZ2Xm35qBr4BbbEcH3/bxR2nfH9l9JANCq9AUrvKw+gRuHtZp0HQ==", + "dev": true, + "peer": true, + "dependencies": { + "uni-global": "^1.0.0" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "peer": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "peer": true, + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "peer": true, + "dependencies": { + "mime-db": "^1.28.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "peer": true, + "dependencies": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "peer": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "peer": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "peer": true + }, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "peer": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "peer": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "dev": true, + "peer": true, + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dev": true, + "peer": true, + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/filesize": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.0.tgz", + "integrity": "sha512-GTLKYyBSDz3nPhlLVPjPWZCnhkd9TrrRArNcy8Z+J2cqScB7h2McAzR6NBX6nYOoWafql0roY8hrocxnZBv9CQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 10.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-requires": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-requires/-/find-requires-1.0.0.tgz", + "integrity": "sha512-UME7hNwBfzeISSFQcBEDemEEskpOjI/shPrpJM5PI4DSdn6hX0dmz+2dL70blZER2z8tSnTRL+2rfzlYgtbBoQ==", + "dev": true, + "peer": true, + "dependencies": { + "es5-ext": "^0.10.49", + "esniff": "^1.1.0" + }, + "bin": { + "find-requires": "bin/find-requires.js" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "peer": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "peer": true, + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "peer": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "peer": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "dev": true, + "peer": true, + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "peer": true + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "peer": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fs2": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/fs2/-/fs2-0.3.9.tgz", + "integrity": "sha512-WsOqncODWRlkjwll+73bAxVW3JPChDgaPX3DT4iTTm73UmG4VgALa7LaFblP232/DN60itkOrPZ8kaP1feksGQ==", + "dev": true, + "peer": true, + "dependencies": { + "d": "^1.0.1", + "deferred": "^0.7.11", + "es5-ext": "^0.10.53", + "event-emitter": "^0.3.5", + "ignore": "^5.1.8", + "memoizee": "^0.4.14", + "type": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gaxios": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.2.0.tgz", + "integrity": "sha512-H6+bHeoEAU5D6XNc6mPKeN5dLZqEDs9Gpk6I+SZBEzK5So58JVrHPmevNi35fRl1J9Y5TaeLW0kYx3pCJ1U2mQ==", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gcp-metadata": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", + "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", + "dependencies": { + "gaxios": "^6.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "peer": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "peer": true, + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "dev": true, + "peer": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "peer": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true, + "peer": true + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "peer": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true, + "peer": true + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "peer": true + }, + "node_modules/import-in-the-middle": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.1.tgz", + "integrity": "sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/inquirer": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "peer": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "peer": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==", + "dev": true, + "peer": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true, + "peer": true + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "peer": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "peer": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "peer": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "peer": true + }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "dev": true, + "peer": true, + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/joi": { + "version": "17.12.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.1.tgz", + "integrity": "sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ==", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "peer": true + }, + "node_modules/json-colorizer": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/json-colorizer/-/json-colorizer-2.2.2.tgz", + "integrity": "sha512-56oZtwV1piXrQnRNTtJeqRv+B9Y/dXAYLqBBaYl/COcUdoZxgLBLAO88+CnkbT6MxNs0c5E9mPBIb2sFcNz3vw==", + "dev": true, + "peer": true, + "dependencies": { + "chalk": "^2.4.1", + "lodash.get": "^4.4.2" + } + }, + "node_modules/json-colorizer/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-colorizer/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-colorizer/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/json-colorizer/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "peer": true + }, + "node_modules/json-colorizer/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-colorizer/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-cycle": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/json-cycle/-/json-cycle-1.5.0.tgz", + "integrity": "sha512-GOehvd5PO2FeZ5T4c+RxobeT5a1PiGpF4u9/3+UvrMU4bhnVqzJY7hm39wg8PDCqkU91fWGH8qjWR4bn+wgq9w==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/json-refs": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/json-refs/-/json-refs-3.0.15.tgz", + "integrity": "sha512-0vOQd9eLNBL18EGl5yYaO44GhixmImes2wiYn9Z3sag3QnehWrYWlB9AFtMxCL2Bj3fyxgDYkxGFEU/chlYssw==", + "dev": true, + "peer": true, + "dependencies": { + "commander": "~4.1.1", + "graphlib": "^2.1.8", + "js-yaml": "^3.13.1", + "lodash": "^4.17.15", + "native-promise-only": "^0.8.1", + "path-loader": "^1.0.10", + "slash": "^3.0.0", + "uri-js": "^4.2.2" + }, + "bin": { + "json-refs": "bin/json-refs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/json-refs/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/json-refs/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "peer": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "peer": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "peer": true + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/jwt-decode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-2.2.0.tgz", + "integrity": "sha512-86GgN2vzfUu7m9Wcj63iUkuDzFNYFVmjeDm2GzWpUk+opB0pEpMsw6ePCMrhYkumz2C1ihqtZzOMAg7FiXcNoQ==", + "dev": true, + "peer": true + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "peer": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "peer": true + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "peer": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true, + "peer": true + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true, + "peer": true + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true, + "peer": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true, + "peer": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "peer": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true, + "peer": true + }, + "node_modules/log": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/log/-/log-6.3.1.tgz", + "integrity": "sha512-McG47rJEWOkXTDioZzQNydAVvZNeEkSyLJ1VWkFwfW+o1knW+QSi8D1KjPn/TnctV+q99lkvJNe1f0E1IjfY2A==", + "dev": true, + "peer": true, + "dependencies": { + "d": "^1.0.1", + "duration": "^0.2.2", + "es5-ext": "^0.10.53", + "event-emitter": "^0.3.5", + "sprintf-kit": "^2.0.1", + "type": "^2.5.0", + "uni-global": "^1.0.0" + } + }, + "node_modules/log-node": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/log-node/-/log-node-8.0.3.tgz", + "integrity": "sha512-1UBwzgYiCIDFs8A0rM2QdBFo8Wd8UQ0HrSTu/MNI+/2zN3NoHRj2fhplurAyuxTYUXu3Oohugq1jAn5s05u1MQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "cli-color": "^2.0.1", + "cli-sprintf-format": "^1.1.1", + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "sprintf-kit": "^2.0.1", + "supports-color": "^8.1.1", + "type": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "peerDependencies": { + "log": "^6.0.0" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dev": true, + "peer": true, + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "peer": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dev": true, + "peer": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "peer": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "peer": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "peer": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "peer": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mnemonist": { + "version": "0.38.3", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.3.tgz", + "integrity": "sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==", + "dependencies": { + "obliterator": "^1.6.1" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true, + "peer": true + }, + "node_modules/native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==", + "dev": true, + "peer": true + }, + "node_modules/ncjsm": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ncjsm/-/ncjsm-4.3.2.tgz", + "integrity": "sha512-6d1VWA7FY31CpI4Ki97Fpm36jfURkVbpktizp8aoVViTZRQgr/0ddmlKerALSSlzfwQRBeSq1qwwVcBJK4Sk7Q==", + "dev": true, + "peer": true, + "dependencies": { + "builtin-modules": "^3.3.0", + "deferred": "^0.7.11", + "es5-ext": "^0.10.62", + "es6-set": "^0.1.6", + "ext": "^1.7.0", + "find-requires": "^1.0.0", + "fs2": "^0.3.9", + "type": "^2.7.2" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true, + "peer": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "peer": true + }, + "node_modules/node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", + "dev": true, + "peer": true, + "dependencies": { + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.10.5" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-registry-utilities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-utilities/-/npm-registry-utilities-1.0.0.tgz", + "integrity": "sha512-9xYfSJy2IFQw1i6462EJzjChL9e65EfSo2Cw6kl0EFeDp05VvU+anrQk3Fc0d1MbVCq7rWIxeer89O9SUQ/uOg==", + "dev": true, + "peer": true, + "dependencies": { + "ext": "^1.6.0", + "fs2": "^0.3.9", + "memoizee": "^0.4.15", + "node-fetch": "^2.6.7", + "semver": "^7.3.5", + "type": "^2.6.0", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obliterator": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz", + "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "peer": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "peer": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "dev": true, + "peer": true, + "dependencies": { + "p-timeout": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "peer": true, + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "peer": true + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-loader": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/path-loader/-/path-loader-1.0.12.tgz", + "integrity": "sha512-n7oDG8B+k/p818uweWrOixY9/Dsr89o2TkCm6tOTex3fpdo2+BFDgR+KpB37mGKBRsBAlR8CIJMFN0OEy/7hIQ==", + "dev": true, + "peer": true, + "dependencies": { + "native-promise-only": "^0.8.1", + "superagent": "^7.1.6" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path2": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path2/-/path2-0.1.0.tgz", + "integrity": "sha512-TX+cz8Jk+ta7IvRy2FAej8rdlbrP0+uBIkP/5DTODez/AuL/vSb30KuAdDxGVREXzn8QfAiu5mJYJ1XjbOhEPA==", + "dev": true, + "peer": true + }, + "node_modules/peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "peer": true + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "peer": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "peer": true + }, + "node_modules/process-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/process-utils/-/process-utils-4.0.0.tgz", + "integrity": "sha512-fMyMQbKCxX51YxR7YGCzPjLsU3yDzXFkP4oi1/Mt5Ixnk7GO/7uUTj8mrCHUwuvozWzI+V7QSJR9cZYnwNOZPg==", + "dev": true, + "peer": true, + "dependencies": { + "ext": "^1.4.0", + "fs2": "^0.3.9", + "memoizee": "^0.4.14", + "type": "^2.1.0" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/promise-queue": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/promise-queue/-/promise-queue-2.2.5.tgz", + "integrity": "sha512-p/iXrPSVfnqPft24ZdNNLECw/UrtLTpT3jpAAMzl/o5/rDsGCPo3/CQS2611flL6LkoEJ3oQZw7C8Q80ZISXRQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "peer": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "peer": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "peer": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dev": true, + "peer": true, + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "peer": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "peer": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz", + "integrity": "sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "peer": true + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "peer": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "peer": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-parallel-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", + "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true, + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "peer": true + }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", + "dev": true, + "peer": true + }, + "node_modules/seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dev": true, + "peer": true, + "dependencies": { + "commander": "^2.8.1" + }, + "bin": { + "seek-bunzip": "bin/seek-bunzip", + "seek-table": "bin/seek-bzip-table" + } + }, + "node_modules/seek-bzip/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serverless": { + "version": "3.38.0", + "resolved": "https://registry.npmjs.org/serverless/-/serverless-3.38.0.tgz", + "integrity": "sha512-NJE1vOn8XmQEqfU9UxmVhkUFaCRmx6FhYw/jITN863WlOt4Y3PQbj3hwQyIb5QS1ZrXFq5ojklwewUXH7xGpdA==", + "dev": true, + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@serverless/dashboard-plugin": "^7.2.0", + "@serverless/platform-client": "^4.5.1", + "@serverless/utils": "^6.13.1", + "abort-controller": "^3.0.0", + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "archiver": "^5.3.1", + "aws-sdk": "^2.1404.0", + "bluebird": "^3.7.2", + "cachedir": "^2.3.0", + "chalk": "^4.1.2", + "child-process-ext": "^2.1.1", + "ci-info": "^3.8.0", + "cli-progress-footer": "^2.3.2", + "d": "^1.0.1", + "dayjs": "^1.11.8", + "decompress": "^4.2.1", + "dotenv": "^16.3.1", + "dotenv-expand": "^10.0.0", + "essentials": "^1.2.0", + "ext": "^1.7.0", + "fastest-levenshtein": "^1.0.16", + "filesize": "^10.0.7", + "fs-extra": "^10.1.0", + "get-stdin": "^8.0.0", + "globby": "^11.1.0", + "graceful-fs": "^4.2.11", + "https-proxy-agent": "^5.0.1", + "is-docker": "^2.2.1", + "js-yaml": "^4.1.0", + "json-colorizer": "^2.2.2", + "json-cycle": "^1.5.0", + "json-refs": "^3.0.15", + "lodash": "^4.17.21", + "memoizee": "^0.4.15", + "micromatch": "^4.0.5", + "node-fetch": "^2.6.11", + "npm-registry-utilities": "^1.0.0", + "object-hash": "^3.0.0", + "open": "^8.4.2", + "path2": "^0.1.0", + "process-utils": "^4.0.0", + "promise-queue": "^2.2.5", + "require-from-string": "^2.0.2", + "semver": "^7.5.3", + "signal-exit": "^3.0.7", + "stream-buffers": "^3.0.2", + "strip-ansi": "^6.0.1", + "supports-color": "^8.1.1", + "tar": "^6.1.15", + "timers-ext": "^0.1.7", + "type": "^2.7.2", + "untildify": "^4.0.0", + "uuid": "^9.0.0", + "ws": "^7.5.9", + "yaml-ast-parser": "0.0.43" + }, + "bin": { + "serverless": "bin/serverless.js", + "sls": "bin/serverless.js" + }, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/serverless-plugin-typescript": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/serverless-plugin-typescript/-/serverless-plugin-typescript-2.1.5.tgz", + "integrity": "sha512-7OO6eJzv57dvfz0v9huU1JVBgdzgvvz+6GCwwkR2bfdVHKs1tifx+fSgjbQcBpXNNHf8Dx2Mo7evtYTkA/TDDA==", + "dev": true, + "dependencies": { + "fs-extra": "^7.0.1", + "globby": "^10.0.2", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=10.0" + }, + "peerDependencies": { + "serverless": "2 || 3", + "typescript": ">=2.2.2" + } + }, + "node_modules/serverless-plugin-typescript/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/serverless-plugin-typescript/node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/serverless-plugin-typescript/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/serverless-plugin-typescript/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/serverless/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/serverless/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "peer": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, + "peer": true, + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, + "peer": true + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "peer": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "node_modules/side-channel": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "peer": true + }, + "node_modules/simple-git": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.22.0.tgz", + "integrity": "sha512-6JujwSs0ac82jkGjMHiCnTifvf1crOiY/+tfs/Pqih6iow7VrpNKRRNdWm6RtaXpvvv/JGNYhlUtLhGFqHF+Yw==", + "dev": true, + "peer": true, + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", + "dev": true, + "peer": true, + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", + "dev": true, + "peer": true, + "dependencies": { + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "peer": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "peer": true + }, + "node_modules/sprintf-kit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sprintf-kit/-/sprintf-kit-2.0.1.tgz", + "integrity": "sha512-2PNlcs3j5JflQKcg4wpdqpZ+AjhQJ2OZEo34NXDtlB0tIPG84xaaXhpA8XFacFiwjKA4m49UOYG83y3hbMn/gQ==", + "dev": true, + "peer": true, + "dependencies": { + "es5-ext": "^0.10.53" + } + }, + "node_modules/stream-buffers": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", + "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/stream-promise": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-promise/-/stream-promise-3.2.0.tgz", + "integrity": "sha512-P+7muTGs2C8yRcgJw/PPt61q7O517tDHiwYEzMWo1GSBCcZedUMT/clz7vUNsSxFphIlJ6QUL4GexQKlfJoVtA==", + "dev": true, + "peer": true, + "dependencies": { + "2-thenable": "^1.0.0", + "es5-ext": "^0.10.49", + "is-stream": "^1.1.0" + } + }, + "node_modules/stream-promise/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dev": true, + "peer": true, + "dependencies": { + "is-natural-number": "^4.0.1" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "peer": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "dev": true, + "peer": true, + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/superagent": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.6.tgz", + "integrity": "sha512-gZkVCQR1gy/oUXr+kxJMLDjla434KmSOKbx5iGD30Ql+AkJQ/YlPKECJy2nhqOsHLjGHzoDTXNSjhnvWhzKk7g==", + "deprecated": "Please downgrade to v7.1.5 if you need IE/ActiveXObject support OR upgrade to v8.0.0 as we no longer support IE and published an incorrect patch version (see https://github.com/visionmedia/superagent/issues/1731)", + "dev": true, + "peer": true, + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.3", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.0.1", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.10.3", + "readable-stream": "^3.6.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dev": true, + "peer": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true, + "peer": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "peer": true + }, + "node_modules/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "peer": true, + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "peer": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true, + "peer": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "dev": true, + "peer": true, + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/token-types/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/traverse": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", + "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "peer": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true, + "peer": true + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "peer": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/uni-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uni-global/-/uni-global-1.0.0.tgz", + "integrity": "sha512-WWM3HP+siTxzIWPNUg7hZ4XO8clKi6NoCAJJWnuRL+BAqyFXF8gC03WNyTefGoUXYc47uYgXxpKLIEvo65PEHw==", + "dev": true, + "peer": true, + "dependencies": { + "type": "^2.5.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "dev": true, + "peer": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true, + "peer": true + }, + "node_modules/url/node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "peer": true + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", + "dev": true, + "peer": true, + "dependencies": { + "builtins": "^1.0.3" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "peer": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dev": true, + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "peer": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dev": true, + "peer": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", + "dev": true, + "peer": true + }, + "node_modules/yamljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", + "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "glob": "^7.0.5" + }, + "bin": { + "json2yaml": "bin/json2yaml", + "yaml2json": "bin/yaml2json" + } + }, + "node_modules/yamljs/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "peer": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "dev": true, + "peer": true, + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dev": true, + "peer": true, + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + } + } +} diff --git a/examples/quick-start-serverless/package.json b/examples/quick-start-serverless/package.json new file mode 100644 index 0000000000..518a0ab234 --- /dev/null +++ b/examples/quick-start-serverless/package.json @@ -0,0 +1,34 @@ +{ + "dependencies": { + "@aws-sdk/client-dynamodb": "^3.509.0", + "@aws-sdk/lib-dynamodb": "^3.509.0", + "@opentelemetry/api": "^1.7.0", + "@opentelemetry/auto-instrumentations-node": "^0.41.1", + "@opentelemetry/exporter-trace-otlp-grpc": "^0.48.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.48.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation-fetch": "^0.48.0", + "@opentelemetry/sdk-trace-base": "^1.21.0", + "@opentelemetry/sdk-trace-node": "^1.21.0", + "@tracetest/client": "^0.0.27", + "@types/aws-lambda": "^8.10.133", + "@types/node": "^20.11.17", + "dotenv": "^16.4.1", + "node-fetch": "^2.7.0" + }, + "name": "tracetest-serverless", + "version": "1.0.0", + "scripts": { + "deploy": "serverless deploy", + "test": "ENDPOINT=\"$(sls info --verbose | grep HttpApiUrl | sed s/HttpApiUrl\\:\\ //g)\" ts-node tracetest.ts", + "start": "npm run deploy && npm run test" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "serverless-plugin-typescript": "^2.1.5", + "ts-node": "^10.9.2", + "typescript": "^5.3.3" + } +} diff --git a/examples/quick-start-serverless/resources/dynamodb.yml b/examples/quick-start-serverless/resources/dynamodb.yml new file mode 100644 index 0000000000..e1417917c7 --- /dev/null +++ b/examples/quick-start-serverless/resources/dynamodb.yml @@ -0,0 +1,12 @@ +Resources: + PokemonsTable: + Type: AWS::DynamoDB::Table + Properties: + TableName: ${self:custom.tableName} + AttributeDefinitions: + - AttributeName: id + AttributeType: N + KeySchema: + - AttributeName: id + KeyType: HASH + BillingMode: PAY_PER_REQUEST diff --git a/examples/quick-start-serverless/serverless.yml b/examples/quick-start-serverless/serverless.yml new file mode 100644 index 0000000000..5b4d461ffa --- /dev/null +++ b/examples/quick-start-serverless/serverless.yml @@ -0,0 +1,45 @@ +service: tracetest-serverless +frameworkVersion: "3" + +plugins: + - serverless-plugin-typescript + +useDotenv: true + +custom: + tableName: tracetest-pokemons + +provider: + name: aws + runtime: nodejs18.x + environment: + NODE_OPTIONS: --require src/lambda-wrapper + COLLECTOR_ENDPOINT: ${env:TRACETEST_AGENT_ENDPOINT} + TABLE_NAME: ${self:custom.tableName} + # provider.iam.role.statements + + iam: + role: + statements: + - Effect: Allow + Action: + - dynamodb:DescribeTable + - dynamodb:Query + - dynamodb:Scan + - dynamodb:GetItem + - dynamodb:PutItem + - dynamodb:UpdateItem + - dynamodb:DeleteItem + Resource: + - "Fn::GetAtt": [PokemonsTable, Arn] + +functions: + api: + handler: src/handler.importPokemon + events: + - httpApi: + path: /import + method: post +resources: + # DynamoDB + - ${file(resources/dynamodb.yml)} diff --git a/examples/quick-start-serverless/src/dynamodb.ts b/examples/quick-start-serverless/src/dynamodb.ts new file mode 100644 index 0000000000..834bec89a0 --- /dev/null +++ b/examples/quick-start-serverless/src/dynamodb.ts @@ -0,0 +1,35 @@ +import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; +import { PutCommand, DynamoDBDocumentClient, GetCommand } from '@aws-sdk/lib-dynamodb'; + +const client = new DynamoDBClient({}); +const docClient = DynamoDBDocumentClient.from(client); + +const { TABLE_NAME = '' } = process.env; + +const DynamoDb = { + async put>(item: T): Promise { + const command = new PutCommand({ + TableName: TABLE_NAME, + Item: item, + }); + + const result = await docClient.send(command); + + return result.Attributes as T; + }, + + async get(id: number): Promise { + const command = new GetCommand({ + TableName: TABLE_NAME, + Key: { + id, + }, + }); + + const result = await docClient.send(command); + + return result.Item as T | undefined; + }, +}; + +export default DynamoDb; diff --git a/examples/quick-start-serverless/src/handler.ts b/examples/quick-start-serverless/src/handler.ts new file mode 100644 index 0000000000..93ca792369 --- /dev/null +++ b/examples/quick-start-serverless/src/handler.ts @@ -0,0 +1,49 @@ +import { APIGatewayEvent, Handler } from 'aws-lambda'; +import fetch from 'node-fetch'; +import { Pokemon, RawPokemon } from './types'; +import DynamoDb from './dynamodb'; + +const Pokemon = (raw: RawPokemon): Pokemon => ({ + id: raw.id, + name: raw.name, + types: raw.types.map((type) => type.type.name), + imageUrl: raw.sprites.front_default, +}); + +const getPokemon = async (id: string): Promise => { + const url = `https://pokeapi.co/api/v2/pokemon/${id}`; + const res = await fetch(url); + + const raw = await res.json(); + + return Pokemon(raw); +}; + +const insertPokemon = async (pokemon: Pokemon) => { + await DynamoDb.put(pokemon); + + return DynamoDb.get(pokemon.id); +}; + +type TBody = { id: string }; + +export const importPokemon: Handler = async (event) => { + console.log(event); + + const { id = '' } = JSON.parse(event.body || '') as TBody; + + try { + const pokemon = await getPokemon(id); + const result = await insertPokemon(pokemon); + + return { + statusCode: 200, + body: JSON.stringify(result), + }; + } catch (error) { + return { + statusCode: 400, + body: error.message, + }; + } +}; diff --git a/examples/quick-start-serverless/src/lambda-wrapper.ts b/examples/quick-start-serverless/src/lambda-wrapper.ts new file mode 100644 index 0000000000..c5f953f063 --- /dev/null +++ b/examples/quick-start-serverless/src/lambda-wrapper.ts @@ -0,0 +1,31 @@ +const api = require('@opentelemetry/api'); +const { BatchSpanProcessor } = require('@opentelemetry/sdk-trace-base'); +const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-grpc'); +const { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node'); +const { registerInstrumentations } = require('@opentelemetry/instrumentation'); +const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node'); + +api.diag.setLogger(new api.DiagConsoleLogger(), api.DiagLogLevel.ALL); + +const { COLLECTOR_ENDPOINT = '' } = process.env; + +const provider = new NodeTracerProvider(); + +const spanProcessor = new BatchSpanProcessor( + new OTLPTraceExporter({ + url: COLLECTOR_ENDPOINT, + }) +); + +provider.addSpanProcessor(spanProcessor); +provider.register(); + +registerInstrumentations({ + instrumentations: [ + getNodeAutoInstrumentations({ + '@opentelemetry/instrumentation-aws-lambda': { + disableAwsContextPropagation: true, + }, + }), + ], +}); diff --git a/examples/quick-start-serverless/src/types.ts b/examples/quick-start-serverless/src/types.ts new file mode 100644 index 0000000000..c92ee34885 --- /dev/null +++ b/examples/quick-start-serverless/src/types.ts @@ -0,0 +1,20 @@ +export type RawPokemon = { + id: number; + name: string; + types: Array<{ + type: { + name: string; + }; + }>; + sprites: { + front_default: string; + }; +}; + + +export type Pokemon = { + id: number; + name: string; + types: string[]; + imageUrl: string; +}; diff --git a/examples/quick-start-serverless/tracetest.ts b/examples/quick-start-serverless/tracetest.ts new file mode 100644 index 0000000000..01d3d9cd5d --- /dev/null +++ b/examples/quick-start-serverless/tracetest.ts @@ -0,0 +1,67 @@ +import Tracetest from '@tracetest/client'; +import { TestResource } from '@tracetest/client/dist/modules/openapi-client'; +import { config } from 'dotenv'; + +config(); + +const { TRACETEST_API_TOKEN = '', ENDPOINT = '' } = process.env; + +const definition: TestResource = { + type: 'Test', + spec: { + id: 'ZV1G3v2IR', + name: 'Serverless: Import Pokemon', + trigger: { + type: 'http', + httpRequest: { + method: 'POST', + url: '${var:ENDPOINT}/import', + body: '{"id": "${var:POKEMON_ID}"}\n', + headers: [ + { + key: 'Content-Type', + value: 'application/json', + }, + ], + }, + }, + specs: [ + { + selector: 'span[tracetest.span.type="database"]', + name: 'All Database Spans: Processing time is less than 100ms', + assertions: ['attr:tracetest.span.duration < 100ms'], + }, + { + selector: 'span[tracetest.span.type="http"]', + name: 'All HTTP Spans: Status code is 200', + assertions: ['attr:http.status_code = 200'], + }, + { + selector: 'span[name="tracetest-serverless-dev-api"] span[tracetest.span.type="http" name="GET" http.method="GET"]', + name: 'The request matches the pokemon Id', + assertions: ['attr:http.url = "https://pokeapi.co/api/v2/pokemon/${var:POKEMON_ID}"'], + }, + ], + }, +}; + +const main = async () => { + const tracetest = await Tracetest(TRACETEST_API_TOKEN); + + const test = await tracetest.newTest(definition); + await tracetest.runTest(test, { + variables: [ + { + key: 'ENDPOINT', + value: ENDPOINT.trim(), + }, + { + key: 'POKEMON_ID', + value: `${Math.floor(Math.random() * 100) + 1}`, + }, + ], + }); + console.log(await tracetest.getSummary()); +}; + +main(); diff --git a/examples/quick-start-serverless/tsconfig.json b/examples/quick-start-serverless/tsconfig.json new file mode 100644 index 0000000000..dd87475c37 --- /dev/null +++ b/examples/quick-start-serverless/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "preserveConstEnums": true, + "strictNullChecks": true, + "sourceMap": true, + "allowJs": true, + "target": "es5", + "outDir": ".build", + "moduleResolution": "node", + "lib": ["es2015"], + "rootDir": "./" + }, + "exclude": ["tracetest.ts"] +} From 5350e7a052296423c4fbbca016e02ad807048675 Mon Sep 17 00:00:00 2001 From: Oscar Reyes Date: Tue, 13 Feb 2024 11:41:33 -0600 Subject: [PATCH 4/4] Chore performance improvements (#3616) * chore(frontend): indentifying performance improvements * chore(frontend): identify performance improvements * feat(frontend): hide dag view for big traces (#3606) * Chore performance improvements tech debt 1 (#3607) * adding async functionality * chore(frontend): DAG improvements * chore(frontend): DAG improvements * chore(frontend): fixing spinner styles * chore(frontend): fixing spinner styles * feat(frontend): fixing tests * chore(frontend): fixing spinner styles * chore(frontend): FE Improvements for the Test View (#3613) * adding async functionality * chore(frontend): DAG improvements * chore(frontend): DAG improvements * chore(frontend): fixing spinner styles * chore(frontend): fixing spinner styles * feat(frontend): fixing tests * chore(frontend): fixing spinner styles * chore(frontend): FE Improvements for the Test View * chore(frontend): reverting editor changes * chore(frontend): Adding memoization for useComplete hook * chore(frontend): Adding Search Service usage * chore(frontend): cleanup * feat(frontend): implement virtual list for timeline view (#3617) * feat(frontend): implement virtual list for timeline view * remove prop * add header and collapse * feat: add timeline view connectors (#3623) * feat(frontend): Implemeting new Timeline for the Test Page (#3627) * feat(frontend): Implemeting new Timeline for the Test Page * feat(frontend): Fixing tests * feat(frontend): Fixing tests * Chore performance improvements span search (#3629) * feat(frontend): Implemeting new Timeline for the Test Page * feat(frontend): Implementing span search for analyzer and test views * feat(frontend): read improvements * feat(frontend): adding single line input component * feat(frontend): updating analyzer styles * feat(frontend): Fixing tests * feat(frontend): Fixing tests --------- Co-authored-by: Jorge Padilla --- .../e2e/TestRunDetail/CreateAssertion.spec.ts | 8 - web/cypress/support/commands.ts | 1 - web/docker-compose.yaml | 127 +++++++++++++++ web/package-lock.json | 42 +++++ web/package.json | 5 + .../AnalyzerResult/AnalyzerResult.styled.ts | 16 +- .../AnalyzerResult/AnalyzerResult.tsx | 10 +- web/src/components/AnalyzerResult/Plugins.tsx | 11 +- web/src/components/AnalyzerResult/Rule.tsx | 125 +++++---------- .../components/AnalyzerResult/RuleResult.tsx | 64 ++++++++ .../components/Fields/Auth/AuthApiKeyBase.tsx | 7 +- web/src/components/Fields/Auth/AuthBasic.tsx | 8 +- web/src/components/Fields/Auth/AuthBearer.tsx | 5 +- web/src/components/Fields/Headers/Headers.tsx | 7 +- .../Fields/KeyValueList/KeyValueList.tsx | 7 +- .../components/Fields/Metadata/Metadata.tsx | 7 +- .../components/Fields/MultiURL/MultiURL.tsx | 5 +- .../components/Fields/PlainAuth/Fields.tsx | 7 +- web/src/components/Fields/URL/URL.tsx | 6 +- .../Fields/VariableName/VariableName.tsx | 5 +- .../Expression/hooks/useAutoComplete.ts | 16 +- .../Inputs/Editor/Selector/Selector.tsx | 11 +- .../Editor/Selector/hooks/useAutoComplete.ts | 16 +- .../Inputs/SingleLine/SingleLine.tsx | 12 ++ web/src/components/Inputs/SingleLine/index.ts | 2 + .../LoadingSpinner/LoadingSpinner.styled.ts | 8 + web/src/components/LoadingSpinner/index.ts | 4 + .../components/RunDetailLayout/HeaderLeft.tsx | 21 +-- web/src/components/RunDetailTest/TestDAG.tsx | 62 ++++++++ .../components/RunDetailTest/TestPanel.tsx | 14 +- .../RunDetailTest/Visualization.tsx | 72 ++------- .../RunDetailTrace/AnalyzerPanel.tsx | 7 +- .../RunDetailTrace/RunDetailTrace.tsx | 5 + web/src/components/RunDetailTrace/Search.tsx | 27 +--- .../components/RunDetailTrace/TraceDAG.tsx | 61 +++++++ .../components/RunDetailTrace/TracePanel.tsx | 12 +- .../RunDetailTrace/Visualization.tsx | 68 +++----- .../TestPlugins/Forms/Kafka/Kafka.tsx | 5 +- .../components/TestResults/TestResults.tsx | 2 +- .../components/TestSpec/TestSpec.styled.ts | 1 + web/src/components/TestSpecDetail/Content.tsx | 85 +++++----- .../components/TestSpecDetail/ResultCard.tsx | 65 ++++++++ web/src/components/TestSpecDetail/Search.tsx | 70 ++++++++ .../components/TestSpecDetail/SpanHeader.tsx | 30 ++-- .../TestSpecDetail/TestSpecDetail.styled.ts | 25 ++- .../TestSpecDetail/TestSpecDetail.tsx | 59 +++---- .../components/TestSpecs/TestSpecs.styled.ts | 6 - web/src/components/TestSpecs/TestSpecs.tsx | 41 +++-- .../Visualization/components/DAG/DAG.tsx | 5 +- .../components/Navigation/Navigation.tsx | 1 + .../components/Switch/Switch.styled.ts | 7 +- .../components/Switch/Switch.tsx | 21 ++- .../Timeline/BaseSpanNode/BaseSpanNodeV2.tsx | 62 ++++++++ .../Timeline/BaseSpanNode/ConnectorV2.tsx | 56 +++++++ .../components/Timeline/Header.tsx | 22 +++ .../components/Timeline/ListWrapper.tsx | 33 ++++ .../components/Timeline/NavigationWrapper.tsx | 10 ++ .../components/Timeline/SpanNodeFactoryV2.tsx | 30 ++++ .../components/Timeline/Ticks/Ticks.styled.ts | 37 +++++ .../components/Timeline/Ticks/Ticks.tsx | 40 +++++ .../components/Timeline/Timeline.provider.tsx | 127 +++++++++++++++ .../components/Timeline/TimelineV2.styled.ts | 150 ++++++++++++++++++ .../components/Timeline/TimelineV2.tsx | 37 +++++ .../TraceSpanNode/TraceSpanNodeV2.tsx | 19 +++ web/src/constants/Timeline.constants.ts | 1 + web/src/constants/Visualization.constants.ts | 2 + web/src/hooks/useSpanData.ts | 2 + web/src/models/DAG.model.ts | 3 + web/src/models/SearchSpansResult.model.ts | 22 +++ web/src/models/Span.model.ts | 11 +- web/src/models/TestRun.model.ts | 4 +- web/src/models/Trace.model.ts | 25 ++- .../models/__tests__/TestRun.model.test.ts | 2 - .../providers/TestRun/TestRun.provider.tsx | 5 +- .../TestSpecs/TestSpecs.provider.tsx | 10 +- web/src/redux/actions/Router.actions.ts | 9 +- web/src/redux/actions/TestSpecs.actions.ts | 1 + .../Tracetest/endpoints/TestRun.endpoint.ts | 9 ++ web/src/redux/apis/Tracetest/index.ts | 2 + web/src/redux/slices/DAG.slice.ts | 15 +- web/src/redux/slices/Trace.slice.ts | 16 +- web/src/selectors/Assertion.selectors.ts | 2 +- web/src/selectors/Editor.selectors.ts | 26 +++ web/src/selectors/Span.selectors.ts | 4 +- web/src/selectors/TestRun.selectors.ts | 2 +- web/src/services/Analyzer.service.ts | 13 +- web/src/services/Assertion.service.ts | 3 +- web/src/services/DAG.service.ts | 17 +- web/src/services/Span.service.ts | 1 + web/src/services/TestRun.service.ts | 12 +- web/src/services/Timeline.service.ts | 18 +++ web/src/utils/Common.ts | 9 ++ web/src/utils/Date.ts | 44 +++++ 93 files changed, 1726 insertions(+), 501 deletions(-) create mode 100644 web/docker-compose.yaml create mode 100644 web/src/components/AnalyzerResult/RuleResult.tsx create mode 100644 web/src/components/Inputs/SingleLine/SingleLine.tsx create mode 100644 web/src/components/Inputs/SingleLine/index.ts create mode 100644 web/src/components/LoadingSpinner/LoadingSpinner.styled.ts create mode 100644 web/src/components/RunDetailTest/TestDAG.tsx create mode 100644 web/src/components/RunDetailTrace/TraceDAG.tsx create mode 100644 web/src/components/TestSpecDetail/ResultCard.tsx create mode 100644 web/src/components/TestSpecDetail/Search.tsx create mode 100644 web/src/components/Visualization/components/Timeline/BaseSpanNode/BaseSpanNodeV2.tsx create mode 100644 web/src/components/Visualization/components/Timeline/BaseSpanNode/ConnectorV2.tsx create mode 100644 web/src/components/Visualization/components/Timeline/Header.tsx create mode 100644 web/src/components/Visualization/components/Timeline/ListWrapper.tsx create mode 100644 web/src/components/Visualization/components/Timeline/NavigationWrapper.tsx create mode 100644 web/src/components/Visualization/components/Timeline/SpanNodeFactoryV2.tsx create mode 100644 web/src/components/Visualization/components/Timeline/Ticks/Ticks.styled.ts create mode 100644 web/src/components/Visualization/components/Timeline/Ticks/Ticks.tsx create mode 100644 web/src/components/Visualization/components/Timeline/Timeline.provider.tsx create mode 100644 web/src/components/Visualization/components/Timeline/TimelineV2.styled.ts create mode 100644 web/src/components/Visualization/components/Timeline/TimelineV2.tsx create mode 100644 web/src/components/Visualization/components/Timeline/TraceSpanNode/TraceSpanNodeV2.tsx create mode 100644 web/src/models/SearchSpansResult.model.ts create mode 100644 web/src/selectors/Editor.selectors.ts diff --git a/web/cypress/e2e/TestRunDetail/CreateAssertion.spec.ts b/web/cypress/e2e/TestRunDetail/CreateAssertion.spec.ts index d4ac6ae833..404641d870 100644 --- a/web/cypress/e2e/TestRunDetail/CreateAssertion.spec.ts +++ b/web/cypress/e2e/TestRunDetail/CreateAssertion.spec.ts @@ -48,7 +48,6 @@ describe('Create Assertion', () => { cy.get('[data-cy=assertion-form-submit-button]').click(); - cy.get('[data-cy=test-specs-container]').should('be.visible'); cy.get('[data-cy=test-spec-container]').should('have.lengthOf', 1); }); @@ -74,7 +73,6 @@ describe('Create Assertion', () => { cy.get('[data-cy=assertion-form-submit-button]').click(); - cy.get('[data-cy=test-specs-container]').should('be.visible'); cy.get('[data-cy=test-spec-container]').should('have.lengthOf', 1); }); @@ -98,8 +96,6 @@ describe('Create Assertion', () => { cy.selectOperator(1); cy.get('[data-cy=assertion-form-submit-button]').click(); - - cy.get('[data-cy=test-specs-container]').should('be.visible'); cy.get('[data-cy=test-spec-container]').should('have.lengthOf', 1); }); @@ -124,8 +120,6 @@ describe('Create Assertion', () => { cy.selectOperator(1); cy.get('[data-cy=assertion-form-submit-button]').click(); - - cy.get('[data-cy=test-specs-container]').should('be.visible'); cy.get('[data-cy=test-spec-container]').should('have.lengthOf', 1); }); @@ -151,9 +145,7 @@ describe('Create Assertion', () => { cy.get('[data-cy=assertion-form-submit-button]').click(); - cy.get('[data-cy=test-specs-container]').should('exist'); cy.get('[data-cy=test-spec-container]').should('have.lengthOf', 2); - cy.get('[data-cy=trace-actions-revert-all').click(); cy.get('[data-cy=test-spec-container]').should('have.lengthOf', 0); }); diff --git a/web/cypress/support/commands.ts b/web/cypress/support/commands.ts index 62a6d24621..8e14833ba4 100644 --- a/web/cypress/support/commands.ts +++ b/web/cypress/support/commands.ts @@ -224,7 +224,6 @@ Cypress.Commands.add('createAssertion', () => { cy.get('[data-cy=assertion-check-operator]').click({force: true}); cy.get('[data-cy=assertion-form-submit-button]').click(); - cy.get('[data-cy=test-specs-container]').should('be.visible'); cy.get('[data-cy=test-spec-container]').should('have.lengthOf', 1); }); diff --git a/web/docker-compose.yaml b/web/docker-compose.yaml new file mode 100644 index 0000000000..e9cfa7ef85 --- /dev/null +++ b/web/docker-compose.yaml @@ -0,0 +1,127 @@ +version: '3.2' +services: + tracetest: + restart: unless-stopped + image: kubeshop/tracetest:${TAG:-latest} + extra_hosts: + - 'host.docker.internal:host-gateway' + build: + context: . + volumes: + - type: bind + source: ../local-config/tracetest.config.yaml + target: /app/tracetest.yaml + - type: bind + source: ../local-config/tracetest.provision.yaml + target: /app/provisioning.yaml + ports: + - 11633:11633 + command: --provisioning-file /app/provisioning.yaml + healthcheck: + test: ['CMD', 'wget', '--spider', 'localhost:11633'] + interval: 1s + timeout: 3s + retries: 60 + depends_on: + postgres: + condition: service_healthy + environment: + TRACETEST_DEV: ${TRACETEST_DEV} + TRACETEST_TESTPIPELINES_TRIGGEREXECUTE_ENABLED: ${TRACETEST_TESTPIPELINES_TRIGGEREXECUTE_ENABLED} + TRACETEST_TESTPIPELINES_TRACEFETCH_ENABLED: ${TRACETEST_TESTPIPELINES_TRACEFETCH_ENABLED} + TRACETEST_DATASTOREPIPELINES_TESTCONNECTION_ENABLED: ${TRACETEST_DATASTOREPIPELINES_TESTCONNECTION_ENABLED} + + postgres: + image: postgres:15.2 + environment: + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + ports: + - 5432:5432 + healthcheck: + test: pg_isready -U "$$POSTGRES_USER" -d "$$POSTGRES_DB" + interval: 1s + timeout: 5s + retries: 60 + + otel-collector: + image: otel/opentelemetry-collector-contrib:0.59.0 + extra_hosts: + - 'host.docker.internal:host-gateway' + ports: + - '4317:4317' + command: + - '--config' + - '/otel-local-config.yaml' + volumes: + - ../local-config/collector.config.yaml:/otel-local-config.yaml + depends_on: + - tracetest + + cache: + image: redis:6 + ports: + - 6379:6379 + healthcheck: + test: ['CMD', 'redis-cli', 'ping'] + interval: 1s + timeout: 3s + retries: 60 + + queue: + image: rabbitmq:3.12 + restart: unless-stopped + ports: + - 5672:5672 + - 15672:15672 + healthcheck: + test: rabbitmq-diagnostics -q check_running + interval: 1s + timeout: 5s + retries: 60 + + demo-api: + image: kubeshop/demo-pokemon-api:latest + restart: unless-stopped + pull_policy: always + environment: + REDIS_URL: cache + DATABASE_URL: postgresql://postgres:postgres@postgres:5432/postgres?schema=public + RABBITMQ_HOST: queue + POKE_API_BASE_URL: https://pokeapi.co/api/v2 + COLLECTOR_ENDPOINT: http://otel-collector:4317 + NPM_RUN_COMMAND: api + healthcheck: + test: ['CMD', 'wget', '--spider', 'localhost:8081'] + interval: 1s + timeout: 3s + retries: 60 + ports: + - 8081:8081 + depends_on: + postgres: + condition: service_healthy + cache: + condition: service_healthy + queue: + condition: service_healthy + + worker: + image: kubeshop/demo-pokemon-api:latest + restart: unless-stopped + pull_policy: always + environment: + REDIS_URL: cache + DATABASE_URL: postgresql://postgres:postgres@postgres:5432/postgres?schema=public + RABBITMQ_HOST: queue + POKE_API_BASE_URL: https://pokeapi.co/api/v2 + COLLECTOR_ENDPOINT: http://otel-collector:4317 + NPM_RUN_COMMAND: worker + depends_on: + postgres: + condition: service_healthy + cache: + condition: service_healthy + queue: + condition: service_healthy + diff --git a/web/package-lock.json b/web/package-lock.json index 2bcb1b0ac0..d356e453f8 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -60,6 +60,8 @@ "react-scripts": "5.0.1", "react-spaces": "0.3.8", "react-syntax-highlighter": "15.5.0", + "react-virtualized-auto-sizer": "1.0.22", + "react-window": "1.8.10", "redux-first-history": "5.0.12", "styled-components": "5.3.3", "typescript": "5.0.2" @@ -77,6 +79,7 @@ "@types/lodash": "4.14.181", "@types/postman-collection": "3.5.7", "@types/react-syntax-highlighter": "15.5.7", + "@types/react-window": "1.8.8", "@types/styled-components": "5.1.21", "concurrently": "7.2.1", "cypress": "13.2.0", @@ -7535,6 +7538,15 @@ "@types/react": "*" } }, + "node_modules/@types/react-window": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.8.tgz", + "integrity": "sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/resolve": { "version": "1.17.1", "license": "MIT", @@ -21170,6 +21182,36 @@ "react": ">= 0.14.0" } }, + "node_modules/react-virtualized-auto-sizer": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.22.tgz", + "integrity": "sha512-2CGT/4rZ6jvVkKqzJGnZlyQxj4rWPKAwZR80vMlmpYToN18xaB0yIODOoBltWZLbSgpHBpIk0Ae1nrVO9hVClA==", + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-window": { + "version": "1.8.10", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.10.tgz", + "integrity": "sha512-Y0Cx+dnU6NLa5/EvoHukUD0BklJ8qITCtVEPY1C/nL8wwoZ0b5aEw8Ff1dOVHw7fCzMt55XfJDd8S8W8LCaUCg==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-window/node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, "node_modules/readable-stream": { "version": "3.6.0", "license": "MIT", diff --git a/web/package.json b/web/package.json index b641c4f128..7050ec53a1 100644 --- a/web/package.json +++ b/web/package.json @@ -56,6 +56,8 @@ "react-scripts": "5.0.1", "react-spaces": "0.3.8", "react-syntax-highlighter": "15.5.0", + "react-virtualized-auto-sizer": "1.0.22", + "react-window": "1.8.10", "redux-first-history": "5.0.12", "styled-components": "5.3.3", "typescript": "5.0.2" @@ -81,6 +83,8 @@ "cy:open": "cypress open", "cy:run": "cypress run", "cy:ci": "cypress run --parallel --record --key $CYPRESS_RECORD_KEY", + "cy:local:run": "POKEMON_HTTP_ENDPOINT=http://demo-api:8081 cypress run", + "cy:local:open": "POKEMON_HTTP_ENDPOINT=http://demo-api:8081 cypress open", "prettier": "prettier --write ./src", "less": "lessc --js src/antd-theme/antd-customized.less src/antd-theme/antd-customized.css" }, @@ -122,6 +126,7 @@ "@types/lodash": "4.14.181", "@types/postman-collection": "3.5.7", "@types/react-syntax-highlighter": "15.5.7", + "@types/react-window": "1.8.8", "@types/styled-components": "5.1.21", "concurrently": "7.2.1", "cypress": "13.2.0", diff --git a/web/src/components/AnalyzerResult/AnalyzerResult.styled.ts b/web/src/components/AnalyzerResult/AnalyzerResult.styled.ts index a04f33a243..cf3d442393 100644 --- a/web/src/components/AnalyzerResult/AnalyzerResult.styled.ts +++ b/web/src/components/AnalyzerResult/AnalyzerResult.styled.ts @@ -47,27 +47,19 @@ export const GlobalScoreContainer = styled.div` justify-content: center; `; -export const RuleContainer = styled.div` - border-bottom: ${({theme}) => `1px dashed ${theme.color.borderLight}`}; - padding-bottom: 16px; - margin-bottom: 16px; - margin-left: 43px; -`; - export const RuleHeader = styled.div` display: flex; flex-direction: row; justify-content: space-between; `; -export const Column = styled.div` - display: flex; - flex-direction: column; - margin-bottom: 8px; +export const Column = styled(RuleHeader)` + width: 95%; `; -export const RuleBody = styled(Column)` +export const RuleBody = styled(Column)<{$resultCount: number}>` padding-left: 20px; + height: ${({$resultCount}) => ($resultCount > 10 ? '100vh' : `${$resultCount * 32}px`)}; `; export const Subtitle = styled(Typography.Title)` diff --git a/web/src/components/AnalyzerResult/AnalyzerResult.tsx b/web/src/components/AnalyzerResult/AnalyzerResult.tsx index 08e66870de..45f21a36ed 100644 --- a/web/src/components/AnalyzerResult/AnalyzerResult.tsx +++ b/web/src/components/AnalyzerResult/AnalyzerResult.tsx @@ -2,7 +2,6 @@ import BetaBadge from 'components/BetaBadge/BetaBadge'; import Link from 'components/Link'; import {COMMUNITY_SLACK_URL, OCTOLIINT_ISSUE_URL} from 'constants/Common.constants'; import LinterResult from 'models/LinterResult.model'; -import Trace from 'models/Trace.model'; import {useSettingsValues} from 'providers/SettingsValues/SettingsValues.provider'; import * as S from './AnalyzerResult.styled'; import Empty from './Empty'; @@ -11,10 +10,9 @@ import Plugins from './Plugins'; interface IProps { result: LinterResult; - trace: Trace; } -const AnalyzerResult = ({result: {score, minimumScore, plugins = [], passed}, trace}: IProps) => { +const AnalyzerResult = ({result: {score, minimumScore, plugins = [], passed}}: IProps) => { const {linter} = useSettingsValues(); return ( @@ -31,13 +29,13 @@ const AnalyzerResult = ({result: {score, minimumScore, plugins = [], passed}, tr It can be globally disabled for all tests in the settings page.{' '} )} - We value your feedback on this beta release. Share your thoughts on Slack or add - them to this Issue. + We value your feedback on this beta release. Share your thoughts on Slack or + add them to this Issue. {plugins.length ? ( <> - + ) : ( diff --git a/web/src/components/AnalyzerResult/Plugins.tsx b/web/src/components/AnalyzerResult/Plugins.tsx index 4f6a347d21..a88d9e30e0 100644 --- a/web/src/components/AnalyzerResult/Plugins.tsx +++ b/web/src/components/AnalyzerResult/Plugins.tsx @@ -1,7 +1,8 @@ import {Space, Switch, Typography} from 'antd'; import {useState} from 'react'; import {LinterResultPlugin} from 'models/LinterResult.model'; -import Trace from 'models/Trace.model'; +import {useAppSelector} from 'redux/hooks'; +import TraceSelectors from 'selectors/Trace.selectors'; import TraceAnalyzerAnalytics from 'services/Analytics/TraceAnalyzer.service'; import AnalyzerService from 'services/Analyzer.service'; import * as S from './AnalyzerResult.styled'; @@ -11,12 +12,12 @@ import Collapse, {CollapsePanel} from '../Collapse'; interface IProps { plugins: LinterResultPlugin[]; - trace: Trace; } -const Plugins = ({plugins: rawPlugins, trace}: IProps) => { +const Plugins = ({plugins: rawPlugins}: IProps) => { const [onlyErrors, setOnlyErrors] = useState(false); - const plugins = AnalyzerService.getPlugins(rawPlugins, onlyErrors); + const matchedSpans = useAppSelector(TraceSelectors.selectMatchedSpans); + const plugins = AnalyzerService.getPlugins(rawPlugins, onlyErrors, matchedSpans); return ( <> @@ -38,7 +39,7 @@ const Plugins = ({plugins: rawPlugins, trace}: IProps) => { key={plugin.name} > {plugin.rules.map(rule => ( - + ))} ))} diff --git a/web/src/components/AnalyzerResult/Rule.tsx b/web/src/components/AnalyzerResult/Rule.tsx index 9480e0f04e..dbf81025ba 100644 --- a/web/src/components/AnalyzerResult/Rule.tsx +++ b/web/src/components/AnalyzerResult/Rule.tsx @@ -1,103 +1,54 @@ -import {useCallback} from 'react'; -import {CaretUpFilled} from '@ant-design/icons'; +import {FixedSizeList as List} from 'react-window'; +import AutoSizer, {Size} from 'react-virtualized-auto-sizer'; import {Space, Tooltip, Typography} from 'antd'; +import {PercentageOutlined} from '@ant-design/icons'; import {LinterResultPluginRule} from 'models/LinterResult.model'; -import Trace from 'models/Trace.model'; -import Span from 'models/Span.model'; import {LinterRuleErrorLevel} from 'models/Linter.model'; -import {useAppDispatch} from 'redux/hooks'; -import {selectSpan} from 'redux/slices/Trace.slice'; -import TraceAnalyzerAnalytics from 'services/Analytics/TraceAnalyzer.service'; import * as S from './AnalyzerResult.styled'; import RuleIcon from './RuleIcon'; -import RuleLink from './RuleLink'; +import RuleResult from './RuleResult'; +import Collapse, {CollapsePanel} from '../Collapse'; interface IProps { rule: LinterResultPluginRule; - trace: Trace; } -function getSpanName(spans: Span[], spanId: string) { - const span = spans.find(s => s.id === spanId); - return span?.name ?? ''; -} - -const Rule = ({ - rule: {id, tips, passed, description, name, errorDescription, results = [], level, weight = 0}, - trace, -}: IProps) => { - const dispatch = useAppDispatch(); - - const onSpanResultClick = useCallback( - (spanId: string) => { - TraceAnalyzerAnalytics.onSpanNameClick(); - dispatch(selectSpan({spanId})); - }, - [dispatch] - ); - +const Rule = ({rule: {tips, id, passed, description, name, level, results, weight = 0}, rule}: IProps) => { return ( - - - - - - - {name} - - - - - {description} - - {level === LinterRuleErrorLevel.ERROR && ( - - Weight: {weight} - - )} - - - - {results?.map((result, resultIndex) => ( - // eslint-disable-next-line react/no-array-index-key -

- } - onClick={() => onSpanResultClick(result.spanId)} - type="link" - $error={!result.passed} - > - {getSpanName(trace.spans, result.spanId)} - - - {!result.passed && result.errors.length > 1 && ( - <> -
- {errorDescription} -
- - {result.errors.map(error => ( -
  • - - {error.value} - -
  • - ))} -
    - + + + + + + + {name} + + {description} + + + {level === LinterRuleErrorLevel.ERROR && ( + + {weight} + + )} - - {!result.passed && result.errors.length === 1 && ( -
    - {result.errors[0].description} -
    + + } + key={id} + > + + + {({height, width}: Size) => ( + + {RuleResult} + )} - - {!result.passed && } -
    - ))} - - + + + + ); }; diff --git a/web/src/components/AnalyzerResult/RuleResult.tsx b/web/src/components/AnalyzerResult/RuleResult.tsx new file mode 100644 index 0000000000..89a42f8bd1 --- /dev/null +++ b/web/src/components/AnalyzerResult/RuleResult.tsx @@ -0,0 +1,64 @@ +import {Tooltip, Typography} from 'antd'; +import {CaretUpFilled} from '@ant-design/icons'; +import {useCallback, useMemo} from 'react'; +import {LinterResultPluginRule} from 'models/LinterResult.model'; +import {useAppDispatch} from 'redux/hooks'; +import {selectSpan} from 'redux/slices/Trace.slice'; +import {useTestRun} from 'providers/TestRun/TestRun.provider'; +import TraceAnalyzerAnalytics from 'services/Analytics/TraceAnalyzer.service'; +import * as S from './AnalyzerResult.styled'; +import RuleLink from './RuleLink'; + +interface IProps { + index: number; + data: LinterResultPluginRule; + style: React.CSSProperties; +} + +const RuleResult = ({index, data: {results, id, errorDescription}, style}: IProps) => { + const {spanId, passed, errors} = useMemo(() => results[index], [results, index]); + const dispatch = useAppDispatch(); + const { + run: {trace}, + } = useTestRun(); + + const onClick = useCallback(() => { + TraceAnalyzerAnalytics.onSpanNameClick(); + dispatch(selectSpan({spanId})); + }, [dispatch, spanId]); + + return ( +
    + } onClick={onClick} type="link" $error={!passed}> + {trace.flat[spanId].name ?? ''} + + + {!passed && errors.length > 1 && ( + <> +
    + {errorDescription} +
    + + {errors.map(error => ( +
  • + + {error.value} + +
  • + ))} +
    + + )} + + {!passed && errors.length === 1 && ( +
    + {errors[0].description} +
    + )} + + {!passed && } +
    + ); +}; + +export default RuleResult; diff --git a/web/src/components/Fields/Auth/AuthApiKeyBase.tsx b/web/src/components/Fields/Auth/AuthApiKeyBase.tsx index feb938f702..46d045fc76 100644 --- a/web/src/components/Fields/Auth/AuthApiKeyBase.tsx +++ b/web/src/components/Fields/Auth/AuthApiKeyBase.tsx @@ -1,7 +1,6 @@ import {Form} from 'antd'; -import {Editor} from 'components/Inputs'; -import {SupportedEditors} from 'constants/Editor.constants'; import * as S from './Auth.styled'; +import SingleLine from '../../Inputs/SingleLine'; interface IProps { baseName: string[]; @@ -17,7 +16,7 @@ const AuthApiKeyBase = ({baseName}: IProps) => ( label="Key" rules={[{required: true}]} > - + ( label="Value" rules={[{required: true}]} > - + diff --git a/web/src/components/Fields/Auth/AuthBasic.tsx b/web/src/components/Fields/Auth/AuthBasic.tsx index d8444a84ef..c98d055873 100644 --- a/web/src/components/Fields/Auth/AuthBasic.tsx +++ b/web/src/components/Fields/Auth/AuthBasic.tsx @@ -1,8 +1,6 @@ import {Form} from 'antd'; -import React from 'react'; -import {Editor} from 'components/Inputs'; -import {SupportedEditors} from 'constants/Editor.constants'; import * as S from './Auth.styled'; +import SingleLine from '../../Inputs/SingleLine'; interface IProps { baseName: string[]; @@ -18,7 +16,7 @@ const AuthBasic = ({baseName}: IProps) => ( label="Username" rules={[{required: true}]} > - + ( data-cy="basic-password" rules={[{required: true}]} > - + diff --git a/web/src/components/Fields/Auth/AuthBearer.tsx b/web/src/components/Fields/Auth/AuthBearer.tsx index 7f22363f58..37a6e8f10f 100644 --- a/web/src/components/Fields/Auth/AuthBearer.tsx +++ b/web/src/components/Fields/Auth/AuthBearer.tsx @@ -1,6 +1,5 @@ import {Form} from 'antd'; -import {Editor} from 'components/Inputs'; -import {SupportedEditors} from 'constants/Editor.constants'; +import SingleLine from '../../Inputs/SingleLine'; interface IProps { baseName: string[]; @@ -8,7 +7,7 @@ interface IProps { const AuthBearer = ({baseName}: IProps) => ( - + ); diff --git a/web/src/components/Fields/Headers/Headers.tsx b/web/src/components/Fields/Headers/Headers.tsx index de8462e793..e1fa486ff7 100644 --- a/web/src/components/Fields/Headers/Headers.tsx +++ b/web/src/components/Fields/Headers/Headers.tsx @@ -1,9 +1,8 @@ import {PlusOutlined} from '@ant-design/icons'; import {Button, Form} from 'antd'; import {DEFAULT_HEADERS, IKeyValue} from 'constants/Test.constants'; -import {Editor} from 'components/Inputs'; -import {SupportedEditors} from 'constants/Editor.constants'; import * as S from './Headers.styled'; +import SingleLine from '../../Inputs/SingleLine'; interface IProps { initialValue?: IKeyValue[]; @@ -26,11 +25,11 @@ const Headers = ({ {fields.map((field, index) => ( - + - + diff --git a/web/src/components/Fields/KeyValueList/KeyValueList.tsx b/web/src/components/Fields/KeyValueList/KeyValueList.tsx index 4d0efbf6f4..809d719b15 100644 --- a/web/src/components/Fields/KeyValueList/KeyValueList.tsx +++ b/web/src/components/Fields/KeyValueList/KeyValueList.tsx @@ -1,9 +1,8 @@ import {PlusOutlined} from '@ant-design/icons'; import {Button, Form} from 'antd'; -import {Editor} from 'components/Inputs'; -import {SupportedEditors} from 'constants/Editor.constants'; import {IKeyValue} from 'constants/Test.constants'; import * as S from './KeyValueList.styled'; +import SingleLine from '../../Inputs/SingleLine'; interface IProps { name?: string; @@ -31,13 +30,13 @@ const KeyValueList = ({ - + - + diff --git a/web/src/components/Fields/Metadata/Metadata.tsx b/web/src/components/Fields/Metadata/Metadata.tsx index af006b56d9..44019ca0c2 100644 --- a/web/src/components/Fields/Metadata/Metadata.tsx +++ b/web/src/components/Fields/Metadata/Metadata.tsx @@ -1,8 +1,7 @@ import {PlusOutlined} from '@ant-design/icons'; import {Button, Form} from 'antd'; -import {SupportedEditors} from 'constants/Editor.constants'; -import {Editor} from 'components/Inputs'; import * as S from './Metadata.styled'; +import SingleLine from '../../Inputs/SingleLine'; const Metadata = () => ( @@ -13,13 +12,13 @@ const Metadata = () => ( - + - + diff --git a/web/src/components/Fields/MultiURL/MultiURL.tsx b/web/src/components/Fields/MultiURL/MultiURL.tsx index 8648829153..436e31b4bd 100644 --- a/web/src/components/Fields/MultiURL/MultiURL.tsx +++ b/web/src/components/Fields/MultiURL/MultiURL.tsx @@ -1,8 +1,7 @@ import {PlusOutlined} from '@ant-design/icons'; import {Button, Form} from 'antd'; -import {SupportedEditors} from 'constants/Editor.constants'; -import {Editor} from 'components/Inputs'; import * as S from './MultiURL.styled'; +import SingleLine from '../../Inputs/SingleLine'; interface IProps { name?: string[]; @@ -24,7 +23,7 @@ const MultiURL = ({name = ['brokerUrls']}: IProps) => ( {fields.map((field, index) => ( - + {!isFirstItem(index) && ( diff --git a/web/src/components/Fields/PlainAuth/Fields.tsx b/web/src/components/Fields/PlainAuth/Fields.tsx index fce6259126..c1842f392e 100644 --- a/web/src/components/Fields/PlainAuth/Fields.tsx +++ b/web/src/components/Fields/PlainAuth/Fields.tsx @@ -1,7 +1,6 @@ import {Form} from 'antd'; -import {Editor} from 'components/Inputs'; -import {SupportedEditors} from 'constants/Editor.constants'; import * as S from './PlainAuth.styled'; +import SingleLine from '../../Inputs/SingleLine'; interface IProps { baseName: string[]; @@ -17,7 +16,7 @@ const Fields = ({baseName}: IProps) => ( rules={[{required: true}]} style={{flexBasis: '50%', overflow: 'hidden'}} > - + ( rules={[{required: true}]} style={{flexBasis: '50%', overflow: 'hidden'}} > - + diff --git a/web/src/components/Fields/URL/URL.tsx b/web/src/components/Fields/URL/URL.tsx index 69546d47c5..aee4ef6b65 100644 --- a/web/src/components/Fields/URL/URL.tsx +++ b/web/src/components/Fields/URL/URL.tsx @@ -1,7 +1,7 @@ import {Col, Form, Row, Select} from 'antd'; import {HTTP_METHOD} from 'constants/Common.constants'; -import {SupportedEditors} from 'constants/Editor.constants'; -import {Editor, DockerTip} from 'components/Inputs'; +import {DockerTip} from 'components/Inputs'; +import SingleLine from '../../Inputs/SingleLine'; interface IProps { showMethodSelector?: boolean; @@ -37,7 +37,7 @@ const URL = ({showMethodSelector = true}: IProps) => ( rules={[{required: true, message: 'Please enter a valid URL'}]} style={{marginBottom: 0}} > - + diff --git a/web/src/components/Fields/VariableName/VariableName.tsx b/web/src/components/Fields/VariableName/VariableName.tsx index cc9dc10b55..8f23aa6433 100644 --- a/web/src/components/Fields/VariableName/VariableName.tsx +++ b/web/src/components/Fields/VariableName/VariableName.tsx @@ -1,6 +1,5 @@ import {Form} from 'antd'; -import {Editor} from 'components/Inputs'; -import {SupportedEditors} from 'constants/Editor.constants'; +import SingleLine from '../../Inputs/SingleLine'; const VariableName = () => ( ( rules={[{required: true, message: 'Please enter a valid variable name'}]} style={{marginBottom: 0}} > - + ); diff --git a/web/src/components/Inputs/Editor/Expression/hooks/useAutoComplete.ts b/web/src/components/Inputs/Editor/Expression/hooks/useAutoComplete.ts index 981aef66b5..ea25aaebb0 100644 --- a/web/src/components/Inputs/Editor/Expression/hooks/useAutoComplete.ts +++ b/web/src/components/Inputs/Editor/Expression/hooks/useAutoComplete.ts @@ -1,10 +1,9 @@ import {useCallback} from 'react'; -import {noop, uniqBy} from 'lodash'; +import {noop} from 'lodash'; import {Completion, CompletionContext} from '@codemirror/autocomplete'; import {useAppStore} from 'redux/hooks'; -import AssertionSelectors from 'selectors/Assertion.selectors'; import VariableSetSelectors from 'selectors/VariableSet.selectors'; -import SpanSelectors from 'selectors/Span.selectors'; +import {selectExpressionAttributeList} from 'selectors/Editor.selectors'; import EditorService from 'services/Editor.service'; import {SupportedEditors} from 'constants/Editor.constants'; @@ -18,13 +17,10 @@ interface IProps { const useAutoComplete = ({testId, runId, onSelect = noop, autocompleteCustomValues}: IProps) => { const {getState} = useAppStore(); - const getAttributeList = useCallback(() => { - const state = getState(); - const spanIdList = SpanSelectors.selectMatchedSpans(state); - const attributeList = AssertionSelectors.selectAttributeList(state, testId, runId, spanIdList); - - return uniqBy(attributeList, 'key'); - }, [getState, runId, testId]); + const getAttributeList = useCallback( + () => selectExpressionAttributeList(getState(), testId, runId), + [getState, runId, testId] + ); const getSelectedVariableSetEntryList = useCallback(() => { const state = getState(); diff --git a/web/src/components/Inputs/Editor/Selector/Selector.tsx b/web/src/components/Inputs/Editor/Selector/Selector.tsx index 960c52a277..fd29cab398 100644 --- a/web/src/components/Inputs/Editor/Selector/Selector.tsx +++ b/web/src/components/Inputs/Editor/Selector/Selector.tsx @@ -1,5 +1,6 @@ import {autocompletion} from '@codemirror/autocomplete'; import {linter} from '@codemirror/lint'; +import {EditorState} from '@codemirror/state'; import {EditorView} from '@codemirror/view'; import CodeMirror from '@uiw/react-codemirror'; import {useMemo} from 'react'; @@ -31,7 +32,13 @@ const Selector = ({ const editorTheme = useEditorTheme(); const extensionList = useMemo( - () => [autocompletion({override: [completionFn]}), linter(lintFn), selectorQL(), EditorView.lineWrapping], + () => [ + autocompletion({override: [completionFn]}), + linter(lintFn), + selectorQL(), + EditorView.lineWrapping, + EditorState.transactionFilter.of(tr => (tr.newDoc.lines > 1 ? [] : tr)), + ], [completionFn, lintFn] ); @@ -39,7 +46,7 @@ const Selector = ({ { const {getState} = useAppStore(); - const getAttributeList = useCallback(() => { - const state = getState(); - const defaultList = AssertionSelectors.selectAllAttributeList(state, testId, runId); - - return defaultList; - }, [getState, runId, testId]); + const getAttributeList = useCallback( + () => selectSelectorAttributeList(getState(), testId, runId), + [getState, runId, testId] + ); return useCallback( async (context: CompletionContext) => { @@ -55,7 +53,9 @@ const useAutoComplete = ({testId, runId}: IProps) => { const uniqueList = uniqBy(attributeList, 'key'); const identifierText = state.doc.sliceString(nodeBefore.from, nodeBefore.to); const isIdentifier = nodeBefore.name === Tokens.Identifier; - const list = isIdentifier ? uniqueList.filter(({key}) => key.toLowerCase().includes(identifierText.toLowerCase())) : uniqueList; + const list = isIdentifier + ? uniqueList.filter(({key}) => key.toLowerCase().includes(identifierText.toLowerCase())) + : uniqueList; return { from: isIdentifier ? nodeBefore.from : word.from, diff --git a/web/src/components/Inputs/SingleLine/SingleLine.tsx b/web/src/components/Inputs/SingleLine/SingleLine.tsx new file mode 100644 index 0000000000..c6c540a982 --- /dev/null +++ b/web/src/components/Inputs/SingleLine/SingleLine.tsx @@ -0,0 +1,12 @@ +import {EditorState} from '@codemirror/state'; +import {Editor} from 'components/Inputs'; +import {SupportedEditors} from 'constants/Editor.constants'; +import {IEditorProps} from '../Editor/Editor'; + +const extensions = [EditorState.transactionFilter.of(tr => (tr.newDoc.lines > 1 ? [] : tr))]; + +const SingleLine = (props: IEditorProps) => ( + +); + +export default SingleLine; diff --git a/web/src/components/Inputs/SingleLine/index.ts b/web/src/components/Inputs/SingleLine/index.ts new file mode 100644 index 0000000000..42ff2f26a5 --- /dev/null +++ b/web/src/components/Inputs/SingleLine/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export {default} from './SingleLine'; diff --git a/web/src/components/LoadingSpinner/LoadingSpinner.styled.ts b/web/src/components/LoadingSpinner/LoadingSpinner.styled.ts new file mode 100644 index 0000000000..04c78890e0 --- /dev/null +++ b/web/src/components/LoadingSpinner/LoadingSpinner.styled.ts @@ -0,0 +1,8 @@ +import styled from 'styled-components'; + +export const SpinnerContainer = styled.div` + height: 100%; + display: flex; + align-items: center; + justify-content: center; +`; diff --git a/web/src/components/LoadingSpinner/index.ts b/web/src/components/LoadingSpinner/index.ts index 6e7f1055ec..b2e5482e70 100644 --- a/web/src/components/LoadingSpinner/index.ts +++ b/web/src/components/LoadingSpinner/index.ts @@ -1,2 +1,6 @@ +import {SpinnerContainer} from './LoadingSpinner.styled'; + +export {SpinnerContainer}; + // eslint-disable-next-line no-restricted-exports export {default} from './LoadingSpinner'; diff --git a/web/src/components/RunDetailLayout/HeaderLeft.tsx b/web/src/components/RunDetailLayout/HeaderLeft.tsx index e719fd5c3b..a52e6f039b 100644 --- a/web/src/components/RunDetailLayout/HeaderLeft.tsx +++ b/web/src/components/RunDetailLayout/HeaderLeft.tsx @@ -3,13 +3,13 @@ import {useDashboard} from 'providers/Dashboard/Dashboard.provider'; import {useTest} from 'providers/Test/Test.provider'; import {useTestRun} from 'providers/TestRun/TestRun.provider'; import {useMemo} from 'react'; -import Date from 'utils/Date'; import {isRunStateFinished} from 'models/TestRun.model'; import {TDraftTest} from 'types/Test.types'; import TestService from 'services/Test.service'; import HeaderForm from './HeaderForm'; import Info from './Info'; import * as S from './RunDetailLayout.styled'; +import TestRunService from '../../services/TestRun.service'; interface IProps { name: string; @@ -18,21 +18,8 @@ interface IProps { } const HeaderLeft = ({name, triggerType, origin}: IProps) => { - const { - run: { - createdAt, - testSuiteId, - testSuiteRunId, - executionTime, - trace, - traceId, - testVersion, - metadata: {source} = {}, - } = {}, - run, - } = useTestRun(); + const {run: {createdAt, testSuiteId, testSuiteRunId, executionTime, trace, traceId} = {}, run} = useTestRun(); const {onEdit, isEditLoading: isLoading, test} = useTest(); - const createdTimeAgo = Date.getTimeAgo(createdAt ?? ''); const {navigate} = useDashboard(); const stateIsFinished = isRunStateFinished(run.state); @@ -44,7 +31,7 @@ const HeaderLeft = ({name, triggerType, origin}: IProps) => { const description = useMemo(() => { return ( <> - v{testVersion} • {triggerType} • Ran {createdTimeAgo} {source && <>• Run via {source.toUpperCase()}} + {TestRunService.getHeaderInfo(run, triggerType)} {testSuiteId && !!testSuiteRunId && ( <> {' '} @@ -56,7 +43,7 @@ const HeaderLeft = ({name, triggerType, origin}: IProps) => { )} ); - }, [testVersion, triggerType, createdTimeAgo, source, testSuiteId, testSuiteRunId]); + }, [run, triggerType, testSuiteId, testSuiteRunId]); return ( diff --git a/web/src/components/RunDetailTest/TestDAG.tsx b/web/src/components/RunDetailTest/TestDAG.tsx new file mode 100644 index 0000000000..3597fe4893 --- /dev/null +++ b/web/src/components/RunDetailTest/TestDAG.tsx @@ -0,0 +1,62 @@ +import {useCallback, useEffect} from 'react'; +import {Node, NodeChange} from 'react-flow-renderer'; + +import DAG from 'components/Visualization/components/DAG'; +import {useSpan} from 'providers/Span/Span.provider'; +import {useAppDispatch, useAppSelector} from 'redux/hooks'; +import {initNodes, onNodesChange as onNodesChangeAction} from 'redux/slices/DAG.slice'; +import DAGSelectors from 'selectors/DAG.selectors'; +import TraceDiagramAnalyticsService from 'services/Analytics/TraceDiagramAnalytics.service'; +import Trace from 'models/Trace.model'; +import {useTestSpecForm} from '../TestSpecForm/TestSpecForm.provider'; +import LoadingSpinner, {SpinnerContainer} from '../LoadingSpinner'; + +export interface IProps { + trace: Trace; + onNavigateToSpan(spanId: string): void; +} + +const TestDAG = ({trace: {spans}, onNavigateToSpan}: IProps) => { + const dispatch = useAppDispatch(); + const edges = useAppSelector(DAGSelectors.selectEdges); + const nodes = useAppSelector(DAGSelectors.selectNodes); + const {onSelectSpan, matchedSpans, focusedSpan} = useSpan(); + const {isOpen} = useTestSpecForm(); + + useEffect(() => { + dispatch(initNodes({spans})); + }, [dispatch, spans]); + + const onNodesChange = useCallback((changes: NodeChange[]) => dispatch(onNodesChangeAction({changes})), [dispatch]); + + const onNodeClick = useCallback( + (event, {id}: Node) => { + TraceDiagramAnalyticsService.onClickSpan(id); + onSelectSpan(id); + }, + [onSelectSpan] + ); + + if (spans.length && !nodes.length) { + return ( + + + + ); + } + + return ( + 0 || isOpen} + matchedSpans={matchedSpans} + nodes={nodes} + onNavigateToSpan={onNavigateToSpan} + onNodesChange={onNodesChange} + onNodeClick={onNodeClick} + selectedSpan={focusedSpan} + /> + ); +}; + +export default TestDAG; diff --git a/web/src/components/RunDetailTest/TestPanel.tsx b/web/src/components/RunDetailTest/TestPanel.tsx index 2c7ba26238..e7b3b19dd8 100644 --- a/web/src/components/RunDetailTest/TestPanel.tsx +++ b/web/src/components/RunDetailTest/TestPanel.tsx @@ -1,7 +1,7 @@ import {Tabs} from 'antd'; import {useCallback, useState} from 'react'; import {useSearchParams} from 'react-router-dom'; -import {VisualizationType} from 'components/RunDetailTrace/RunDetailTrace'; +import {VisualizationType, getIsDAGDisabled} from 'components/RunDetailTrace/RunDetailTrace'; import TestOutputs from 'components/TestOutputs'; import TestOutputForm from 'components/TestOutputForm/TestOutputForm'; import TestResults from 'components/TestResults'; @@ -56,7 +56,11 @@ const TestPanel = ({run, testId, runEvents}: IProps) => { const { test: {skipTraceCollection}, } = useTest(); - const [visualizationType, setVisualizationType] = useState(VisualizationType.Dag); + + const isDAGDisabled = getIsDAGDisabled(run?.trace?.spans?.length); + const [visualizationType, setVisualizationType] = useState(() => + isDAGDisabled ? VisualizationType.Timeline : VisualizationType.Dag + ); const handleClose = useCallback(() => { onSetFocusedSpan(''); @@ -111,20 +115,23 @@ const TestPanel = ({run, testId, runEvents}: IProps) => { {run.state === TestState.FINISHED && ( { TestRunAnalytics.onSwitchDiagramView(type); setVisualizationType(type); }} type={visualizationType} + totalSpans={run?.trace?.spans?.length} /> )} {skipTraceCollection && } @@ -217,7 +224,6 @@ const TestPanel = ({run, testId, runEvents}: IProps) => { onDelete={handleDelete} onEdit={handleEdit} onRevert={handleRevert} - onSelectSpan={handleSelectSpan} selectedSpan={selectedSpan?.id} testSpec={selectedTestSpec} /> diff --git a/web/src/components/RunDetailTest/Visualization.tsx b/web/src/components/RunDetailTest/Visualization.tsx index 7e41e954f4..6ea97b2b23 100644 --- a/web/src/components/RunDetailTest/Visualization.tsx +++ b/web/src/components/RunDetailTest/Visualization.tsx @@ -1,66 +1,32 @@ import {useCallback, useEffect} from 'react'; -import {Node, NodeChange} from 'react-flow-renderer'; import {VisualizationType} from 'components/RunDetailTrace/RunDetailTrace'; import RunEvents from 'components/RunEvents'; -import {useTestSpecForm} from 'components/TestSpecForm/TestSpecForm.provider'; -import DAG from 'components/Visualization/components/DAG'; -import Timeline from 'components/Visualization/components/Timeline'; +import TimelineV2 from 'components/Visualization/components/Timeline/TimelineV2'; import {TestRunStage} from 'constants/TestRunEvents.constants'; import {NodeTypesEnum} from 'constants/Visualization.constants'; -import Span from 'models/Span.model'; import TestRunEvent from 'models/TestRunEvent.model'; import {useSpan} from 'providers/Span/Span.provider'; -import {useAppDispatch, useAppSelector} from 'redux/hooks'; -import {initNodes, onNodesChange as onNodesChangeAction} from 'redux/slices/DAG.slice'; -import DAGSelectors from 'selectors/DAG.selectors'; -import TraceAnalyticsService from 'services/Analytics/TestRunAnalytics.service'; -import TraceDiagramAnalyticsService from 'services/Analytics/TraceDiagramAnalytics.service'; +import Trace from 'models/Trace.model'; import TestRunService from 'services/TestRun.service'; import {TTestRunState} from 'types/TestRun.types'; +import TestDAG from './TestDAG'; export interface IProps { + isDAGDisabled: boolean; runEvents: TestRunEvent[]; runState: TTestRunState; - spans: Span[]; type: VisualizationType; + trace: Trace; } -const Visualization = ({runEvents, runState, spans, type}: IProps) => { - const dispatch = useAppDispatch(); - const edges = useAppSelector(DAGSelectors.selectEdges); - const nodes = useAppSelector(DAGSelectors.selectNodes); - const {onSelectSpan, matchedSpans, onSetFocusedSpan, focusedSpan, selectedSpan} = useSpan(); - - const {isOpen} = useTestSpecForm(); - - useEffect(() => { - dispatch(initNodes({spans})); - }, [dispatch, spans]); +const Visualization = ({isDAGDisabled, runEvents, runState, trace, trace: {spans, rootSpan}, type}: IProps) => { + const {onSelectSpan, matchedSpans, onSetFocusedSpan, selectedSpan} = useSpan(); useEffect(() => { if (selectedSpan) return; - const firstSpan = spans.find(span => !span.parentId); - onSelectSpan(firstSpan?.id ?? ''); - }, [onSelectSpan, selectedSpan, spans]); - - const onNodesChange = useCallback((changes: NodeChange[]) => dispatch(onNodesChangeAction({changes})), [dispatch]); - - const onNodeClick = useCallback( - (event, {id}: Node) => { - TraceDiagramAnalyticsService.onClickSpan(id); - onSelectSpan(id); - }, - [onSelectSpan] - ); - - const onNodeClickTimeline = useCallback( - (spanId: string) => { - TraceAnalyticsService.onTimelineSpanClick(spanId); - onSelectSpan(spanId); - }, - [onSelectSpan] - ); + onSelectSpan(rootSpan.id); + }, [onSelectSpan, rootSpan, selectedSpan, spans]); const onNavigateToSpan = useCallback( (spanId: string) => { @@ -74,24 +40,14 @@ const Visualization = ({runEvents, runState, spans, type}: IProps) => { return ; } - return type === VisualizationType.Dag ? ( - 0 || isOpen} - matchedSpans={matchedSpans} - nodes={nodes} - onNavigateToSpan={onNavigateToSpan} - onNodesChange={onNodesChange} - onNodeClick={onNodeClick} - selectedSpan={focusedSpan} - /> + return type === VisualizationType.Dag && !isDAGDisabled ? ( + ) : ( - 0 || isOpen} + diff --git a/web/src/components/RunDetailTrace/AnalyzerPanel.tsx b/web/src/components/RunDetailTrace/AnalyzerPanel.tsx index e8da58fa9a..af25b789d4 100644 --- a/web/src/components/RunDetailTrace/AnalyzerPanel.tsx +++ b/web/src/components/RunDetailTrace/AnalyzerPanel.tsx @@ -1,5 +1,4 @@ import TestRun, {isRunStateFinished} from 'models/TestRun.model'; -import Trace from 'models/Trace.model'; import AnalyzerResult from '../AnalyzerResult/AnalyzerResult'; import SkeletonResponse from '../RunDetailTriggerResponse/SkeletonResponse'; import {RightPanel, PanelContainer} from '../ResizablePanels'; @@ -19,11 +18,7 @@ const AnalyzerPanel = ({run}: IProps) => ( {size => ( - {isRunStateFinished(run.state) ? ( - - ) : ( - - )} + {isRunStateFinished(run.state) ? : } )} diff --git a/web/src/components/RunDetailTrace/RunDetailTrace.tsx b/web/src/components/RunDetailTrace/RunDetailTrace.tsx index 3333e8ec22..5953b75b25 100644 --- a/web/src/components/RunDetailTrace/RunDetailTrace.tsx +++ b/web/src/components/RunDetailTrace/RunDetailTrace.tsx @@ -1,4 +1,5 @@ import ResizablePanels from 'components/ResizablePanels'; +import {MAX_DAG_NODES} from 'constants/Visualization.constants'; import TestRun from 'models/TestRun.model'; import TestRunEvent from 'models/TestRunEvent.model'; import * as S from './RunDetailTrace.styled'; @@ -19,6 +20,10 @@ export enum VisualizationType { Timeline, } +export function getIsDAGDisabled(totalSpans: number = 0): boolean { + return totalSpans > MAX_DAG_NODES; +} + const RunDetailTrace = ({run, runEvents, testId, skipTraceCollection}: IProps) => { return ( diff --git a/web/src/components/RunDetailTrace/Search.tsx b/web/src/components/RunDetailTrace/Search.tsx index 0f33e2cb83..5e04dfd2a6 100644 --- a/web/src/components/RunDetailTrace/Search.tsx +++ b/web/src/components/RunDetailTrace/Search.tsx @@ -5,16 +5,13 @@ import {useCallback, useMemo, useState} from 'react'; import {Editor} from 'components/Inputs'; import {SupportedEditors} from 'constants/Editor.constants'; -import {useTestRun} from 'providers/TestRun/TestRun.provider'; import TracetestAPI from 'redux/apis/Tracetest'; import {useAppDispatch, useAppSelector} from 'redux/hooks'; import {matchSpans, selectSpan, setSearchText} from 'redux/slices/Trace.slice'; import TraceSelectors from 'selectors/Trace.selectors'; -import SpanService from 'services/Span.service'; -import EditorService from 'services/Editor.service'; import * as S from './RunDetailTrace.styled'; -const {useLazyGetSelectedSpansQuery} = TracetestAPI.instance; +const {useGetSearchedSpansMutation} = TracetestAPI.instance; interface IProps { runId: number; @@ -25,35 +22,25 @@ const Search = ({runId, testId}: IProps) => { const [search, setSearch] = useState(''); const dispatch = useAppDispatch(); const matchedSpans = useAppSelector(TraceSelectors.selectMatchedSpans); - const { - run: {trace: {spans = []} = {}}, - } = useTestRun(); - const [getSelectedSpans] = useLazyGetSelectedSpansQuery(); + const [getSearchedSpans] = useGetSearchedSpansMutation(); const handleSearch = useCallback( async (query: string) => { - const isValidSelector = EditorService.getIsQueryValid(SupportedEditors.Selector, query || ''); if (!query) { dispatch(matchSpans({spanIds: []})); dispatch(selectSpan({spanId: ''})); return; } - let spanIds = []; - if (isValidSelector) { - const selectedSpansData = await getSelectedSpans({query, runId, testId}).unwrap(); - spanIds = selectedSpansData.spanIds; - } else { - dispatch(setSearchText({searchText: query})); - spanIds = SpanService.searchSpanList(spans, query); - } - + const {spanIds} = await getSearchedSpans({query, runId, testId}).unwrap(); + dispatch(setSearchText({searchText: query})); dispatch(matchSpans({spanIds})); + if (spanIds.length) { dispatch(selectSpan({spanId: spanIds[0]})); } }, - [dispatch, getSelectedSpans, runId, spans, testId] + [dispatch, getSearchedSpans, runId, testId] ); const onSearch = useMemo(() => debounce(handleSearch, 500), [handleSearch]); @@ -67,7 +54,7 @@ const Search = ({runId, testId}: IProps) => { { onSearch(query); setSearch(query); diff --git a/web/src/components/RunDetailTrace/TraceDAG.tsx b/web/src/components/RunDetailTrace/TraceDAG.tsx new file mode 100644 index 0000000000..a874852440 --- /dev/null +++ b/web/src/components/RunDetailTrace/TraceDAG.tsx @@ -0,0 +1,61 @@ +import {useAppDispatch, useAppSelector} from 'redux/hooks'; +import TraceSelectors from 'selectors/Trace.selectors'; +import {Node, NodeChange} from 'react-flow-renderer'; +import {changeNodes, initNodes, selectSpan} from 'redux/slices/Trace.slice'; +import TraceDiagramAnalyticsService from 'services/Analytics/TraceDiagramAnalytics.service'; +import {useCallback, useEffect} from 'react'; +import Trace from 'models/Trace.model'; +import DAG from '../Visualization/components/DAG'; +import LoadingSpinner, {SpinnerContainer} from '../LoadingSpinner'; + +interface IProps { + trace: Trace; + onNavigateToSpan(spanId: string): void; + matchedSpans: string[]; + selectedSpan: string; +} + +const TraceDAG = ({trace: {spans}, matchedSpans, selectedSpan, onNavigateToSpan}: IProps) => { + const nodes = useAppSelector(TraceSelectors.selectNodes); + const edges = useAppSelector(TraceSelectors.selectEdges); + const isMatchedMode = Boolean(matchedSpans.length); + const dispatch = useAppDispatch(); + + useEffect(() => { + dispatch(initNodes({spans})); + }, [dispatch, spans]); + + const onNodesChange = useCallback((changes: NodeChange[]) => dispatch(changeNodes({changes})), [dispatch]); + + const onNodeClick = useCallback( + (event: React.MouseEvent, {id}: Node) => { + event.stopPropagation(); + TraceDiagramAnalyticsService.onClickSpan(id); + dispatch(selectSpan({spanId: id})); + }, + [dispatch] + ); + + if (spans.length && !nodes.length) { + return ( + + + + ); + } + + return ( + + ); +}; + +export default TraceDAG; diff --git a/web/src/components/RunDetailTrace/TracePanel.tsx b/web/src/components/RunDetailTrace/TracePanel.tsx index 53cc6edb8f..ed958e3f09 100644 --- a/web/src/components/RunDetailTrace/TracePanel.tsx +++ b/web/src/components/RunDetailTrace/TracePanel.tsx @@ -4,7 +4,7 @@ import TraceAnalyticsService from 'services/Analytics/TestRunAnalytics.service'; import {TestState} from 'constants/TestRun.constants'; import TestRunEvent from 'models/TestRunEvent.model'; import Search from './Search'; -import {VisualizationType} from './RunDetailTrace'; +import {VisualizationType, getIsDAGDisabled} from './RunDetailTrace'; import * as S from './RunDetailTrace.styled'; import Switch from '../Visualization/components/Switch/Switch'; import Visualization from './Visualization'; @@ -19,7 +19,10 @@ type TProps = { }; const TracePanel = ({run, testId, runEvents, skipTraceCollection}: TProps) => { - const [visualizationType, setVisualizationType] = useState(VisualizationType.Dag); + const isDAGDisabled = getIsDAGDisabled(run?.trace?.spans?.length); + const [visualizationType, setVisualizationType] = useState(() => + isDAGDisabled ? VisualizationType.Timeline : VisualizationType.Dag + ); return ( @@ -34,18 +37,21 @@ const TracePanel = ({run, testId, runEvents, skipTraceCollection}: TProps) => { {run.state === TestState.FINISHED && ( { TraceAnalyticsService.onSwitchDiagramView(type); setVisualizationType(type); }} type={visualizationType} + totalSpans={run?.trace?.spans?.length} /> )} diff --git a/web/src/components/RunDetailTrace/Visualization.tsx b/web/src/components/RunDetailTrace/Visualization.tsx index 3ec49e140a..b2a52f9135 100644 --- a/web/src/components/RunDetailTrace/Visualization.tsx +++ b/web/src/components/RunDetailTrace/Visualization.tsx @@ -3,64 +3,43 @@ import {TestRunStage} from 'constants/TestRunEvents.constants'; import {NodeTypesEnum} from 'constants/Visualization.constants'; import TestRunEvent from 'models/TestRunEvent.model'; import {useCallback, useEffect} from 'react'; -import {Node, NodeChange} from 'react-flow-renderer'; import {useAppDispatch, useAppSelector} from 'redux/hooks'; -import {changeNodes, initNodes, selectSpan} from 'redux/slices/Trace.slice'; +import {selectSpan} from 'redux/slices/Trace.slice'; import TraceSelectors from 'selectors/Trace.selectors'; -import TraceAnalyticsService from 'services/Analytics/TestRunAnalytics.service'; -import TraceDiagramAnalyticsService from 'services/Analytics/TraceDiagramAnalytics.service'; import TestRunService from 'services/TestRun.service'; +import Trace from 'models/Trace.model'; import {TTestRunState} from 'types/TestRun.types'; -import Span from 'models/Span.model'; -import DAG from '../Visualization/components/DAG'; -import Timeline from '../Visualization/components/Timeline'; +import TimelineV2 from 'components/Visualization/components/Timeline/TimelineV2'; import {VisualizationType} from './RunDetailTrace'; +import TraceDAG from './TraceDAG'; interface IProps { + isDAGDisabled: boolean; runEvents: TestRunEvent[]; runState: TTestRunState; - spans: Span[]; + trace: Trace; type: VisualizationType; } -const Visualization = ({runEvents, runState, spans, type}: IProps) => { +const Visualization = ({isDAGDisabled, runEvents, runState, trace, trace: {spans, rootSpan}, type}: IProps) => { const dispatch = useAppDispatch(); - const edges = useAppSelector(TraceSelectors.selectEdges); - const matchedSpans = useAppSelector(TraceSelectors.selectMatchedSpans); - const nodes = useAppSelector(TraceSelectors.selectNodes); const selectedSpan = useAppSelector(TraceSelectors.selectSelectedSpan); - const isMatchedMode = Boolean(matchedSpans.length); - - useEffect(() => { - dispatch(initNodes({spans})); - }, [dispatch, spans]); + const matchedSpans = useAppSelector(TraceSelectors.selectMatchedSpans); useEffect(() => { if (selectedSpan) return; - const firstSpan = spans.find(span => !span.parentId); - dispatch(selectSpan({spanId: firstSpan?.id ?? ''})); - }, [dispatch, selectedSpan, spans]); - - const onNodesChange = useCallback((changes: NodeChange[]) => dispatch(changeNodes({changes})), [dispatch]); - const onNodeClick = useCallback( - (event: React.MouseEvent, {id}: Node) => { - event.stopPropagation(); - TraceDiagramAnalyticsService.onClickSpan(id); - dispatch(selectSpan({spanId: id})); - }, - [dispatch] - ); + dispatch(selectSpan({spanId: rootSpan.id ?? ''})); + }, [dispatch, rootSpan.id, selectedSpan, spans]); - const onNodeClickTimeline = useCallback( + const onNavigateToSpan = useCallback( (spanId: string) => { - TraceAnalyticsService.onTimelineSpanClick(spanId); dispatch(selectSpan({spanId})); }, [dispatch] ); - const onNavigateToSpan = useCallback( + const onNodeClickTimeline = useCallback( (spanId: string) => { dispatch(selectSpan({spanId})); }, @@ -71,26 +50,21 @@ const Visualization = ({runEvents, runState, spans, type}: IProps) => { return ; } - return type === VisualizationType.Dag ? ( - ) : ( - ); }; diff --git a/web/src/components/TestPlugins/Forms/Kafka/Kafka.tsx b/web/src/components/TestPlugins/Forms/Kafka/Kafka.tsx index 951ad2da29..83b3be1d64 100644 --- a/web/src/components/TestPlugins/Forms/Kafka/Kafka.tsx +++ b/web/src/components/TestPlugins/Forms/Kafka/Kafka.tsx @@ -6,6 +6,7 @@ import useQueryTabs from 'hooks/useQueryTabs'; import {SupportedEditors} from 'constants/Editor.constants'; import {TDraftTest} from 'types/Test.types'; import * as S from './Kafka.styled'; +import SingleLine from '../../../Inputs/SingleLine'; const Kafka = () => { const [activeKey, setActiveKey] = useQueryTabs('auth', 'triggerTab'); @@ -25,7 +26,7 @@ const Kafka = () => { } key="message"> - + { } key="topic"> - + diff --git a/web/src/components/TestResults/TestResults.tsx b/web/src/components/TestResults/TestResults.tsx index 77968585b9..715d768982 100644 --- a/web/src/components/TestResults/TestResults.tsx +++ b/web/src/components/TestResults/TestResults.tsx @@ -31,7 +31,7 @@ const TestResults = ({onDelete, onEdit, onRevert}: IProps) => { onSelectSpan(testSpec?.spanIds[0] || ''); setSelectedSpec(testSpec?.selector); }, - [assertionResults?.resultList, onSelectSpan, onSetFocusedSpan, setSelectedSpec] + [assertionResults, onSelectSpan, onSetFocusedSpan, setSelectedSpec] ); return ( diff --git a/web/src/components/TestSpec/TestSpec.styled.ts b/web/src/components/TestSpec/TestSpec.styled.ts index 28b70e3683..dd5a301bef 100644 --- a/web/src/components/TestSpec/TestSpec.styled.ts +++ b/web/src/components/TestSpec/TestSpec.styled.ts @@ -17,6 +17,7 @@ export const Container = styled.div<{$isDeleted: boolean}>` display: flex; gap: 12px; padding: 16px; + margin-bottom: 16px; > div:first-child { opacity: ${({$isDeleted}) => ($isDeleted ? 0.5 : 1)}; diff --git a/web/src/components/TestSpecDetail/Content.tsx b/web/src/components/TestSpecDetail/Content.tsx index 90dea1340c..4ad20d8bcf 100644 --- a/web/src/components/TestSpecDetail/Content.tsx +++ b/web/src/components/TestSpecDetail/Content.tsx @@ -1,24 +1,21 @@ -import {useEffect, useMemo} from 'react'; +import {useEffect, useMemo, useRef} from 'react'; +import {FixedSizeList as List} from 'react-window'; +import AutoSizer, {Size} from 'react-virtualized-auto-sizer'; -import {SemanticGroupNames} from 'constants/SemanticGroupNames.constants'; -import {useTestRun} from 'providers/TestRun/TestRun.provider'; import {useAppSelector} from 'redux/hooks'; import TestSpecsSelectors from 'selectors/TestSpecs.selectors'; import AssertionService from 'services/Assertion.service'; +import TraceSelectors from 'selectors/Trace.selectors'; import {TAssertionResultEntry} from 'models/AssertionResults.model'; -import {useTest} from 'providers/Test/Test.provider'; -import useScrollTo from 'hooks/useScrollTo'; -import Assertion from './Assertion'; import Header from './Header'; -import SpanHeader from './SpanHeader'; -import * as S from './TestSpecDetail.styled'; +import ResultCard from './ResultCard'; +import Search from './Search'; interface IProps { onClose(): void; onDelete(selector: string): void; onEdit(assertionResult: TAssertionResultEntry, name: string): void; onRevert(originalSelector: string): void; - onSelectSpan(spanId: string): void; selectedSpan?: string; testSpec: TAssertionResultEntry; } @@ -28,17 +25,10 @@ const Content = ({ onDelete, onEdit, onRevert, - onSelectSpan, selectedSpan, testSpec, testSpec: {resultList, selector, spanIds}, }: IProps) => { - const { - run: {trace, id: runId}, - } = useTestRun(); - const { - test: {id: testId}, - } = useTest(); const { isDeleted = false, isDraft = false, @@ -46,12 +36,28 @@ const Content = ({ name = '', } = useAppSelector(state => TestSpecsSelectors.selectSpecBySelector(state, selector)) || {}; const totalPassedChecks = useMemo(() => AssertionService.getTotalPassedChecks(resultList), [resultList]); - const results = useMemo(() => AssertionService.getResultsHashedBySpanId(resultList), [resultList]); - const scrollTo = useScrollTo(); + const matchedSpans = useAppSelector(TraceSelectors.selectMatchedSpans); + const results = useMemo( + () => Object.entries(AssertionService.getResultsHashedBySpanId(resultList, matchedSpans)), + [matchedSpans, resultList] + ); + + const listRef = useRef(null); useEffect(() => { - scrollTo(`assertion-result-${selectedSpan}`); - }, [scrollTo, selectedSpan]); + if (listRef.current) { + const index = results.findIndex(([spanId]) => spanId === selectedSpan); + if (index !== -1) { + listRef?.current?.scrollToItem(index, 'smart'); + } + } + }, [results, selectedSpan]); + + const itemSize = useMemo(() => { + const [, checkResults = []] = results[0]; + + return checkResults.length * 72.59 + 40 + 16; + }, [results]); return ( <> @@ -76,33 +82,22 @@ const Content = ({ title={!selector && !name ? 'All Spans' : name} /> - {Object.entries(results).map(([spanId, checkResults]) => { - const span = trace?.spans.find(({id}) => id === spanId); + - return ( - } - type="inner" - $isSelected={spanId === selectedSpan} - $type={span?.type ?? SemanticGroupNames.General} - id={`assertion-result-${spanId}`} + + {({height, width}: Size) => ( + - onSelectSpan(span?.id ?? '')}> - {checkResults.map(checkResult => ( - - ))} - - - ); - })} + {ResultCard} + + )} + ); }; diff --git a/web/src/components/TestSpecDetail/ResultCard.tsx b/web/src/components/TestSpecDetail/ResultCard.tsx new file mode 100644 index 0000000000..95f4b33876 --- /dev/null +++ b/web/src/components/TestSpecDetail/ResultCard.tsx @@ -0,0 +1,65 @@ +import {useCallback, useMemo} from 'react'; +import {useSpan} from 'providers/Span/Span.provider'; +import {useTest} from 'providers/Test/Test.provider'; +import {ICheckResult} from 'types/Assertion.types'; +import {SemanticGroupNames} from 'constants/SemanticGroupNames.constants'; +import {useTestRun} from 'providers/TestRun/TestRun.provider'; +import * as S from './TestSpecDetail.styled'; +import Assertion from './Assertion'; +import SpanHeader from './SpanHeader'; + +interface IProps { + index: number; + data: [string, ICheckResult[]][]; + style: React.CSSProperties; +} + +const ResultCard = ({index, data, style}: IProps) => { + const [spanId, checkResults] = useMemo(() => data[index], [data, index]); + const { + run: {trace, id: runId}, + } = useTestRun(); + const { + test: {id: testId}, + } = useTest(); + const {selectedSpan, onSetFocusedSpan, onSelectSpan} = useSpan(); + + const onFocusAndSelect = useCallback(() => { + onSelectSpan(spanId); + onSetFocusedSpan(spanId); + }, [onSelectSpan, onSetFocusedSpan, spanId]); + + const span = trace?.flat[spanId]; + + return ( + } + type="inner" + $isSelected={spanId === selectedSpan?.id} + $type={span?.type ?? SemanticGroupNames.General} + id={`assertion-result-${spanId}`} + onClick={() => onSelectSpan(span?.id ?? '')} + > + + {checkResults.map(checkResult => ( + + ))} + + + ); +}; + +export default ResultCard; diff --git a/web/src/components/TestSpecDetail/Search.tsx b/web/src/components/TestSpecDetail/Search.tsx new file mode 100644 index 0000000000..539d9333e5 --- /dev/null +++ b/web/src/components/TestSpecDetail/Search.tsx @@ -0,0 +1,70 @@ +import {Col} from 'antd'; +import {debounce} from 'lodash'; +import {useCallback, useMemo, useState} from 'react'; + +import {Editor} from 'components/Inputs'; +import {SupportedEditors} from 'constants/Editor.constants'; +import TracetestAPI from 'redux/apis/Tracetest'; +import {useTestRun} from 'providers/TestRun/TestRun.provider'; +import {useTest} from 'providers/Test/Test.provider'; +import {useAppDispatch} from 'redux/hooks'; +import {matchSpans, selectSpan, setSearchText} from 'redux/slices/Trace.slice'; +import * as S from './TestSpecDetail.styled'; + +const {useGetSearchedSpansMutation} = TracetestAPI.instance; + +const Search = () => { + const [search, setSearch] = useState(''); + const dispatch = useAppDispatch(); + const [getSearchedSpans] = useGetSearchedSpansMutation(); + const { + run: {id: runId}, + } = useTestRun(); + const { + test: {id: testId}, + } = useTest(); + + const handleSearch = useCallback( + async (query: string) => { + if (!query) { + dispatch(matchSpans({spanIds: []})); + dispatch(selectSpan({spanId: ''})); + return; + } + + const {spanIds} = await getSearchedSpans({query, runId, testId}).unwrap(); + dispatch(setSearchText({searchText: query})); + dispatch(matchSpans({spanIds})); + + if (spanIds.length) { + dispatch(selectSpan({spanId: spanIds[0]})); + } + }, + [dispatch, getSearchedSpans, runId, testId] + ); + + const onSearch = useMemo(() => debounce(handleSearch, 500), [handleSearch]); + const onClear = useCallback(() => { + onSearch(''); + setSearch(''); + }, [onSearch]); + + return ( + + + { + onSearch(query); + setSearch(query); + }} + value={search} + /> + {!!search && } + + + ); +}; + +export default Search; diff --git a/web/src/components/TestSpecDetail/SpanHeader.tsx b/web/src/components/TestSpecDetail/SpanHeader.tsx index 03ed113014..4817ca3d92 100644 --- a/web/src/components/TestSpecDetail/SpanHeader.tsx +++ b/web/src/components/TestSpecDetail/SpanHeader.tsx @@ -1,5 +1,6 @@ import {SettingOutlined, ToolOutlined} from '@ant-design/icons'; +import {Typography} from 'antd'; import * as SSpanNode from 'components/Visualization/components/DAG/BaseSpanNode/BaseSpanNode.styled'; import {SemanticGroupNamesToText} from 'constants/SemanticGroupNames.constants'; import {SpanKindToText} from 'constants/Span.constants'; @@ -16,20 +17,25 @@ const SpanHeader = ({onSelectSpan, span}: IProps) => { const {kind, name, service, system, type} = SpanService.getSpanInfo(span); return ( - onSelectSpan(span?.id ?? '')}> - - {name} - - - {`${service} ${SpanKindToText[kind]}`} - - {Boolean(system) && ( + + onSelectSpan(span?.id ?? '')}> + + {name} - - {system} + + {`${service} ${SpanKindToText[kind]}`} - )} - + {Boolean(system) && ( + + + {system} + + )} + + + {span?.id} + + ); }; diff --git a/web/src/components/TestSpecDetail/TestSpecDetail.styled.ts b/web/src/components/TestSpecDetail/TestSpecDetail.styled.ts index a1b2841500..24b00e82fc 100644 --- a/web/src/components/TestSpecDetail/TestSpecDetail.styled.ts +++ b/web/src/components/TestSpecDetail/TestSpecDetail.styled.ts @@ -1,4 +1,4 @@ -import {CheckCircleFilled, InfoCircleFilled, MinusCircleFilled} from '@ant-design/icons'; +import {CheckCircleFilled, CloseCircleFilled, InfoCircleFilled, MinusCircleFilled} from '@ant-design/icons'; import {Card, Drawer, Typography} from 'antd'; import styled from 'styled-components'; @@ -18,10 +18,6 @@ export const CardContainer = styled(Card)<{$isSelected: boolean; $type: Semantic border: ${({$isSelected, theme}) => $isSelected ? `1px solid ${theme.color.interactive}` : `1px solid ${theme.color.borderLight}`}; - :not(:last-child) { - margin-bottom: 16px; - } - .ant-card-head { border-bottom: ${({theme}) => `1px solid ${theme.color.borderLight}`}; border-top: ${({$type}) => `4px solid ${SemanticGroupNamesToColor[$type]}`}; @@ -108,5 +104,24 @@ export const SpanHeaderContainer = styled.div` cursor: pointer; display: flex; gap: 8px; +`; + +export const Wrapper = styled.div` + align-items: center; + cursor: pointer; + justify-content: space-between; + display: flex; padding: 8px 12px; `; + +export const ClearSearchIcon = styled(CloseCircleFilled)` + position: absolute; + right: 8px; + top: 8px; + color: ${({theme}) => theme.color.textLight}; + cursor: pointer; +`; + +export const SearchContainer = styled(Row)` + margin-bottom: 16px; +`; diff --git a/web/src/components/TestSpecDetail/TestSpecDetail.tsx b/web/src/components/TestSpecDetail/TestSpecDetail.tsx index 8141068bd8..4a7adc3f40 100644 --- a/web/src/components/TestSpecDetail/TestSpecDetail.tsx +++ b/web/src/components/TestSpecDetail/TestSpecDetail.tsx @@ -8,45 +8,32 @@ interface IProps { onDelete(selector: string): void; onEdit(assertionResult: TAssertionResultEntry, name: string): void; onRevert(originalSelector: string): void; - onSelectSpan(spanId: string): void; selectedSpan?: string; testSpec?: TAssertionResultEntry; } -const TestSpecDetail = ({ - isOpen, - onClose, - onDelete, - onEdit, - onRevert, - onSelectSpan, - selectedSpan, - testSpec, -}: IProps) => { - return ( - - {testSpec && ( - - )} - - ); -}; +const TestSpecDetail = ({isOpen, onClose, onDelete, onEdit, onRevert, selectedSpan, testSpec}: IProps) => ( + + {testSpec && ( + + )} + +); export default TestSpecDetail; diff --git a/web/src/components/TestSpecs/TestSpecs.styled.ts b/web/src/components/TestSpecs/TestSpecs.styled.ts index 17cebb4d5b..25433c3f84 100644 --- a/web/src/components/TestSpecs/TestSpecs.styled.ts +++ b/web/src/components/TestSpecs/TestSpecs.styled.ts @@ -3,12 +3,6 @@ import styled from 'styled-components'; import noResultsIcon from 'assets/SpanAssertionsEmptyState.svg'; -export const Container = styled.div` - display: flex; - flex-direction: column; - gap: 16px; -`; - export const EmptyContainer = styled.div` align-items: center; display: flex; diff --git a/web/src/components/TestSpecs/TestSpecs.tsx b/web/src/components/TestSpecs/TestSpecs.tsx index 034b972e38..83aa70b175 100644 --- a/web/src/components/TestSpecs/TestSpecs.tsx +++ b/web/src/components/TestSpecs/TestSpecs.tsx @@ -1,7 +1,8 @@ import TestSpec from 'components/TestSpec'; +import AutoSizer, {Size} from 'react-virtualized-auto-sizer'; +import {FixedSizeList as List} from 'react-window'; import AssertionResults, {TAssertionResultEntry} from 'models/AssertionResults.model'; import Empty from './Empty'; -import * as S from './TestSpecs.styled'; interface IProps { assertionResults?: AssertionResults; @@ -17,20 +18,32 @@ const TestSpecs = ({assertionResults, onDelete, onEdit, onOpen, onRevert}: IProp } return ( - - {assertionResults?.resultList?.map(specResult => - specResult.resultList.length ? ( - - ) : null + + {({height, width}: Size) => ( + + {({index, data}) => { + const specResult = data[index]; + + return specResult.resultList.length ? ( + + ) : null; + }} + )} - + ); }; diff --git a/web/src/components/Visualization/components/DAG/DAG.tsx b/web/src/components/Visualization/components/DAG/DAG.tsx index f7a4fe77a9..c719c23643 100644 --- a/web/src/components/Visualization/components/DAG/DAG.tsx +++ b/web/src/components/Visualization/components/DAG/DAG.tsx @@ -5,6 +5,7 @@ import Actions from './Actions'; import * as S from './DAG.styled'; import TestSpanNode from './TestSpanNode/TestSpanNode'; import TraceSpanNode from './TraceSpanNode/TraceSpanNode'; +import {MAX_DAG_NODES} from '../../../../constants/Visualization.constants'; /** Important to define the nodeTypes outside the component to prevent re-renderings */ const nodeTypes = {traceSpan: TraceSpanNode, testSpan: TestSpanNode}; @@ -46,15 +47,17 @@ const DAG = ({ edges={edges} nodes={nodes} deleteKeyCode={null} - fitView minZoom={0.1} multiSelectionKeyCode={null} nodesConnectable={false} nodeTypes={nodeTypes} + onInit={() => nodes.length >= MAX_DAG_NODES && onNavigateToSpan(nodes[0]?.id)} onNodeClick={onNodeClick} onNodeDragStop={onNodeClick} onNodesChange={onNodesChange} + onlyRenderVisibleElements selectionKeyCode={null} + fitView={nodes.length <= MAX_DAG_NODES} > {isMiniMapActive && } diff --git a/web/src/components/Visualization/components/Navigation/Navigation.tsx b/web/src/components/Visualization/components/Navigation/Navigation.tsx index 8517c217e8..c4ba60e0f4 100644 --- a/web/src/components/Visualization/components/Navigation/Navigation.tsx +++ b/web/src/components/Visualization/components/Navigation/Navigation.tsx @@ -13,6 +13,7 @@ interface IProps { } const Navigation = ({matchedSpans, onNavigateToSpan, selectedSpan}: IProps) => { + // TODO: save matched spans in a different data structure const index = matchedSpans.findIndex(spanId => spanId === selectedSpan) + 1; const navigate = useCallback( diff --git a/web/src/components/Visualization/components/Switch/Switch.styled.ts b/web/src/components/Visualization/components/Switch/Switch.styled.ts index 4cc51f89ba..6e4067bf0a 100644 --- a/web/src/components/Visualization/components/Switch/Switch.styled.ts +++ b/web/src/components/Visualization/components/Switch/Switch.styled.ts @@ -11,10 +11,13 @@ export const Container = styled.div` padding: 7px; `; -export const DAGIcon = styled(ClusterOutlined)<{$isSelected?: boolean}>` +export const DAGIcon = styled(ClusterOutlined)<{$isDisabled?: boolean; $isSelected?: boolean}>` color: ${({$isSelected = false, theme}) => ($isSelected ? theme.color.primary : theme.color.textSecondary)}; - cursor: pointer; font-size: ${({theme}) => theme.size.xl}; + + && { + cursor: ${({$isDisabled}) => ($isDisabled ? 'not-allowed' : 'pointer')}; + } `; export const TimelineIcon = styled(BarsOutlined)<{$isSelected?: boolean}>` diff --git a/web/src/components/Visualization/components/Switch/Switch.tsx b/web/src/components/Visualization/components/Switch/Switch.tsx index 4e4fc4e68c..26458eb11f 100644 --- a/web/src/components/Visualization/components/Switch/Switch.tsx +++ b/web/src/components/Visualization/components/Switch/Switch.tsx @@ -1,17 +1,30 @@ import {Tooltip} from 'antd'; - import {VisualizationType} from 'components/RunDetailTrace/RunDetailTrace'; +import {MAX_DAG_NODES} from 'constants/Visualization.constants'; import * as S from './Switch.styled'; interface IProps { + isDAGDisabled: boolean; onChange(type: VisualizationType): void; type: VisualizationType; + totalSpans?: number; } -const Switch = ({onChange, type}: IProps) => ( +const Switch = ({isDAGDisabled, onChange, type, totalSpans = 0}: IProps) => ( - - onChange(VisualizationType.Dag)} /> + + !isDAGDisabled && onChange(VisualizationType.Dag)} + /> 1 - viewEnd ? 'left' : 'right'; +} + +interface IProps extends IPropsComponent { + span: Span; +} + +const BaseSpanNode = ({index, node, span, style}: IProps) => { + const {collapsedSpans, getScale, matchedSpans, onSpanCollapse, onSpanClick, selectedSpan} = useTimeline(); + const {start: viewStart, end: viewEnd} = getScale(span.startTime, span.endTime); + const hintSide = getHintSide(viewStart, viewEnd); + const isSelected = selectedSpan === node.data.id; + const isMatched = matchedSpans.includes(node.data.id); + const isCollapsed = collapsedSpans.includes(node.data.id); + + return ( +
    + onSpanClick(node.data.id)} + $isEven={index % 2 === 0} + $isMatched={isMatched} + $isSelected={isSelected} + > + + + + + {span.name} + + + + + + + + {span.duration} + + + +
    + ); +}; + +export default BaseSpanNode; diff --git a/web/src/components/Visualization/components/Timeline/BaseSpanNode/ConnectorV2.tsx b/web/src/components/Visualization/components/Timeline/BaseSpanNode/ConnectorV2.tsx new file mode 100644 index 0000000000..cb332a3f84 --- /dev/null +++ b/web/src/components/Visualization/components/Timeline/BaseSpanNode/ConnectorV2.tsx @@ -0,0 +1,56 @@ +import {BaseLeftPaddingV2} from 'constants/Timeline.constants'; +import * as S from '../TimelineV2.styled'; + +interface IProps { + hasParent: boolean; + id: string; + isCollapsed: boolean; + nodeDepth: number; + onCollapse(id: string): void; + totalChildren: number; +} + +const Connector = ({hasParent, id, isCollapsed, nodeDepth, onCollapse, totalChildren}: IProps) => { + const leftPadding = nodeDepth * BaseLeftPaddingV2; + + return ( + + {hasParent && ( + <> + + + + )} + + {totalChildren > 0 ? ( + <> + {!isCollapsed && } + + + {totalChildren} + + { + event.stopPropagation(); + onCollapse(id); + }} + /> + + ) : ( + + )} + + {new Array(nodeDepth).fill(0).map((_, index) => { + return ; + })} + + ); +}; + +export default Connector; diff --git a/web/src/components/Visualization/components/Timeline/Header.tsx b/web/src/components/Visualization/components/Timeline/Header.tsx new file mode 100644 index 0000000000..d5ff7cdc41 --- /dev/null +++ b/web/src/components/Visualization/components/Timeline/Header.tsx @@ -0,0 +1,22 @@ +import Ticks from './Ticks/Ticks'; +import * as S from './TimelineV2.styled'; + +const NUM_TICKS = 5; + +interface IProps { + duration: number; +} + +const Header = ({duration}: IProps) => ( + + + + Span + + + + + +); + +export default Header; diff --git a/web/src/components/Visualization/components/Timeline/ListWrapper.tsx b/web/src/components/Visualization/components/Timeline/ListWrapper.tsx new file mode 100644 index 0000000000..cda954bfb7 --- /dev/null +++ b/web/src/components/Visualization/components/Timeline/ListWrapper.tsx @@ -0,0 +1,33 @@ +import {FixedSizeList as List} from 'react-window'; +import Header from './Header'; +import SpanNodeFactory from './SpanNodeFactoryV2'; +import * as S from './TimelineV2.styled'; +import {useTimeline} from './Timeline.provider'; + +const HEADER_HEIGHT = 242; + +interface IProps { + listRef: React.RefObject; +} + +const ListWrapper = ({listRef}: IProps) => { + const {spans, viewEnd, viewStart} = useTimeline(); + + return ( + +
    + + {SpanNodeFactory} + + + ); +}; + +export default ListWrapper; diff --git a/web/src/components/Visualization/components/Timeline/NavigationWrapper.tsx b/web/src/components/Visualization/components/Timeline/NavigationWrapper.tsx new file mode 100644 index 0000000000..9f3c92ca47 --- /dev/null +++ b/web/src/components/Visualization/components/Timeline/NavigationWrapper.tsx @@ -0,0 +1,10 @@ +import Navigation from '../Navigation'; +import {useTimeline} from './Timeline.provider'; + +const NavigationWrapper = () => { + const {matchedSpans, onSpanNavigation, selectedSpan} = useTimeline(); + + return ; +}; + +export default NavigationWrapper; diff --git a/web/src/components/Visualization/components/Timeline/SpanNodeFactoryV2.tsx b/web/src/components/Visualization/components/Timeline/SpanNodeFactoryV2.tsx new file mode 100644 index 0000000000..9e6aed970c --- /dev/null +++ b/web/src/components/Visualization/components/Timeline/SpanNodeFactoryV2.tsx @@ -0,0 +1,30 @@ +import {NodeTypesEnum} from 'constants/Visualization.constants'; +import {TNode} from 'types/Timeline.types'; +// import TestSpanNode from './TestSpanNode/TestSpanNode'; +import TraceSpanNode from './TraceSpanNode/TraceSpanNodeV2'; + +export interface IPropsComponent { + index: number; + node: TNode; + style: React.CSSProperties; +} + +const ComponentMap: Record React.ReactElement> = { + [NodeTypesEnum.TestSpan]: TraceSpanNode, + [NodeTypesEnum.TraceSpan]: TraceSpanNode, +}; + +interface IProps { + data: TNode[]; + index: number; + style: React.CSSProperties; +} + +const SpanNodeFactory = ({data, ...props}: IProps) => { + const node = data[props.index]; + const Component = ComponentMap[node.type]; + + return ; +}; + +export default SpanNodeFactory; diff --git a/web/src/components/Visualization/components/Timeline/Ticks/Ticks.styled.ts b/web/src/components/Visualization/components/Timeline/Ticks/Ticks.styled.ts new file mode 100644 index 0000000000..0af2ed4f32 --- /dev/null +++ b/web/src/components/Visualization/components/Timeline/Ticks/Ticks.styled.ts @@ -0,0 +1,37 @@ +import {Typography} from 'antd'; +import styled, {css} from 'styled-components'; + +export const Ticks = styled.div` + pointer-events: none; + position: relative; +`; + +export const Tick = styled.div` + align-items: center; + background: ${({theme}) => theme.color.borderLight}; + display: flex; + height: 100%; + position: absolute; + width: 1px; + + :first-child, + :last-child { + width: 0; + } +`; + +export const TickLabel = styled(Typography.Text)<{$isEndAnchor: boolean}>` + color: ${({theme}) => theme.color.text}; + font-size: ${({theme}) => theme.size.sm}; + font-weight: 400; + left: 0.25rem; + position: absolute; + white-space: nowrap; + + ${({$isEndAnchor}) => + $isEndAnchor && + css` + left: initial; + right: 0.25rem; + `}; +`; diff --git a/web/src/components/Visualization/components/Timeline/Ticks/Ticks.tsx b/web/src/components/Visualization/components/Timeline/Ticks/Ticks.tsx new file mode 100644 index 0000000000..5387421b91 --- /dev/null +++ b/web/src/components/Visualization/components/Timeline/Ticks/Ticks.tsx @@ -0,0 +1,40 @@ +import * as React from 'react'; +import Date, {ONE_MILLISECOND} from 'utils/Date'; +import * as S from './Ticks.styled'; + +function getLabels(numTicks: number, startTime: number, endTime: number) { + const viewingDuration = endTime - startTime; + const labels = []; + + for (let i = 0; i < numTicks; i += 1) { + const durationAtTick = startTime + (i / (numTicks - 1)) * viewingDuration; + labels.push(Date.formatDuration(durationAtTick * ONE_MILLISECOND)); + } + + return labels; +} + +interface IProps { + endTime?: number; + numTicks: number; + startTime?: number; +} + +const Ticks = ({endTime = 0, numTicks, startTime = 0}: IProps) => { + const labels = getLabels(numTicks, startTime, endTime); + + return ( + + {labels.map((label, index) => { + const portion = index / (numTicks - 1); + return ( + + = 1}>{label} + + ); + })} + + ); +}; + +export default Ticks; diff --git a/web/src/components/Visualization/components/Timeline/Timeline.provider.tsx b/web/src/components/Visualization/components/Timeline/Timeline.provider.tsx new file mode 100644 index 0000000000..26257e2e6b --- /dev/null +++ b/web/src/components/Visualization/components/Timeline/Timeline.provider.tsx @@ -0,0 +1,127 @@ +import {NodeTypesEnum} from 'constants/Visualization.constants'; +import noop from 'lodash/noop'; +import without from 'lodash/without'; +import Span from 'models/Span.model'; +import TimelineModel from 'models/Timeline.model'; +import {createContext, useCallback, useContext, useMemo, useState} from 'react'; +import {FixedSizeList as List} from 'react-window'; +import TraceAnalyticsService from 'services/Analytics/TestRunAnalytics.service'; +import TimelineService, {TScaleFunction} from 'services/Timeline.service'; +import {TNode} from 'types/Timeline.types'; + +interface IContext { + collapsedSpans: string[]; + getScale: TScaleFunction; + matchedSpans: string[]; + onSpanClick(spanId: string): void; + onSpanCollapse(spanId: string): void; + onSpanNavigation(spanId: string): void; + selectedSpan: string; + spans: TNode[]; + viewEnd: number; + viewStart: number; +} + +export const Context = createContext({ + collapsedSpans: [], + getScale: () => ({start: 0, end: 0}), + matchedSpans: [], + onSpanClick: noop, + onSpanCollapse: noop, + onSpanNavigation: noop, + selectedSpan: '', + spans: [], + viewEnd: 0, + viewStart: 0, +}); + +interface IProps { + children: React.ReactNode; + listRef: React.RefObject; + nodeType: NodeTypesEnum; + spans: Span[]; + onNavigate(spanId: string): void; + onClick(spanId: string): void; + matchedSpans: string[]; + selectedSpan: string; +} + +export const useTimeline = () => useContext(Context); + +const TimelineProvider = ({ + children, + listRef, + nodeType, + spans, + onClick, + onNavigate, + matchedSpans, + selectedSpan, +}: IProps) => { + const [collapsedSpans, setCollapsedSpans] = useState([]); + + const nodes = useMemo(() => TimelineModel(spans, nodeType), [spans, nodeType]); + const filteredNodes = useMemo(() => TimelineService.getFilteredNodes(nodes, collapsedSpans), [collapsedSpans, nodes]); + const [min, max] = useMemo(() => TimelineService.getMinMax(nodes), [nodes]); + const getScale = useCallback(() => TimelineService.createScaleFunc({min, max}), [max, min]); + + const onSpanClick = useCallback( + (spanId: string) => { + TraceAnalyticsService.onTimelineSpanClick(spanId); + onClick(spanId); + }, + [onClick] + ); + + const onSpanNavigation = useCallback( + (spanId: string) => { + onNavigate(spanId); + // TODO: Improve the method to search for the index + const index = filteredNodes.findIndex(node => node.data.id === spanId); + if (index !== -1) { + listRef?.current?.scrollToItem(index, 'start'); + } + }, + [filteredNodes, listRef, onNavigate] + ); + + const onSpanCollapse = useCallback((spanId: string) => { + setCollapsedSpans(prevCollapsed => { + if (prevCollapsed.includes(spanId)) { + return without(prevCollapsed, spanId); + } + return [...prevCollapsed, spanId]; + }); + }, []); + + const value = useMemo( + () => ({ + collapsedSpans, + getScale: getScale(), + matchedSpans, + onSpanClick, + onSpanCollapse, + onSpanNavigation, + selectedSpan, + spans: filteredNodes, + viewEnd: max, + viewStart: min, + }), + [ + collapsedSpans, + filteredNodes, + getScale, + matchedSpans, + max, + min, + onSpanClick, + onSpanCollapse, + onSpanNavigation, + selectedSpan, + ] + ); + + return {children}; +}; + +export default TimelineProvider; diff --git a/web/src/components/Visualization/components/Timeline/TimelineV2.styled.ts b/web/src/components/Visualization/components/Timeline/TimelineV2.styled.ts new file mode 100644 index 0000000000..827d7b88a3 --- /dev/null +++ b/web/src/components/Visualization/components/Timeline/TimelineV2.styled.ts @@ -0,0 +1,150 @@ +import {Typography} from 'antd'; +import {SemanticGroupNames, SemanticGroupNamesToColor} from 'constants/SemanticGroupNames.constants'; +import styled, {css} from 'styled-components'; + +export const Container = styled.div` + padding: 50px 24px 0 24px; +`; + +export const Row = styled.div<{$isEven: boolean; $isMatched: boolean; $isSelected: boolean}>` + background-color: ${({theme, $isEven}) => ($isEven ? theme.color.background : theme.color.white)}; + display: grid; + grid-template-columns: 300px 1fr; + grid-template-rows: 32px; + padding: 0px 16px; + + :hover { + background-color: ${({theme}) => theme.color.backgroundInteractive}; + } + + ${({$isMatched}) => + $isMatched && + css` + background-color: ${({theme}) => theme.color.alertYellow}; + `}; + + ${({$isSelected}) => + $isSelected && + css` + background: rgba(97, 23, 94, 0.1); + + :hover { + background: rgba(97, 23, 94, 0.1); + } + `}; +`; + +export const Col = styled.div` + display: grid; + grid-template-columns: 1fr 8px; +`; + +export const ColDuration = styled.div` + overflow: hidden; + position: relative; +`; + +export const Header = styled.div` + align-items: center; + display: flex; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +`; + +export const NameContainer = styled.div` + overflow: hidden; + text-overflow: ellipsis; +`; + +export const Separator = styled.div` + border-left: 1px solid rgb(222, 227, 236); + cursor: ew-resize; + height: 32px; + padding: 0px 3px; + width: 1px; +`; + +export const Title = styled(Typography.Text)` + color: ${({theme}) => theme.color.text}; + font-size: ${({theme}) => theme.size.sm}; + font-weight: 400; +`; + +export const Connector = styled.svg` + flex-shrink: 0; + overflow: hidden; + overflow-clip-margin: content-box; +`; + +export const SpanBar = styled.div<{$type: SemanticGroupNames}>` + background-color: ${({$type}) => SemanticGroupNamesToColor[$type]}; + border-radius: 3px; + height: 18px; + min-width: 2px; + position: absolute; + top: 7px; +`; + +export const SpanBarLabel = styled.div<{$side: 'left' | 'right'}>` + color: ${({theme}) => theme.color.textSecondary}; + font-size: ${({theme}) => theme.size.xs}; + padding: 1px 4px 0 4px; + position: absolute; + + ${({$side}) => + $side === 'left' + ? css` + right: 100%; + ` + : css` + left: 100%; + `}; +`; + +export const TextConnector = styled.text<{$isActive?: boolean}>` + fill: ${({theme, $isActive}) => ($isActive ? theme.color.white : theme.color.text)}; + font-size: ${({theme}) => theme.size.xs}; +`; + +export const CircleDot = styled.circle` + fill: ${({theme}) => theme.color.textSecondary}; + stroke-width: 2; + stroke: ${({theme}) => theme.color.white}; +`; + +export const LineBase = styled.line` + stroke: ${({theme}) => theme.color.borderLight}; +`; + +export const RectBase = styled.rect<{$isActive?: boolean}>` + fill: ${({theme, $isActive}) => ($isActive ? theme.color.primary : theme.color.white)}; + stroke: ${({theme}) => theme.color.textSecondary}; +`; + +export const RectBaseTransparent = styled(RectBase)` + cursor: pointer; + fill: transparent; +`; + +export const HeaderRow = styled.div` + background-color: ${({theme}) => theme.color.white}; + display: grid; + grid-template-columns: 300px 1fr; + grid-template-rows: 32px; + padding: 0px 16px; +`; + +export const HeaderContent = styled.div` + align-items: center; + display: flex; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +`; + +export const HeaderTitle = styled(Typography.Title)` + && { + margin: 0; + } +`; diff --git a/web/src/components/Visualization/components/Timeline/TimelineV2.tsx b/web/src/components/Visualization/components/Timeline/TimelineV2.tsx new file mode 100644 index 0000000000..b3c72c9078 --- /dev/null +++ b/web/src/components/Visualization/components/Timeline/TimelineV2.tsx @@ -0,0 +1,37 @@ +import {NodeTypesEnum} from 'constants/Visualization.constants'; +import Span from 'models/Span.model'; +import {useRef} from 'react'; +import {FixedSizeList as List} from 'react-window'; +import NavigationWrapper from './NavigationWrapper'; +import TimelineProvider from './Timeline.provider'; +import ListWrapper from './ListWrapper'; + +export interface IProps { + nodeType: NodeTypesEnum; + spans: Span[]; + onNavigate(spanId: string): void; + onClick(spanId: string): void; + matchedSpans: string[]; + selectedSpan: string; +} + +const Timeline = ({nodeType, spans, onClick, onNavigate, matchedSpans, selectedSpan}: IProps) => { + const listRef = useRef(null); + + return ( + + + + + ); +}; + +export default Timeline; diff --git a/web/src/components/Visualization/components/Timeline/TraceSpanNode/TraceSpanNodeV2.tsx b/web/src/components/Visualization/components/Timeline/TraceSpanNode/TraceSpanNodeV2.tsx new file mode 100644 index 0000000000..539eda5ae2 --- /dev/null +++ b/web/src/components/Visualization/components/Timeline/TraceSpanNode/TraceSpanNodeV2.tsx @@ -0,0 +1,19 @@ +import useSpanData from 'hooks/useSpanData'; +// import Header from './Header'; +import BaseSpanNode from '../BaseSpanNode/BaseSpanNodeV2'; +import {IPropsComponent} from '../SpanNodeFactoryV2'; + +const TraceSpanNode = (props: IPropsComponent) => { + const {node} = props; + const {span} = useSpanData(node.data.id); + + return ( + } + span={span} + /> + ); +}; + +export default TraceSpanNode; diff --git a/web/src/constants/Timeline.constants.ts b/web/src/constants/Timeline.constants.ts index a8c3a1c480..4a4677dafd 100644 --- a/web/src/constants/Timeline.constants.ts +++ b/web/src/constants/Timeline.constants.ts @@ -3,3 +3,4 @@ export const AxisOffset = 100; export const NodeHeight = 66; export const NodeOverlayHeight = NodeHeight - 2; export const BaseLeftPadding = 10; +export const BaseLeftPaddingV2 = 16; diff --git a/web/src/constants/Visualization.constants.ts b/web/src/constants/Visualization.constants.ts index b1030ac6e9..9146f4a20d 100644 --- a/web/src/constants/Visualization.constants.ts +++ b/web/src/constants/Visualization.constants.ts @@ -2,3 +2,5 @@ export enum NodeTypesEnum { TraceSpan = 'traceSpan', TestSpan = 'testSpan', } + +export const MAX_DAG_NODES = 200; diff --git a/web/src/hooks/useSpanData.ts b/web/src/hooks/useSpanData.ts index 799bce5a07..a8ff64654d 100644 --- a/web/src/hooks/useSpanData.ts +++ b/web/src/hooks/useSpanData.ts @@ -28,6 +28,8 @@ const useSpanData = (id: string): IUseSpanData => { const span = useAppSelector(state => selectSpanById(state, {testId, runId, spanId: id})); + // TODO: should we get analyzerErrors, testSpecs and testOutputs as part of the trace struct from the BE? + // Right now we are getting them from the testRun struct for each span by spanId const analyzerErrors = useAppSelector(state => selectAnalyzerErrorsBySpanId(state, {testId, runId, spanId: id})); const testSpecs = useAppSelector(state => selectTestSpecsBySpanId(state, {testId, runId, spanId: id})); diff --git a/web/src/models/DAG.model.ts b/web/src/models/DAG.model.ts index 38248f6d71..d1d4ea3598 100644 --- a/web/src/models/DAG.model.ts +++ b/web/src/models/DAG.model.ts @@ -19,7 +19,10 @@ function DAG(spans: Span[], type: NodeTypesEnum) { if (b.id > a.id) return 1; return 0; }); + return DAGService.getEdgesAndNodes(nodesDatum); } +export const getShouldShowDAG = (spanCount: number): boolean => spanCount <= 200; + export default DAG; diff --git a/web/src/models/SearchSpansResult.model.ts b/web/src/models/SearchSpansResult.model.ts new file mode 100644 index 0000000000..affc074b76 --- /dev/null +++ b/web/src/models/SearchSpansResult.model.ts @@ -0,0 +1,22 @@ +import {Model, TTestSchemas} from '../types/Common.types'; + +export type TRawSearchSpansResult = TTestSchemas['SearchSpansResult']; +type SearchSpansResult = Model< + TRawSearchSpansResult, + { + spanIds: string[]; + spansIds?: undefined; + } +>; + +const defaultSearchSpansResult: TRawSearchSpansResult = { + spansIds: [], +}; + +function SearchSpansResult({spansIds = []} = defaultSearchSpansResult): SearchSpansResult { + return { + spanIds: spansIds, + }; +} + +export default SearchSpansResult; diff --git a/web/src/models/Span.model.ts b/web/src/models/Span.model.ts index 37f9c4cbae..580f156b82 100644 --- a/web/src/models/Span.model.ts +++ b/web/src/models/Span.model.ts @@ -48,7 +48,16 @@ const getSpanSignature = ( }, []); }; -const Span = ({id = '', attributes = {}, startTime = 0, endTime = 0, parentId = '', name = ''}: TRawSpan): Span => { +const defaultSpan: TRawSpan = { + id: '', + parentId: '', + name: '', + attributes: {}, + startTime: 0, + endTime: 0, +}; + +const Span = ({id = '', attributes = {}, startTime = 0, endTime = 0, parentId = '', name = ''} = defaultSpan): Span => { const mappedAttributeList: TSpanFlatAttribute[] = [{key: 'name', value: name}]; const attributeList = Object.entries(attributes) .map(([key, value]) => ({ diff --git a/web/src/models/TestRun.model.ts b/web/src/models/TestRun.model.ts index 4e39fedef8..e4dbcc3678 100644 --- a/web/src/models/TestRun.model.ts +++ b/web/src/models/TestRun.model.ts @@ -20,7 +20,7 @@ type TestRun = Model< TRawTestRun, { result: AssertionResults; - trace?: Trace; + trace: Trace; totalAssertionCount: number; failedAssertionCount: number; passedAssertionCount: number; @@ -138,7 +138,7 @@ const TestRun = ({ spanId, state, testVersion, - trace: trace ? Trace(trace) : undefined, + trace: trace ? Trace(trace) : Trace(), totalAssertionCount: getTestResultCount(result), failedAssertionCount: getTestResultCount(result, 'failed'), passedAssertionCount: getTestResultCount(result, 'passed'), diff --git a/web/src/models/Trace.model.ts b/web/src/models/Trace.model.ts index 5fabfab841..b0cdc8f036 100644 --- a/web/src/models/Trace.model.ts +++ b/web/src/models/Trace.model.ts @@ -1,16 +1,35 @@ -import { TTraceSchemas } from 'types/Common.types'; +import {TTraceSchemas} from 'types/Common.types'; import Span from './Span.model'; export type TRawTrace = TTraceSchemas['Trace']; +export type TSpanMap = Record; type Trace = { + flat: TSpanMap; spans: Span[]; traceId: string; + rootSpan: Span; }; -const Trace = ({traceId = '', flat = {}}: TRawTrace): Trace => { +const defaultTrace: TRawTrace = { + traceId: '', + flat: {}, + tree: {}, +}; + +const Trace = ({traceId = '', flat: rawFlat = {}, tree = {}} = defaultTrace): Trace => { + const flat: TSpanMap = {}; + const spans = Object.values(rawFlat).map(raw => { + const span = Span(raw); + flat[span.id || ''] = span; + + return span; + }); + return { traceId, - spans: Object.values(flat).map(rawSpan => Span(rawSpan)), + rootSpan: Span(tree), + flat, + spans, }; }; diff --git a/web/src/models/__tests__/TestRun.model.test.ts b/web/src/models/__tests__/TestRun.model.test.ts index 91c806fb08..2aa1012335 100644 --- a/web/src/models/__tests__/TestRun.model.test.ts +++ b/web/src/models/__tests__/TestRun.model.test.ts @@ -7,7 +7,6 @@ describe('Test Run', () => { const testRunResult = TestRun(rawTestRunResult); expect(testRunResult.id).toEqual(rawTestRunResult.id); - expect(testRunResult.trace).not.toEqual(undefined); expect(testRunResult.totalAssertionCount).toEqual(0); expect(testRunResult.passedAssertionCount).toEqual(0); expect(testRunResult.failedAssertionCount).toEqual(0); @@ -21,7 +20,6 @@ describe('Test Run', () => { const testRunResult = TestRun(rawTestRunResult); - expect(testRunResult.trace).toEqual(undefined); expect(testRunResult.executionTime).toEqual(0); }); }); diff --git a/web/src/providers/TestRun/TestRun.provider.tsx b/web/src/providers/TestRun/TestRun.provider.tsx index 57a378658d..169d8d5801 100644 --- a/web/src/providers/TestRun/TestRun.provider.tsx +++ b/web/src/providers/TestRun/TestRun.provider.tsx @@ -5,6 +5,7 @@ import TestRun, {isRunStateFinished} from 'models/TestRun.model'; import TestRunEvent from 'models/TestRunEvent.model'; import TracetestAPI from 'redux/apis/Tracetest'; import TestProvider from '../Test'; +import LoadingSpinner, { SpinnerContainer } from '../../components/LoadingSpinner'; const {useGetRunByIdQuery, useGetRunEventsQuery, useStopRunMutation, useSkipPollingMutation} = TracetestAPI.instance; @@ -76,7 +77,9 @@ const TestRunProvider = ({children, testId, runId = 0}: IProps) => { ) : ( -
    + + + ); }; diff --git a/web/src/providers/TestSpecs/TestSpecs.provider.tsx b/web/src/providers/TestSpecs/TestSpecs.provider.tsx index 42e8fe4420..ac4179c0e2 100644 --- a/web/src/providers/TestSpecs/TestSpecs.provider.tsx +++ b/web/src/providers/TestSpecs/TestSpecs.provider.tsx @@ -60,11 +60,11 @@ const TestSpecsProvider = ({children, testId, runId}: IProps) => { const {test} = useTest(); const {run} = useTestRun(); - const assertionResults = useAppSelector(state => TestSpecsSelectors.selectAssertionResults(state)); - const specs = useAppSelector(state => TestSpecsSelectors.selectSpecs(state)); - const isDraftMode = useAppSelector(state => TestSpecsSelectors.selectIsDraftMode(state)); - const isLoading = useAppSelector(state => TestSpecsSelectors.selectIsLoading(state)); - const isInitialized = useAppSelector(state => TestSpecsSelectors.selectIsInitialized(state)); + const assertionResults = useAppSelector(TestSpecsSelectors.selectAssertionResults); + const specs = useAppSelector(TestSpecsSelectors.selectSpecs); + const isDraftMode = useAppSelector(TestSpecsSelectors.selectIsDraftMode); + const isLoading = useAppSelector(TestSpecsSelectors.selectIsLoading); + const isInitialized = useAppSelector(TestSpecsSelectors.selectIsInitialized); const selectedSpec = useAppSelector(TestSpecsSelectors.selectSelectedSpec); const selectedTestSpec = useAppSelector(state => TestSpecsSelectors.selectAssertionBySelector(state, selectedSpec!)); diff --git a/web/src/redux/actions/Router.actions.ts b/web/src/redux/actions/Router.actions.ts index a7b195d36b..f404f4d99c 100644 --- a/web/src/redux/actions/Router.actions.ts +++ b/web/src/redux/actions/Router.actions.ts @@ -4,7 +4,7 @@ import {Params} from 'react-router-dom'; import {push} from 'redux-first-history'; import {RouterSearchFields} from 'constants/Common.constants'; import TestSpecsSelectors from 'selectors/TestSpecs.selectors'; -import DAGSelectors from 'selectors/DAG.selectors'; +// import DAGSelectors from 'selectors/DAG.selectors'; import SpanSelectors from 'selectors/Span.selectors'; import {setSelectedSpan} from 'redux/slices/Span.slice'; import {setSelectedSpec} from 'redux/slices/TestSpecs.slice'; @@ -31,10 +31,13 @@ const RouterActions = () => ({ getState() as RootState, Number(positionIndex) ); - const isDagReady = DAGSelectors.selectNodes(getState() as RootState).length > 0; + + // TODO: the default view for big traces is no longer the DAG, so this check is no longer valid + // move the view to the state and check depending on the type + // const isViewReady = DAGSelectors.selectNodes(getState() as RootState).length > 0; if (selectedSpec === assertionResult?.selector) return; - if (assertionResult && isDagReady) dispatch(setSelectedSpec(assertionResult)); + if (assertionResult) dispatch(setSelectedSpec(assertionResult)); } ), updateSelectedSpan: createAsyncThunk( diff --git a/web/src/redux/actions/TestSpecs.actions.ts b/web/src/redux/actions/TestSpecs.actions.ts index 7d3dea5399..f6583b91e5 100644 --- a/web/src/redux/actions/TestSpecs.actions.ts +++ b/web/src/redux/actions/TestSpecs.actions.ts @@ -26,6 +26,7 @@ const TestSpecsActions = () => ({ const specs = TestSpecsSelectors.selectSpecs(getState() as RootState).filter(def => !def.isDeleted); const outputs = selectTestOutputs(getState() as RootState); const rawTest = await TestService.getUpdatedRawTest(test, {definition: {specs}, outputs}); + await dispatch(TestGateway.edit(rawTest, testId)); return dispatch(TestRunGateway.reRun(testId, runId)).unwrap(); } diff --git a/web/src/redux/apis/Tracetest/endpoints/TestRun.endpoint.ts b/web/src/redux/apis/Tracetest/endpoints/TestRun.endpoint.ts index e19a9ff977..61621b1f0b 100644 --- a/web/src/redux/apis/Tracetest/endpoints/TestRun.endpoint.ts +++ b/web/src/redux/apis/Tracetest/endpoints/TestRun.endpoint.ts @@ -8,6 +8,7 @@ import SelectedSpans, {TRawSelectedSpans} from 'models/SelectedSpans.model'; import Test from 'models/Test.model'; import TestRun, {TRawTestRun} from 'models/TestRun.model'; import TestRunEvent, {TRawTestRunEvent} from 'models/TestRunEvent.model'; +import SearchSpansResult, {TRawSearchSpansResult} from 'models/SearchSpansResult.model'; import {KnownSources} from 'models/RunMetadata.model'; import {TRawTestSpecs} from 'models/TestSpecs.model'; import {TTestApiEndpointBuilder} from '../Tracetest.api'; @@ -113,6 +114,14 @@ export const testRunEndpoints = (builder: TTestApiEndpointBuilder) => ({ providesTags: (result, error, {query}) => (result ? [{type: TracetestApiTags.SPAN, id: `${query}-LIST`}] : []), transformResponse: (rawSpanList: TRawSelectedSpans) => SelectedSpans(rawSpanList), }), + getSearchedSpans: builder.mutation({ + query: ({query, testId, runId}) => ({ + url: `/tests/${testId}/run/${runId}/search-spans`, + method: HTTP_METHOD.POST, + body: JSON.stringify({query}), + }), + transformResponse: (raw: TRawSearchSpansResult) => SearchSpansResult(raw), + }), getRunEvents: builder.query({ query: ({runId, testId}) => `/tests/${testId}/run/${runId}/events`, diff --git a/web/src/redux/apis/Tracetest/index.ts b/web/src/redux/apis/Tracetest/index.ts index f81596602d..c0c7935bab 100644 --- a/web/src/redux/apis/Tracetest/index.ts +++ b/web/src/redux/apis/Tracetest/index.ts @@ -68,6 +68,7 @@ const { useLazyTestOtlpConnectionQuery, useTestOtlpConnectionQuery, useResetTestOtlpConnectionMutation, + useGetSearchedSpansMutation, endpoints, } = TracetestAPI.instance; @@ -129,5 +130,6 @@ export { useLazyTestOtlpConnectionQuery, useTestOtlpConnectionQuery, useResetTestOtlpConnectionMutation, + useGetSearchedSpansMutation, endpoints, }; diff --git a/web/src/redux/slices/DAG.slice.ts b/web/src/redux/slices/DAG.slice.ts index db55e0aa55..cea4c45145 100644 --- a/web/src/redux/slices/DAG.slice.ts +++ b/web/src/redux/slices/DAG.slice.ts @@ -1,4 +1,4 @@ -import {createSlice, PayloadAction} from '@reduxjs/toolkit'; +import {createAsyncThunk, createSlice, PayloadAction} from '@reduxjs/toolkit'; import {applyNodeChanges, Edge, MarkerType, Node, NodeChange} from 'react-flow-renderer'; import {theme} from 'constants/Theme.constants'; @@ -23,8 +23,7 @@ const dagSlice = createSlice({ name: 'dag', initialState, reducers: { - initNodes(state, {payload}: PayloadAction<{spans: Span[]}>) { - const {edges, nodes} = DAGModel(payload.spans, NodeTypesEnum.TestSpan); + initNodes(state, {payload: {edges, nodes}}: PayloadAction<{edges: Edge[]; nodes: Node[]}>) { state.edges = edges; state.nodes = nodes; }, @@ -78,5 +77,13 @@ const dagSlice = createSlice({ }, }); -export const {initNodes, onNodesChange} = dagSlice.actions; +export const initNodes = createAsyncThunk( + 'dag/generateDagLayout', + async ({spans}, {dispatch}) => { + const {edges, nodes} = await DAGModel(spans, NodeTypesEnum.TestSpan); + dispatch(dagSlice.actions.initNodes({edges, nodes})); + } +); + +export const {onNodesChange} = dagSlice.actions; export default dagSlice.reducer; diff --git a/web/src/redux/slices/Trace.slice.ts b/web/src/redux/slices/Trace.slice.ts index d258bd9032..542c3f7d10 100644 --- a/web/src/redux/slices/Trace.slice.ts +++ b/web/src/redux/slices/Trace.slice.ts @@ -1,4 +1,4 @@ -import {createSlice, PayloadAction} from '@reduxjs/toolkit'; +import {createAsyncThunk, createSlice, PayloadAction} from '@reduxjs/toolkit'; import {applyNodeChanges, Edge, MarkerType, Node, NodeChange} from 'react-flow-renderer'; import {theme} from 'constants/Theme.constants'; @@ -26,10 +26,10 @@ const traceSlice = createSlice({ name: 'trace', initialState, reducers: { - initNodes(state, {payload}: PayloadAction<{spans: Span[]}>) { - const {edges, nodes} = DAGModel(payload.spans, NodeTypesEnum.TraceSpan); + initNodes(state, {payload: {edges, nodes}}: PayloadAction<{edges: Edge[]; nodes: Node[]}>) { state.edges = edges; state.nodes = nodes; + // Clear state state.matchedSpans = []; state.searchText = ''; @@ -70,5 +70,13 @@ const traceSlice = createSlice({ }, }); -export const {initNodes, changeNodes, selectSpan, matchSpans, setSearchText} = traceSlice.actions; +export const initNodes = createAsyncThunk( + 'trace/generateDagLayout', + async ({spans}, {dispatch}) => { + const {edges, nodes} = await DAGModel(spans, NodeTypesEnum.TraceSpan); + dispatch(traceSlice.actions.initNodes({edges, nodes})); + } +); + +export const {changeNodes, selectSpan, matchSpans, setSearchText} = traceSlice.actions; export default traceSlice.reducer; diff --git a/web/src/selectors/Assertion.selectors.ts b/web/src/selectors/Assertion.selectors.ts index 7351d3a2c8..8635b74055 100644 --- a/web/src/selectors/Assertion.selectors.ts +++ b/web/src/selectors/Assertion.selectors.ts @@ -29,7 +29,7 @@ const selectMatchedSpanList = createSelector(stateSelector, paramsSelector, (sta const {data: {trace} = {}} = TracetestAPI.instance.endpoints.getRunById.select({testId, runId})(state); if (!spanIdList.length) return trace?.spans || []; - return trace?.spans.filter(({id}) => spanIdList.includes(id)) || []; + return spanIdList.map((spanId) => trace!.flat[spanId]); }); const AssertionSelectors = () => { diff --git a/web/src/selectors/Editor.selectors.ts b/web/src/selectors/Editor.selectors.ts new file mode 100644 index 0000000000..9f511e96c2 --- /dev/null +++ b/web/src/selectors/Editor.selectors.ts @@ -0,0 +1,26 @@ +import {uniqBy} from 'lodash'; +import {createSelector} from '@reduxjs/toolkit'; +import {RootState} from 'redux/store'; +import AssertionSelectors from './Assertion.selectors'; +import SpanSelectors from './Span.selectors'; + +const stateSelector = (state: RootState) => state; +const paramsSelector = (state: RootState, testId: string, runId: number) => ({ + testId, + runId, +}); + +export const selectSelectorAttributeList = createSelector(stateSelector, paramsSelector, (state, {testId, runId}) => + AssertionSelectors.selectAllAttributeList(state, testId, runId) +); + +export const selectExpressionAttributeList = createSelector( + stateSelector, + paramsSelector, + SpanSelectors.selectMatchedSpans, + (state, {testId, runId}, spanIds) => { + const attributeList = AssertionSelectors.selectAttributeList(state, testId, runId, spanIds); + + return uniqBy(attributeList, 'key'); + } +); diff --git a/web/src/selectors/Span.selectors.ts b/web/src/selectors/Span.selectors.ts index d1dc43f3ad..9e6ecc8cc0 100644 --- a/web/src/selectors/Span.selectors.ts +++ b/web/src/selectors/Span.selectors.ts @@ -23,9 +23,7 @@ const SpanSelectors = () => ({ selectSpanById: createSelector(stateSelector, paramsSelector, (state, {spanId, testId, runId}) => { const {data: {trace} = {}} = TracetestAPI.instance.endpoints.getRunById.select({testId, runId})(state); - const spanList = trace?.spans || []; - - return spanList.find(span => span.id === spanId); + return trace?.flat[spanId]; }), selectSelectedSpan: createSelector(spansStateSelector, ({selectedSpan}) => selectedSpan), selectFocusedSpan: createSelector(spansStateSelector, ({focusedSpan}) => focusedSpan), diff --git a/web/src/selectors/TestRun.selectors.ts b/web/src/selectors/TestRun.selectors.ts index bcc50c2c24..9638ed067f 100644 --- a/web/src/selectors/TestRun.selectors.ts +++ b/web/src/selectors/TestRun.selectors.ts @@ -15,7 +15,7 @@ const selectTestRun = (state: RootState, params: {testId: string; runId: number; export const selectSpanById = createSelector([selectTestRun, selectParams], (testRun, params) => { const {trace} = testRun; - return trace?.spans?.find(span => span.id === params.spanId) ?? Span({id: params.spanId}); + return trace.flat[params.spanId] || Span({id: params.spanId}); }); const selectAnalyzerErrors = createSelector([selectTestRun], testRun => { diff --git a/web/src/services/Analyzer.service.ts b/web/src/services/Analyzer.service.ts index 12600cc319..a91bc39574 100644 --- a/web/src/services/Analyzer.service.ts +++ b/web/src/services/Analyzer.service.ts @@ -3,14 +3,23 @@ import LinterResult from 'models/LinterResult.model'; const MAX_PLUGIN_SCORE = 100; const AnalyzerService = () => ({ - getPlugins(plugins: LinterResult['plugins'], showOnlyErrors: boolean): LinterResult['plugins'] { + getPlugins( + plugins: LinterResult['plugins'], + showOnlyErrors: boolean, + spanIds: string[] = [] + ): LinterResult['plugins'] { return plugins .filter(plugin => !showOnlyErrors || plugin.score < MAX_PLUGIN_SCORE) .map(plugin => ({ ...plugin, rules: plugin.rules .filter(rule => !showOnlyErrors || !rule.passed) - .map(rule => ({...rule, results: rule?.results?.filter(result => !showOnlyErrors || !result.passed)})), + .map(rule => ({ + ...rule, + results: rule.results.filter( + result => (!spanIds.length || spanIds.includes(result.spanId)) && (!showOnlyErrors || !result.passed) + ), + })), })); }, }); diff --git a/web/src/services/Assertion.service.ts b/web/src/services/Assertion.service.ts index dcbbd21d88..cf616dc3da 100644 --- a/web/src/services/Assertion.service.ts +++ b/web/src/services/Assertion.service.ts @@ -53,9 +53,10 @@ const AssertionService = () => ({ .some(result => !!result); }, - getResultsHashedBySpanId(resultList: AssertionResult[]) { + getResultsHashedBySpanId(resultList: AssertionResult[], spanIds: string[] = []) { return resultList .flatMap(({assertion, spanResults}) => spanResults.map(spanResult => ({result: spanResult, assertion}))) + .filter(({result}) => !spanIds.length || spanIds.includes(result.spanId)) .reduce((prev: Record, curr) => { const items = prev[curr.result.spanId] || []; items.push(curr); diff --git a/web/src/services/DAG.service.ts b/web/src/services/DAG.service.ts index c8ec9358e6..e1fb1a7050 100644 --- a/web/src/services/DAG.service.ts +++ b/web/src/services/DAG.service.ts @@ -1,10 +1,11 @@ import {coordCenter, Dag, dagStratify, layeringSimplex, sugiyama} from 'd3-dag'; -import {MarkerType} from 'react-flow-renderer'; +import {Edge, MarkerType, Node} from 'react-flow-renderer'; import {theme} from 'constants/Theme.constants'; import {INodeDatum} from 'types/DAG.types'; +import {withLowPriority} from '../utils/Common'; -function getDagLayout(nodesDatum: INodeDatum[]) { +function getDagLayout(nodesDatum: INodeDatum[]): Dag, undefined> { const stratify = dagStratify(); const dag = stratify(nodesDatum); @@ -18,7 +19,7 @@ function getDagLayout(nodesDatum: INodeDatum[]) { return dag; } -function getNodes(dagLayout: Dag, undefined>) { +function getNodes(dagLayout: Dag, undefined>): Node[] { return dagLayout.descendants().map(({data: {id, data, type}, x, y}) => ({ data, id, @@ -27,7 +28,7 @@ function getNodes(dagLayout: Dag, undefined>) { })); } -function getEdges(dagLayout: Dag, undefined>) { +function getEdges(dagLayout: Dag, undefined>): Edge[] { return dagLayout.links().map(({source, target}) => ({ animated: false, id: `${source.data.id}-${target.data.id}`, @@ -39,12 +40,12 @@ function getEdges(dagLayout: Dag, undefined>) { } const DAGService = () => ({ - getEdgesAndNodes(nodesDatum: INodeDatum[]) { + async getEdgesAndNodes(nodesDatum: INodeDatum[]): Promise<{edges: Edge[]; nodes: Node[]}> { if (!nodesDatum.length) return {edges: [], nodes: []}; - const dagLayout = getDagLayout(nodesDatum); - const edges = getEdges(dagLayout); - const nodes = getNodes(dagLayout); + const dagLayout = await withLowPriority(getDagLayout)(nodesDatum); + const edges = await withLowPriority(getEdges)(dagLayout); + const nodes = await withLowPriority(getNodes)(dagLayout); return {edges, nodes}; }, diff --git a/web/src/services/Span.service.ts b/web/src/services/Span.service.ts index 1325e2d3e2..c4a439f851 100644 --- a/web/src/services/Span.service.ts +++ b/web/src/services/Span.service.ts @@ -45,6 +45,7 @@ const SpanService = () => ({ ).trim()}]`; }, + // TODO: this is very costly, we might need to move this to the backend searchSpanList(spanList: Span[], searchText: string) { if (!searchText.trim()) return []; diff --git a/web/src/services/TestRun.service.ts b/web/src/services/TestRun.service.ts index e0ad41303f..503b3b8aad 100644 --- a/web/src/services/TestRun.service.ts +++ b/web/src/services/TestRun.service.ts @@ -2,10 +2,12 @@ import {filter, findLastIndex, flow} from 'lodash'; import {TestRunStage, TraceEventType} from 'constants/TestRunEvents.constants'; import AssertionResults from 'models/AssertionResults.model'; import LinterResult from 'models/LinterResult.model'; -import {isRunStateAnalyzingError, isRunStateStopped, isRunStateSucceeded} from 'models/TestRun.model'; +import TestRun, {isRunStateAnalyzingError, isRunStateStopped, isRunStateSucceeded} from 'models/TestRun.model'; import TestRunEvent from 'models/TestRunEvent.model'; import TestRunOutput from 'models/TestRunOutput.model'; import {TAnalyzerErrorsBySpan, TTestOutputsBySpan, TTestRunState, TTestSpecsBySpan} from 'types/TestRun.types'; +import Date from 'utils/Date'; +import {singularOrPlural} from 'utils/Common'; const TestRunService = () => ({ shouldDisplayTraceEvents(state: TTestRunState, numberOfSpans: number) { @@ -96,6 +98,14 @@ const TestRunService = () => ({ return {...prev, [curr.spanId]: [...value, curr]}; }, {}); }, + + getHeaderInfo({createdAt, testVersion, metadata: {source = ''}, trace}: TestRun, triggerType: string) { + const createdTimeAgo = Date.getTimeAgo(createdAt ?? ''); + + return `v${testVersion} • ${triggerType} • Ran ${createdTimeAgo} • ${ + !!trace?.spans.length && `${trace.spans.length} ${singularOrPlural('span', trace?.spans.length)}` + } ${source && `• Run via ${source.toUpperCase()}`}`; + }, }); export default TestRunService(); diff --git a/web/src/services/Timeline.service.ts b/web/src/services/Timeline.service.ts index 610f389dab..8b06096135 100644 --- a/web/src/services/Timeline.service.ts +++ b/web/src/services/Timeline.service.ts @@ -2,6 +2,8 @@ import {stratify} from '@visx/hierarchy'; import {NodeTypesEnum} from 'constants/Visualization.constants'; import {INodeDataSpan, TNode} from 'types/Timeline.types'; +export type TScaleFunction = (start: number, end: number) => {start: number; end: number}; + function getHierarchyNodes(nodesData: INodeDataSpan[]) { return stratify() .id(d => d.id) @@ -48,6 +50,22 @@ const TimelineService = () => ({ const endTimes = nodes.map(node => node.data.endTime); return [Math.min(...startTimes), Math.max(...endTimes)]; }, + + createScaleFunc(viewRange: {min: number; max: number}): TScaleFunction { + const {min, max} = viewRange; + const viewWindow = max - min; + + /** + * Scale function + * @param {number} start The start of the sub-range. + * @param {number} end The end of the sub-range. + * @return {Object} The resultant range. + */ + return (start: number, end: number) => ({ + start: (start - min) / viewWindow, + end: (end - min) / viewWindow, + }); + }, }); export default TimelineService(); diff --git a/web/src/utils/Common.ts b/web/src/utils/Common.ts index 6cdc3dab52..ef2c86c1e9 100644 --- a/web/src/utils/Common.ts +++ b/web/src/utils/Common.ts @@ -87,3 +87,12 @@ export const getParsedURL = (rawUrl: string): URL => { return new URL(rawUrl); }; + +export const withLowPriority = + any>(fn: T): ((...args: Parameters) => Promise>) => + (...args: Parameters): Promise> => + new Promise(resolve => { + setTimeout(() => { + resolve(fn(...args)); + }, 0); + }); diff --git a/web/src/utils/Date.ts b/web/src/utils/Date.ts index d534d4dbe3..19c73d2433 100644 --- a/web/src/utils/Date.ts +++ b/web/src/utils/Date.ts @@ -1,4 +1,21 @@ import {format, formatDistanceToNowStrict, isValid, parseISO} from 'date-fns'; +import dropWhile from 'lodash/dropWhile'; +import round from 'lodash/round'; + +export const ONE_MILLISECOND = 1000 * 1; +const ONE_SECOND = 1000 * ONE_MILLISECOND; +const ONE_MINUTE = 60 * ONE_SECOND; +const ONE_HOUR = 60 * ONE_MINUTE; +const ONE_DAY = 24 * ONE_HOUR; + +const UNIT_STEPS: {unit: string; microseconds: number; ofPrevious: number}[] = [ + {unit: 'd', microseconds: ONE_DAY, ofPrevious: 24}, + {unit: 'h', microseconds: ONE_HOUR, ofPrevious: 60}, + {unit: 'm', microseconds: ONE_MINUTE, ofPrevious: 60}, + {unit: 's', microseconds: ONE_SECOND, ofPrevious: 1000}, + {unit: 'ms', microseconds: ONE_MILLISECOND, ofPrevious: 1000}, + {unit: 'μs', microseconds: 1, ofPrevious: 1000}, +]; const Date = { format(date: string, dateFormat = "EEEE, yyyy/MM/dd 'at' HH:mm:ss") { @@ -8,6 +25,7 @@ const Date = { } return format(isoDate, dateFormat); }, + getTimeAgo(date: string) { const isoDate = parseISO(date); if (!isValid(isoDate)) { @@ -15,9 +33,35 @@ const Date = { } return formatDistanceToNowStrict(isoDate, {addSuffix: true}); }, + isDefaultDate(date: string) { return date === '0001-01-01T00:00:00Z'; }, + + /** + * Format duration for display. + * + * @param {number} duration - microseconds + * @return {string} formatted duration + */ + formatDuration(duration: number): string { + // Drop all units that are too large except the last one + const [primaryUnit, secondaryUnit] = dropWhile( + UNIT_STEPS, + ({microseconds}, index) => index < UNIT_STEPS.length - 1 && microseconds > duration + ); + + if (primaryUnit.ofPrevious === 1000) { + // If the unit is decimal based, display as a decimal + return `${round(duration / primaryUnit.microseconds, 2)}${primaryUnit.unit}`; + } + + const primaryValue = Math.floor(duration / primaryUnit.microseconds); + const primaryUnitString = `${primaryValue}${primaryUnit.unit}`; + const secondaryValue = Math.round((duration / secondaryUnit.microseconds) % primaryUnit.ofPrevious); + const secondaryUnitString = `${secondaryValue}${secondaryUnit.unit}`; + return secondaryValue === 0 ? primaryUnitString : `${primaryUnitString} ${secondaryUnitString}`; + }, }; export default Date;