diff --git a/.nvmrc b/.nvmrc index 87834047a6f..d4b7699d36c 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.12.2 +20.18.1 diff --git a/Dockerfile b/Dockerfile index 5ecf456f9b9..08b593f8e62 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,8 @@ RUN jq '. | del(.references[] | select(.path == "packages/cli"))' tsconfig.build # ------------------ # New tmp image # ------------------ -FROM node:20.12.2-bullseye-slim AS build +FROM node:20.18.1-bookworm-slim AS build + # Setup the app WORKDIR WORKDIR /app/tmp @@ -80,8 +81,10 @@ RUN true \ # ---- Web ---- # Resulting new, minimal image -FROM node:20.12.2-bullseye-slim as web +FROM node:20.18.1-bookworm-slim as web +# Install a more recent npm +RUN npm install -g npm@10.9.2 # - Bash is just to be able to log inside the image and have a decent shell RUN true \ diff --git a/docs-v2/integrations/all/builtwith.mdx b/docs-v2/integrations/all/builtwith.mdx new file mode 100644 index 00000000000..3ad9b50be0a --- /dev/null +++ b/docs-v2/integrations/all/builtwith.mdx @@ -0,0 +1,46 @@ +--- +title: BuiltWith +sidebarTitle: BuiltWith +provider: builtwith +--- + +import Overview from '/snippets/overview.mdx'; +import PreBuiltTooling from '/snippets/generated/builtwith/PreBuiltTooling.mdx'; + +import PreBuiltUseCases from '/snippets/generated/builtwith/PreBuiltUseCases.mdx'; + + + + + +## Access requirements +| Pre-Requisites | Status | Comment | +| ----------------- | ------ | ------- | +| Paid dev account | ❓ | | +| Paid test account | ❓ | | +| Partnership | ❓ | | +| App review | ❓ | | +| Security audit | ❓ | | + +## Setup guide + +_No setup guide yet._ + +Need help getting started? Get help in the [community](https://nango.dev/slack). + + + Contribute improvements to the setup guide by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/builtwith.mdx) + + +## Useful links + +- [Generate a BuiltWith API key in your BuiltWith account](https://api.builtwith.com) +- [BuiltWith API Docs](https://api.builtwith.com/free-api) + +Contribute useful links by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/builtwith.mdx) + +## API gotchas + +_No API gotchas yet._ + +Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/builtwith.mdx) diff --git a/docs-v2/integrations/all/builtwith/connect.mdx b/docs-v2/integrations/all/builtwith/connect.mdx new file mode 100644 index 00000000000..dcf85b252d7 --- /dev/null +++ b/docs-v2/integrations/all/builtwith/connect.mdx @@ -0,0 +1,35 @@ +--- +title: BuiltWith - How do I link my account? +sidebarTitle: BuiltWith +--- + +# Overview + +To authenticate with BuiltWith, you will need: + +1. **API Key** - A key that is used to identify your BuiltWith account. + +This guide will walk you through finding these Keys within BuiltWith. + +### Prerequisites: + +- You must have a registered BuiltWith account. + +### Instructions: + +#### Step 1: Finding Your API Key + +1. **Log in** to your BuiltWith dashboard. +2. Open the **Tools** menu and click **API Access**. +3. You will see your API key in the **API Key** field. +4. You can also find your API key at [BuiltWith API](https://api.builtwith.com/) + +#### Step 2: Enter API Key in the Connect UI + +Once you have your **API Key**: + +1. Open the form where you need to authenticate with BuiltWith. +2. Enter your **API Key** in the designated field. +3. Submit the form, and you should be successfully authenticated. + +You are now connected to BuiltWith. diff --git a/docs-v2/integrations/all/chorus.mdx b/docs-v2/integrations/all/chorus.mdx index 9f381f621d5..85f99d66b65 100644 --- a/docs-v2/integrations/all/chorus.mdx +++ b/docs-v2/integrations/all/chorus.mdx @@ -44,4 +44,10 @@ _No setup guide yet._ - Chorus uses `API_KEY` auth mode with `Authorization: Bearer ${apiKey}` in the request header to access different endpoints. - API tokens can be generated for each Chorus user, and is managed via the Personal Settings page within the Chorus application. -Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/chorus.mdx) \ No newline at end of file +Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/chorus.mdx) + +## Going further + + + Guide to connect to Chorus using Connect UI + diff --git a/docs-v2/integrations/all/chorus/connect.mdx b/docs-v2/integrations/all/chorus/connect.mdx new file mode 100644 index 00000000000..de8e8706642 --- /dev/null +++ b/docs-v2/integrations/all/chorus/connect.mdx @@ -0,0 +1,38 @@ +--- +title: Chorus - How do I link my account? +sidebarTitle: Chorus +--- + + +# Overview + +To authenticate with Chorus, you need: +1. **API Key** - Your Chorus API Key + + +This guide will walk you through generating the API Key within Chorus. + + +### Prerequisites: + +- You must have a **Chorus Admin account**. Only Chorus Admins can generate the **API key**. + + +#### Step 1: Generating Your Chorus API Key +1. Log in to your [Chorus account](https://hello.chorus.ai/login). +2. In the navigation menu, click the **Profile** icon, then select **Settings**. +3. In the **Personal Settings** page, scroll down to find **API Access**. +4. Click **Generate API Token**. + +#### Step 2: Enter credentials in the Connect UI + +Once you have the **API Key**: +1. Open the form where you need to authenticate with Chorus. +2. Enter the **API Key** in the designated field. +3. Submit the form, and you should be successfully authenticated. + + + + +You are now connected to Chorus. + \ No newline at end of file diff --git a/docs-v2/integrations/all/chorus/form.png b/docs-v2/integrations/all/chorus/form.png new file mode 100644 index 00000000000..55c168f0a89 Binary files /dev/null and b/docs-v2/integrations/all/chorus/form.png differ diff --git a/docs-v2/integrations/all/freshsales.mdx b/docs-v2/integrations/all/freshsales.mdx index 9f7561f101f..933691d559c 100644 --- a/docs-v2/integrations/all/freshsales.mdx +++ b/docs-v2/integrations/all/freshsales.mdx @@ -46,4 +46,10 @@ _No setup guide yet._ - When creating a connection, you need to add the subdomain as a connection configuration parameter, for example: `nango.auth('freshsales', 'test-connection-id', {params: {subdomain: ''}})`. - Freshsales enforces rate limit on the account level. For more details check [freshsales rate limit](https://support.freshsales.io/en/support/solutions/articles/223406-does-freshsales-have-api-request-limits-for-an-account-) -Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/freshsales.mdx) \ No newline at end of file +Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/freshsales.mdx) + +## Going further + + + Guide to connect to Freshsales using Connect UI + \ No newline at end of file diff --git a/docs-v2/integrations/all/freshsales/api_key.png b/docs-v2/integrations/all/freshsales/api_key.png new file mode 100644 index 00000000000..a73ebf8162f Binary files /dev/null and b/docs-v2/integrations/all/freshsales/api_key.png differ diff --git a/docs-v2/integrations/all/freshsales/connect.mdx b/docs-v2/integrations/all/freshsales/connect.mdx new file mode 100644 index 00000000000..c45263f5031 --- /dev/null +++ b/docs-v2/integrations/all/freshsales/connect.mdx @@ -0,0 +1,39 @@ +--- +title: Freshsales - How do I link my account? +sidebarTitle: Freshsales +--- + + +# Overview + +To authenticate with Freshsales, you need: +1. **API Key** - Your Freshsales API Key. +2. **Freshsales subdomain** - Your unique Freshsales subdomain (e.g., mycompany.freshsales.com). + +This guide will walk you through finding both your **API Key** and **Freshsales subdomain** within Freshsales. + +### Prerequisites: + +- You must have an account with Freshsales. + +#### Step 1: Finding Your Freshsales API Key +1. Login to your **Freshsales** account. Click on your **Profile picture** and select **Personal Settings**. + +2. Click on the **API** tab. Your **API Key** will be displayed in **Your API Key** field. + + + +#### Step 2: Finding Your Freshsales subdomain +1. Login to your **Freshsales** account. On you address bar, The URL will be similar to: `https://mycompany.myfreshworks.com/crm/sales/`. Your subdomain is the text between `https://` and `.myfreshworks.com`, which in this case would be `mycompany`. + +#### Step 3: Enter credentials in the Connect UI + +Once you have your **API Key** and **Freshsales Domain**: +1. Open the form where you need to authenticate with Freshsales. +2. Enter the **API Key** and **Freshsales subdomain** in their designated fields. +3. Submit the form, and you should be successfully authenticated. + + + + +You are now connected to Freshsales. diff --git a/docs-v2/integrations/all/freshsales/form.png b/docs-v2/integrations/all/freshsales/form.png new file mode 100644 index 00000000000..1b046e8eead Binary files /dev/null and b/docs-v2/integrations/all/freshsales/form.png differ diff --git a/docs-v2/integrations/all/freshsales/profile.png b/docs-v2/integrations/all/freshsales/profile.png new file mode 100644 index 00000000000..f3164049cf3 Binary files /dev/null and b/docs-v2/integrations/all/freshsales/profile.png differ diff --git a/docs-v2/integrations/all/gainsight-cc.mdx b/docs-v2/integrations/all/gainsight-cc.mdx index 19e54da306d..0bebabff936 100644 --- a/docs-v2/integrations/all/gainsight-cc.mdx +++ b/docs-v2/integrations/all/gainsight-cc.mdx @@ -45,3 +45,9 @@ _No setup guide yet._ - To view the list of scopes for a given endpoint, please refer to the Authorizations section of that endpoint. - When creating a new connection in Nango, please provide your `region`. You can find this under `API access information` in Control. Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/gainsight-cc.mdx) + +## Going further + + + Guide to connect to Gainsight CC using Connect UI + diff --git a/docs-v2/integrations/all/gainsight-cc/api-credentials.png b/docs-v2/integrations/all/gainsight-cc/api-credentials.png new file mode 100644 index 00000000000..a6c10ee6147 Binary files /dev/null and b/docs-v2/integrations/all/gainsight-cc/api-credentials.png differ diff --git a/docs-v2/integrations/all/gainsight-cc/connect.mdx b/docs-v2/integrations/all/gainsight-cc/connect.mdx new file mode 100644 index 00000000000..e96445e3a1e --- /dev/null +++ b/docs-v2/integrations/all/gainsight-cc/connect.mdx @@ -0,0 +1,43 @@ +--- +title: Gainsight CC - How do I link my account? +sidebarTitle: Gainsight CC +--- + + +# Overview + +To authenticate with Gainsight CC, you need: +1. **Client ID** - A unique identifier for your client. +2. **Client Secret** - A confidential key used to authenticate the identity of the application (client). +3. **Region** - The specific Gainsight CC region where your data resides. + +This guide will walk you through obtaining these credentials within Gainsight CC. + +### Prerequisites: + +- You must have an account with Gainsight CC. + +### Instructions: + +#### Step 1: Generating API credentials +1. Login to your Gainsight CC account. +2. Navigate to **Integrations** and select **API**. +3. In the **OAuth2** section, add a name in the **Label** field and click the **Create an OAuth2 client**. A pair of API credentials will be generated for you. + + +#### Step 2: Finding your region +1. Within the **API** section in the **Integrations** section, head to the **API access information** area. Your **Region** will be displayed there. + + +#### Step 3: Enter credentials in the Connect UI + +Once you have the **Client ID**, **Client Secret** and **Region**: +1. Open the form where you need to authenticate with Gainsight CC. +2. Enter the **Client ID**, **Client Secret** and **Region** in their designated fields. +3. Submit the form, and you should be successfully authenticated. + + + + +You are now connected to Gainsight CC. + \ No newline at end of file diff --git a/docs-v2/integrations/all/gainsight-cc/form.png b/docs-v2/integrations/all/gainsight-cc/form.png new file mode 100644 index 00000000000..0dd27a65d8a Binary files /dev/null and b/docs-v2/integrations/all/gainsight-cc/form.png differ diff --git a/docs-v2/integrations/all/gainsight-cc/region.png b/docs-v2/integrations/all/gainsight-cc/region.png new file mode 100644 index 00000000000..64c72465e23 Binary files /dev/null and b/docs-v2/integrations/all/gainsight-cc/region.png differ diff --git a/docs-v2/integrations/all/gong.mdx b/docs-v2/integrations/all/gong.mdx index 1eb0724951f..c8820db4077 100644 --- a/docs-v2/integrations/all/gong.mdx +++ b/docs-v2/integrations/all/gong.mdx @@ -41,6 +41,8 @@ Gong offers both Basic auth (API key) and OAuth as authentication. Nango impleme - [API Docs](https://app.gong.io/settings/api/documentation#overview) - [Oauth-related docs](https://help.gong.io/hc/en-us/articles/13944551222157-Create-an-app-for-Gong) - [API rate limiting](https://app.gong.io/settings/api/documentation#overview) +- [SCIM API Docs](https://help.gong.io/docs/provision-team-members-from-a-custom-source-scim) +- [Retrieve Access Key and Access Key Secret](https://help.gong.io/docs/receive-access-to-the-api) Contribute useful links by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/gong.mdx) @@ -54,6 +56,6 @@ Gong offers both Basic auth (API key) and OAuth as authentication. Nango impleme Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/gong.mdx) - + Guide to connect to Gong API using Nango Connect. diff --git a/docs-v2/integrations/all/gong/connect.mdx b/docs-v2/integrations/all/gong/connect.mdx index 779ff910555..8670f13f363 100644 --- a/docs-v2/integrations/all/gong/connect.mdx +++ b/docs-v2/integrations/all/gong/connect.mdx @@ -14,7 +14,7 @@ This guide will walk you through finding or creating those credentials within Go ### Prerequisites: -- You must set up an account with Gong. +- You must set up an administrator account with Gong. #### Step 1: Finding Gong API Key and API Key Secret 1. Log into your Gong account and navigate to `Company Settings` > `Ecosystem` > `API` and click `Create` to generate the access key and the access key secret. diff --git a/docs-v2/integrations/all/hackerrank-work.mdx b/docs-v2/integrations/all/hackerrank-work.mdx index 5074d2c4d58..a4d11a4930c 100644 --- a/docs-v2/integrations/all/hackerrank-work.mdx +++ b/docs-v2/integrations/all/hackerrank-work.mdx @@ -44,4 +44,8 @@ _No setup guide yet._ - HackerRank-Work uses `Basic` auth mode to access different endpoints. Provide your API key as the `Basic` auth username value. You do not need to provide a password. -Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/hackerrank-work.mdx) \ No newline at end of file +Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/hackerrank-work.mdx) + + + Guide to connect to HackerRank Work using Nango Connect. + diff --git a/docs-v2/integrations/all/hackerrank-work/connect.mdx b/docs-v2/integrations/all/hackerrank-work/connect.mdx new file mode 100644 index 00000000000..f4b2f96fab5 --- /dev/null +++ b/docs-v2/integrations/all/hackerrank-work/connect.mdx @@ -0,0 +1,40 @@ +--- +title: Hackerrank - How do I link my account? +sidebarTitle: Hackerrank +--- + +# Overview + +To authenticate with Hackerrank, you need one key piece of information: +1. **API Key** - Your Hackerrank Work API Key + +This guide will walk you through finding or creating those credentials within Hackerrank. + +### Prerequisites: + +- You must set up an account with Hackerrank. +- An Enterprise plan with a Recruiter license. +- You must have an activated Recruiter-type user account with Company Admin permissions. + +#### Step 1: Finding Hackerrank API Key +1. Log into your Hackerrank account. +2. Click the down arrow next to the user icon on the top right corner of the Home page. +3. Click `Settings` from the drop-down menu and then click `API Access` in the left navigation pane. + + + +4. On the displayed page, click `New Token`. + + + +5. In the New Token dialog box, specify the token label and then click Generate Token. + +#### Step 2: Connect Your Hackerrank Account + + + +To authenticate using your API credentials, navigate to the Hackerrank authentication form. +Enter your credentials as follows: +- API Key: Your Hackerrank API Key + +Click "Connect" to complete the authentication. diff --git a/docs-v2/integrations/all/hackerrank-work/h1.png b/docs-v2/integrations/all/hackerrank-work/h1.png new file mode 100644 index 00000000000..bc5c36d2ec1 Binary files /dev/null and b/docs-v2/integrations/all/hackerrank-work/h1.png differ diff --git a/docs-v2/integrations/all/hackerrank-work/h2.png b/docs-v2/integrations/all/hackerrank-work/h2.png new file mode 100644 index 00000000000..b78c6a1ba8c Binary files /dev/null and b/docs-v2/integrations/all/hackerrank-work/h2.png differ diff --git a/docs-v2/integrations/all/hackerrank-work/nango_connect_ui.png b/docs-v2/integrations/all/hackerrank-work/nango_connect_ui.png new file mode 100644 index 00000000000..0392908c6e0 Binary files /dev/null and b/docs-v2/integrations/all/hackerrank-work/nango_connect_ui.png differ diff --git a/docs-v2/integrations/all/helpscout-docs/connect.mdx b/docs-v2/integrations/all/helpscout-docs/connect.mdx new file mode 100644 index 00000000000..456b0dae68c --- /dev/null +++ b/docs-v2/integrations/all/helpscout-docs/connect.mdx @@ -0,0 +1,39 @@ +--- +title: Help Scout - How do I link my account? +sidebarTitle: Help Scout +--- + +# Overview + +To authenticate with Help Scout, you need one key piece of information: +1. **API Key** - Your Help Scout Work API Key + +This guide will walk you through finding or creating those credentials within Help Scout. + +### Prerequisites: + +- You must set up an account with Help Scout. + +#### Step 1: Finding Help Scout API Key +1. Log into your Help Scout account. +2. Each user has a Docs API key. To generate, view, or regenerate the API key, click the "person" icon on the top right of your account, next to the search, then click `Your Profile`. + + + +3. Next, click the `Authentication` link in the menu on the left and select the `API Keys` tab. + + + +Note: If you don't see an API key in your profile, it's because you haven't been granted the "Docs: Create new, edit settings & Collections" permission by the Account Owner or an Administrator. + +4. Store your API key securely. + +#### Step 2: Connect Your Help Scout Account + + + +To authenticate using your API credentials, navigate to the Help Scout authentication form. +Enter your credentials as follows: +- API Key: Your Help Scout API Key + +Click "Connect" to complete the authentication. diff --git a/docs-v2/integrations/all/helpscout-docs/help1.png b/docs-v2/integrations/all/helpscout-docs/help1.png new file mode 100644 index 00000000000..eeb13516b0f Binary files /dev/null and b/docs-v2/integrations/all/helpscout-docs/help1.png differ diff --git a/docs-v2/integrations/all/helpscout-docs/help2.png b/docs-v2/integrations/all/helpscout-docs/help2.png new file mode 100644 index 00000000000..56a00d96aaa Binary files /dev/null and b/docs-v2/integrations/all/helpscout-docs/help2.png differ diff --git a/docs-v2/integrations/all/helpscout-docs/nango_connect_ui.png b/docs-v2/integrations/all/helpscout-docs/nango_connect_ui.png new file mode 100644 index 00000000000..7685c3b1165 Binary files /dev/null and b/docs-v2/integrations/all/helpscout-docs/nango_connect_ui.png differ diff --git a/docs-v2/integrations/all/helpscout.mdx b/docs-v2/integrations/all/helpscout.mdx index 3e459ac37e9..a21ca388a72 100644 --- a/docs-v2/integrations/all/helpscout.mdx +++ b/docs-v2/integrations/all/helpscout.mdx @@ -46,4 +46,8 @@ Each user has a Help Scout Docs API key, which is used to authenticate the Docs - For Help Scout Mailbox, access tokens expires after every 172800 seconds which is equivalent to 2 days, you can use `nango.getConnection()` to generate a new set of tokens. - Both `helpscout-docs` and `helpscout-mailbox` enforce different rate limits based on your current plan. For more details, please check the rate limiting guidelines for [HelpScout Docs](https://developer.helpscout.com/docs-api/#rate-limiting) and [HelpScout Mailbox](https://developer.helpscout.com/mailbox-api/overview/rate-limiting/). -Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/helpscout.mdx) \ No newline at end of file +Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/helpscout.mdx) + + + Guide to connect to Help Scout using Nango Connect. + \ No newline at end of file diff --git a/docs-v2/integrations/all/mixpanel.mdx b/docs-v2/integrations/all/mixpanel.mdx index 134d9033ec7..10f7f6f8cfa 100644 --- a/docs-v2/integrations/all/mixpanel.mdx +++ b/docs-v2/integrations/all/mixpanel.mdx @@ -46,3 +46,7 @@ _No setup guide yet._ - Mixpanel has [different API base URLs](https://docs.mixpanel.com/docs/other-bits/privacy-and-security/eu-residency) for querying data from European Unions projects. Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/mixpanel.mdx) + + + Guide to connect to Mixpanel using Nango Connect. + diff --git a/docs-v2/integrations/all/mixpanel/connect.mdx b/docs-v2/integrations/all/mixpanel/connect.mdx new file mode 100644 index 00000000000..d4289ce527e --- /dev/null +++ b/docs-v2/integrations/all/mixpanel/connect.mdx @@ -0,0 +1,42 @@ +--- +title: Mixpanel - How do I link my account? +sidebarTitle: Mixpanel +--- + +# Overview + +To authenticate with Mixpanel, you need one key piece of information: +1. **User Name** - Your Mixpanel Service account name +2. **Password** - Your Mixpanel Service secret + +This guide will walk you through finding or creating those credentials within Mixpanel. + +### Prerequisites: + +- You must set up an account with Mixpanel. + + +#### Step 1: Finding Mixpanel API Key +1. Log into your Mixpanel account. +2. Navigate to `Settings` > `Project settings` > `Service accounts`. + + + +3. Click `+ Add service account`. +4. Enter `Service account name` and select `Project role`. +5. Click `Add`. +6. Copy `Username` and copy `Secret`. + + + +**Note**: Make sure you save the service account secret because you cannot see the secret again. + + + + +To authenticate using your API credentials, navigate to the Mixpanel authentication form. +Enter your credentials as follows: +- User Name: Your Mixpanel Service account name +- Password: Your Mixpanel service account secret + +Click "Connect" to complete the authentication. diff --git a/docs-v2/integrations/all/mixpanel/mix1.png b/docs-v2/integrations/all/mixpanel/mix1.png new file mode 100644 index 00000000000..8b591bb2c3f Binary files /dev/null and b/docs-v2/integrations/all/mixpanel/mix1.png differ diff --git a/docs-v2/integrations/all/mixpanel/mix2.png b/docs-v2/integrations/all/mixpanel/mix2.png new file mode 100644 index 00000000000..88fe870a6f0 Binary files /dev/null and b/docs-v2/integrations/all/mixpanel/mix2.png differ diff --git a/docs-v2/integrations/all/mixpanel/nango_connect_ui.png b/docs-v2/integrations/all/mixpanel/nango_connect_ui.png new file mode 100644 index 00000000000..789c02f119e Binary files /dev/null and b/docs-v2/integrations/all/mixpanel/nango_connect_ui.png differ diff --git a/docs-v2/integrations/all/pendo.mdx b/docs-v2/integrations/all/pendo.mdx index c547d64e388..14ff371a651 100644 --- a/docs-v2/integrations/all/pendo.mdx +++ b/docs-v2/integrations/all/pendo.mdx @@ -44,4 +44,8 @@ _No setup guide yet._ - Pendo uses `API_KEY` auth mode where `x-pendo-integration-key`: `API key` is passed to the request header for Authentication. - The main URL used to access the Pendo API corresponds to the region and web address you use when logging into Pendo's UI. The baseUrl is set to `https://app.pendo.io` but you can override it using `baseUrlOverride`. -Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/pendo.mdx) \ No newline at end of file +Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/pendo.mdx) + + + Guide to connect to Pendo using Nango Connect. + diff --git a/docs-v2/integrations/all/pendo/connect.mdx b/docs-v2/integrations/all/pendo/connect.mdx new file mode 100644 index 00000000000..7a6f9cf57c4 --- /dev/null +++ b/docs-v2/integrations/all/pendo/connect.mdx @@ -0,0 +1,36 @@ +--- +title: Pendo - How do I link my account? +sidebarTitle: Pendo +--- + + +# Overview + +To authenticate with Pendo, you need one key piece of information: +1. **API Key** - Your Pendo Access Key + + +This guide will walk you through finding or creating those credentials within Pendo. + +### Prerequisites: + +- You must set up an account with Pendo. + +#### Step 1: Finding Pendo API Key +1. Login to the Pendo Application as an Admin user. +2. Visit the `Integrations` section in the Pendo App, and then click on `Integration Keys`. +3. Click on the `Add Integration Key` button at the top right-hand side of the screen. +4. Give your new key an appropriate description. +5. If a read-write key is needed, tick the box marked `Allow Write Access`. +6. Click on `Create` to finish. +7. Securely capture and store your new key outside of Pendo. + +#### Step 2: Connect Your Pendo Account + + + +To authenticate using your API credentials, navigate to the Pendo authentication form. +Enter your credentials as follows: +- API Key: Your Pendo API Key + +Click "Connect" to complete the authentication. diff --git a/docs-v2/integrations/all/pendo/nango_connect_ui.png b/docs-v2/integrations/all/pendo/nango_connect_ui.png new file mode 100644 index 00000000000..11820fa29a3 Binary files /dev/null and b/docs-v2/integrations/all/pendo/nango_connect_ui.png differ diff --git a/docs-v2/integrations/all/posthog.mdx b/docs-v2/integrations/all/posthog.mdx index b0982df115b..d3956e59358 100644 --- a/docs-v2/integrations/all/posthog.mdx +++ b/docs-v2/integrations/all/posthog.mdx @@ -46,4 +46,8 @@ _No setup guide yet._ - Posthog uses different domain extensions codes for different regions, i.e `us` for US cloud, `eu` for EU cloud, and your self-hosted domain for self-hosted instances. - Posthog enforces different rate limits for different resources. For more details check [posthog rate limits](https://posthog.com/docs/api#rate-limiting) -Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/posthog.mdx) \ No newline at end of file +Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/posthog.mdx) + + + Guide to connect to Posthog using Nango Connect. + \ No newline at end of file diff --git a/docs-v2/integrations/all/posthog/connect.mdx b/docs-v2/integrations/all/posthog/connect.mdx new file mode 100644 index 00000000000..312b166cbf1 --- /dev/null +++ b/docs-v2/integrations/all/posthog/connect.mdx @@ -0,0 +1,43 @@ +--- +title: PostHog - How do I link my account? +sidebarTitle: PostHog +--- + +# Overview + +To authenticate with PostHog, you need one key piece of information: +1. **API Key** - Your PostHog Access Key + +This guide will walk you through finding or creating those credentials within PostHog. + +### Prerequisites: + +- You must set up an account with PostHog. + +#### Step 1: Finding Your PostHog API Key +1. Go to the [Personal API](https://us.posthog.com/settings/user-api-keys) keys section in your account settings. + +2. Click `+ Create a personal API Key`. + +3. Give your key a label - this is just for you, usually to describe the key's purpose. + +4. Choose the scopes for your key. We recommend selecting only the scopes required for the API endpoints you really need. This is a security best practice. You can always modify the scopes later if you need to. + +5. At the top of the list, you should see your brand new key. Securely copy its value, as you'll never see it again after refreshing the page. + +#### Step 2: Finding your PostHog domain + +1. You must make API requests to the correct domain. +On US Cloud, these are `https://us.i.posthog.com` for public endpoints and `https://us.posthog.com` for private ones. +On EU Cloud, these are `https://eu.i.posthog.com` for public endpoints and `https://eu.posthog.com` for private ones. +For self-hosted instances, use your self-hosted domain. +Confirm yours by checking your PostHog instance URL. + + + +To authenticate using your API credentials, navigate to the PostHog authentication form. +Enter your credentials as follows: +- API Key: Your PostHog API Key +- PostHog Domain: Your PostHog Domain + +Click "Connect" to complete the authentication. diff --git a/docs-v2/integrations/all/posthog/nango_connect_ui.png b/docs-v2/integrations/all/posthog/nango_connect_ui.png new file mode 100644 index 00000000000..ed473cea846 Binary files /dev/null and b/docs-v2/integrations/all/posthog/nango_connect_ui.png differ diff --git a/docs-v2/integrations/all/sap-success-factors.mdx b/docs-v2/integrations/all/sap-success-factors.mdx new file mode 100644 index 00000000000..ec51cc5fde3 --- /dev/null +++ b/docs-v2/integrations/all/sap-success-factors.mdx @@ -0,0 +1,54 @@ +--- +title: SAP SuccessFactors +sidebarTitle: SAP SuccessFactors +provider: sap-success-factors +--- + +import Overview from "/snippets/overview.mdx"; + +import PreBuiltUseCases from "/snippets/generated/sap-success-factors/PreBuiltUseCases.mdx" +import PreBuiltUseCases from "/snippets/generated/sap-success-factors/PreBuiltTooling.mdx" + + + + + +## Access requirements +| Pre-Requisites | Status | Comment| +| - | - | - | +| Paid dev account | ✅ | | +| Paid test account | ✅ | | +| Partnership | ❓ | | +| App review | ❓ | | +| Security audit | ❓ | | + + +## Setup guide +_No setup guide yet._ + +Need help getting started? Get help in the [community](https://nango.dev/slack). + +Contribute improvements to the setup guide by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/perimeter81.mdx) + + +## Useful links + +| Topic | Links | +| - | - | +| General | [Website](https://www.sap.com/products/hcm.html) | +| | [Create a test account](https://www.sap.com/products/hcm/login.html) | +| Developer | [API documentation](https://help.sap.com/docs/SAP_SUCCESSFACTORS_PLATFORM/d599f15995d348a1b45ba5603e2aba9b/bf3876ea9fc641848e85677d27995ed3.html) | +| | [Authentication documentation](https://help.sap.com/docs/SAP_SUCCESSFACTORS_PLATFORM/d599f15995d348a1b45ba5603e2aba9b/d9a9545305004187986c866de2b66987.html) | +| | [How to register an Oauth2 Client](https://help.sap.com/docs/SAP_SUCCESSFACTORS_PLATFORM/d599f15995d348a1b45ba5603e2aba9b/6b3c741483de47b290d075d798163bc1.html) | +| | [Requesting an Access Token](https://help.sap.com/docs/SAP_SUCCESSFACTORS_PLATFORM/d599f15995d348a1b45ba5603e2aba9b/223bc880027b4da7983e2f60c49d3992.html) | + +Contribute useful links by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/perimeter81.mdx) + +## API gotchas + +Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/sap-success-factors.mdx) + +## Going further + + Guide to connect to SAP SuccessFactors using Nango Connect UI. + diff --git a/docs-v2/integrations/all/sap-success-factors/api_servers.png b/docs-v2/integrations/all/sap-success-factors/api_servers.png new file mode 100644 index 00000000000..20e1feb9087 Binary files /dev/null and b/docs-v2/integrations/all/sap-success-factors/api_servers.png differ diff --git a/docs-v2/integrations/all/sap-success-factors/company_id.png b/docs-v2/integrations/all/sap-success-factors/company_id.png new file mode 100644 index 00000000000..1eb50106b76 Binary files /dev/null and b/docs-v2/integrations/all/sap-success-factors/company_id.png differ diff --git a/docs-v2/integrations/all/sap-success-factors/connect.mdx b/docs-v2/integrations/all/sap-success-factors/connect.mdx new file mode 100644 index 00000000000..e07469d29c6 --- /dev/null +++ b/docs-v2/integrations/all/sap-success-factors/connect.mdx @@ -0,0 +1,87 @@ +--- +title: SAP SuccessFactors - How do I link my account? +sidebarTitle: SAP SuccessFactors +--- + + +# Overview + +To authenticate with SAP SuccessFactors, you need: +1. **API Server** - The base URL of the SAP SuccessFactors OData API. +2. **Company ID** - Your company's unique identifier in SAP SuccessFactors. +3. **API Key** - The API Key generated during the OAuth client application registration process in SAP SuccessFactors. +4. **SAML Assertion** - A Base64-encoded XML document generated using the private key of the X.509 certificate. + +This guide will walk you through obtaining these credentials within SAP SuccessFactors. + +### Prerequisites: + +- You must have an account with SAP SuccessFactors. + +### Instructions: +#### Step 1: Finding your API Server +1. Please visit the following [API Server URLs](https://help.sap.com/docs/SAP_SUCCESSFACTORS_PLATFORM/93f95815070049ebaaff042d8322d518/af2b8d5437494b12be88fe374eba75b6.html) +2. In the listed API Server URLs, search for the environment that matches your subdomain. +- For example, if your domain was https://**salesdemo4**.successfactors.com, search for **salesdemo4**. + + +#### Step 2: Finding your Company ID +1. Login to your **SAP SuccessFactors** account. Go to the upper right hand side and click on your profile image to view your username. + +2. To find your SAP SuccessFactors **Company ID**, in the same dropdown menu, click **Show version information**. Locate **Company ID** in the modal that pops up: + + +#### Step 3: Generating your API Key +1. In your **Admin Center**, go to Tools, and search **Manage OAuth2 Client Applications** (If your page looks different, search for **Manage OAuth2Client Applications** in the search tool on your homepage). + +2. Click **Register Client Application**. + +3. Fill out **Application Name** & **Application URL** (what actually goes in these fields is not important, except that the URL has to begin with **https://**). You can also have a look at this [guide](https://help.sap.com/docs/SAP_SUCCESSFACTORS_PLATFORM/d599f15995d348a1b45ba5603e2aba9b/6b3c741483de47b290d075d798163bc1.html#procedure) on how to fill this form. +4. Click **Register** to save your registration. +5. You’ve successfully registered your client application for OAuth2 authentication. An **API key** is generated and assigned to your application. You can view the **API key** by clicking **View** on the registered application list. + +#### Step 4: Generating your SAML Assertion +- You can use a corporate IdP, for example, **SAP Identity Authentication Services**, or a third-party IdP. +- You can also use the example code attached to [3031657](https://sap.github.io/SapMachine/#download) to generate SAML assertions for your application. This sample code provides a SAML generator tool that processes the input information offline and generates a **SAML assertion** without having to expose your **private key** to the Internet. For this example we will use a **Windows setup** to generate the SAML assertion. +1. Download the file from [Downloading Apache Maven](https://maven.apache.org/download.cgi) and unzip it to your local drive. In the example below, the folder has been extracted to the C drive: +2. At your computer: Click on **File Explorer > This PC (right button) > Properties > Advanced System Settings > Environment Variables**. +3. At **System Variables**, ensure **JAVA_HOME** variable is set and points to the path of your JDK installation. + +4. At User Variables, click on new and set the path of the **bin** folder (from your JDK installation folders) to the variable **PATH** as shown below: +5. Go to Command Prompt and execute the command below:**echo %JAVA_HOME%** +- If it prints the folder path of the JDK installation, it means the installation was successful. + +6. Open the Command Prompt and execute the command below:**mvn -v** +- This means Maven installation is successful. Now we are good to proceed with generating SAML assertion using SAP provided offline tool. + +7. Go to attachment section of this KBA and download the zip file. +8. Extract folder from zip file to your local drive. +9. Go to the folder and open **SAMLAssertion.properties** file. + + +10. Fill the data there; +- **tokenUrl**: your API server endpoint from guide page [List of SAP SuccessFactors API Servers](https://help.sap.com/docs/SAP_SUCCESSFACTORS_PLATFORM/d599f15995d348a1b45ba5603e2aba9b/af2b8d5437494b12be88fe374eba75b6.html) followed by **/oauth/token**. +- **clientId**: API Key which you received while registering the client in SF. +- **userId**: the userId of the API user. If you use this field, you shouldn't use the **userName** field, leaving it blank. +- **userName**: the username of the API user. If you use this field, you shouldn't use the **userId** field, leaving it blank. +- **privateKey**: X.509 private key. +- **expireInMinutes**: SAML assertions usually expires in 5-10 minutes. Anyway, here you should set it according your business requirements. + +11. Save the file and close. +12. Open a new Command Prompt window and go to the directory where folder was extracted. +13. Execute the command below: **mvn compile exec:java -Dexec.args="SAMLAssertion.properties"**. + +14. Once completed, it would generate **SAML Assertion**. Copy this and store it securely in your local drive. + +#### Step 5: Enter credentials in the Connect UI + +Once you have both the above keys: +1. Open the form where you need to authenticate with SAP SuccessFactors. +2. Enter the **API Server**, **Company ID**, **API Key** and **SAML Assertion** in their designated fields. +3. Submit the form, and you should be successfully authenticated. + + + + +You are now connected to SAP SuccessFactors. + \ No newline at end of file diff --git a/docs-v2/integrations/all/sap-success-factors/env.png b/docs-v2/integrations/all/sap-success-factors/env.png new file mode 100644 index 00000000000..2b1279c1be7 Binary files /dev/null and b/docs-v2/integrations/all/sap-success-factors/env.png differ diff --git a/docs-v2/integrations/all/sap-success-factors/execute_saml.png b/docs-v2/integrations/all/sap-success-factors/execute_saml.png new file mode 100644 index 00000000000..776fc5f0ab7 Binary files /dev/null and b/docs-v2/integrations/all/sap-success-factors/execute_saml.png differ diff --git a/docs-v2/integrations/all/sap-success-factors/file.png b/docs-v2/integrations/all/sap-success-factors/file.png new file mode 100644 index 00000000000..7cc45e3f710 Binary files /dev/null and b/docs-v2/integrations/all/sap-success-factors/file.png differ diff --git a/docs-v2/integrations/all/sap-success-factors/folder.png b/docs-v2/integrations/all/sap-success-factors/folder.png new file mode 100644 index 00000000000..8aa64e89a09 Binary files /dev/null and b/docs-v2/integrations/all/sap-success-factors/folder.png differ diff --git a/docs-v2/integrations/all/sap-success-factors/form.png b/docs-v2/integrations/all/sap-success-factors/form.png new file mode 100644 index 00000000000..223963d7d42 Binary files /dev/null and b/docs-v2/integrations/all/sap-success-factors/form.png differ diff --git a/docs-v2/integrations/all/sap-success-factors/generated_saml.png b/docs-v2/integrations/all/sap-success-factors/generated_saml.png new file mode 100644 index 00000000000..abaf7c26256 Binary files /dev/null and b/docs-v2/integrations/all/sap-success-factors/generated_saml.png differ diff --git a/docs-v2/integrations/all/sap-success-factors/notepad.png b/docs-v2/integrations/all/sap-success-factors/notepad.png new file mode 100644 index 00000000000..81f7f96d1a4 Binary files /dev/null and b/docs-v2/integrations/all/sap-success-factors/notepad.png differ diff --git a/docs-v2/integrations/all/sap-success-factors/profile.png b/docs-v2/integrations/all/sap-success-factors/profile.png new file mode 100644 index 00000000000..bda1632b92d Binary files /dev/null and b/docs-v2/integrations/all/sap-success-factors/profile.png differ diff --git a/docs-v2/integrations/all/sap-success-factors/register.png b/docs-v2/integrations/all/sap-success-factors/register.png new file mode 100644 index 00000000000..4d82eb0ded8 Binary files /dev/null and b/docs-v2/integrations/all/sap-success-factors/register.png differ diff --git a/docs-v2/integrations/all/sap-success-factors/search.png b/docs-v2/integrations/all/sap-success-factors/search.png new file mode 100644 index 00000000000..2754a07266d Binary files /dev/null and b/docs-v2/integrations/all/sap-success-factors/search.png differ diff --git a/docs-v2/integrations/all/sap-success-factors/validate_jdk.png b/docs-v2/integrations/all/sap-success-factors/validate_jdk.png new file mode 100644 index 00000000000..1678ae012d0 Binary files /dev/null and b/docs-v2/integrations/all/sap-success-factors/validate_jdk.png differ diff --git a/docs-v2/integrations/all/sap-success-factors/validate_mvn.png b/docs-v2/integrations/all/sap-success-factors/validate_mvn.png new file mode 100644 index 00000000000..05977b40eed Binary files /dev/null and b/docs-v2/integrations/all/sap-success-factors/validate_mvn.png differ diff --git a/docs-v2/integrations/all/sendgrid.mdx b/docs-v2/integrations/all/sendgrid.mdx index c34813eb3c8..50c95c5494b 100644 --- a/docs-v2/integrations/all/sendgrid.mdx +++ b/docs-v2/integrations/all/sendgrid.mdx @@ -1,6 +1,6 @@ --- -title: Sendgrid -sidebarTitle: Sendgrid +title: SendGrid +sidebarTitle: SendGrid provider: sendgrid --- @@ -34,7 +34,7 @@ _No setup guide yet._ ## Useful links -- [Generate an API key in your Sendgrid account](https://app.sendgrid.com/settings/api_keys) +- [Generate an API key in your SendGrid account](https://app.sendgrid.com/settings/api_keys) - [API docs](https://docs.sendgrid.com/api-reference/how-to-use-the-sendgrid-v3-api/authentication) - [Auth-related docs](https://docs.sendgrid.com/api-reference/how-to-use-the-sendgrid-v3-api/authentication#authorization-header) @@ -43,3 +43,8 @@ _No setup guide yet._ ## API gotchas Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/sendgrid.mdx) + +## Going further + + Guide to connect to SendGrid using Nango Connect UI. + diff --git a/docs-v2/integrations/all/sendgrid/connect.mdx b/docs-v2/integrations/all/sendgrid/connect.mdx new file mode 100644 index 00000000000..558cc4f06a8 --- /dev/null +++ b/docs-v2/integrations/all/sendgrid/connect.mdx @@ -0,0 +1,38 @@ +--- +title: SendGrid - How do I link my account? +sidebarTitle: SendGrid +--- + + +# Overview + +To authenticate with SendGrid, you need: +1. **API Key** - Your SendGrid API Key. + +This guide will walk you through finding your **API Key** within SendGrid. + +### Prerequisites: + +- You must have a verified SendGrid account. After signing up, the SendGrid team will manually review and activate your account. + + +#### Step 1: Generating Your SendGrid API Key +1. Login to your **SendGrid** account. Navigate to **Settings** on the left navigation bar, and then select **API Keys**. +2. Click **Create API Key**. +3. Give your API key a name. +4. Select **Full Access**, **Restricted Access**, or **Billing Access**. +5. If you're selecting **Restricted Access**, or **Billing Access**, select the specific permissions to give each category. For more information, see [API key permissions](https://www.twilio.com/docs/sendgrid/ui/account-and-settings/api-keys#api-key-permissions). +6. Click **Create & View**. Your **API Key** will be displayed. + +#### Step 2: Enter credentials in the Connect UI + +Once you have your **API Key**: +1. Open the form where you need to authenticate with SendGrid. +2. Enter the **API Key** in the designated field. +3. Submit the form, and you should be successfully authenticated. + + + + +You are now connected to SendGrid. + \ No newline at end of file diff --git a/docs-v2/integrations/all/sendgrid/form.png b/docs-v2/integrations/all/sendgrid/form.png new file mode 100644 index 00000000000..f5f81861608 Binary files /dev/null and b/docs-v2/integrations/all/sendgrid/form.png differ diff --git a/docs-v2/integrations/all/shipstation.mdx b/docs-v2/integrations/all/shipstation.mdx index 5fd43b842bb..b8b8f64ff2c 100644 --- a/docs-v2/integrations/all/shipstation.mdx +++ b/docs-v2/integrations/all/shipstation.mdx @@ -44,4 +44,8 @@ _No setup guide yet._ - ShipStation uses `Basic` auth mode to access different endpoints. Use your ShipStation `APIKey` as the username and `APISecret` as the password, both of which can be found in the API settings. -Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/shipstation.mdx) \ No newline at end of file +Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/shipstation.mdx) + + + Guide to connect to ShipStation using Nango Connect. + \ No newline at end of file diff --git a/docs-v2/integrations/all/shipstation/connect.mdx b/docs-v2/integrations/all/shipstation/connect.mdx new file mode 100644 index 00000000000..12b5d7f60cc --- /dev/null +++ b/docs-v2/integrations/all/shipstation/connect.mdx @@ -0,0 +1,35 @@ +--- +title: ShipStation - How do I link my account? +sidebarTitle: ShipStation +--- + +# Overview + +To authenticate with ShipStation, you need two key pieces of information: +1. **API Key** - Your ShipStation Access Key +2. **API Secret** - Your ShipStation API Secret + +This guide will walk you through finding or creating those credentials within ShipStation. + +### Prerequisites: + +- You must set up an account with ShipStation. + +#### Step 1: Finding ShipStation API Key and API Secret +1. Sign in to your ShipStation account. +2. Navigate to `My Profile` > `Account` > `API Settings` > `API Keys`. +3. Click `Generate API Keys`. +4. Save and securely copy your `API Key` and `API Secret`. + + + +#### Step 2: Connect Your ShipStation Account + + + +To authenticate using your API credentials, navigate to the ShipStation authentication form. +Enter your credentials as follows: +- User Name: Your ShipStation API Key +- Password: Your ShipStation API secret + +Click "Connect" to complete the authentication. diff --git a/docs-v2/integrations/all/shipstation/nango_connect_ui.png b/docs-v2/integrations/all/shipstation/nango_connect_ui.png new file mode 100644 index 00000000000..7c83a329c5a Binary files /dev/null and b/docs-v2/integrations/all/shipstation/nango_connect_ui.png differ diff --git a/docs-v2/integrations/all/shipstation/ship1.png b/docs-v2/integrations/all/shipstation/ship1.png new file mode 100644 index 00000000000..60fa372262a Binary files /dev/null and b/docs-v2/integrations/all/shipstation/ship1.png differ diff --git a/docs-v2/integrations/all/unanet.mdx b/docs-v2/integrations/all/unanet.mdx index 9b9b19f827a..b39332ee89b 100644 --- a/docs-v2/integrations/all/unanet.mdx +++ b/docs-v2/integrations/all/unanet.mdx @@ -43,4 +43,8 @@ _No setup guide yet._ - Unanet uses `Basic` auth mode to access different endpoints. Provide your `username` as the Username value and `password` as the Password value. Additionally, Unanet requires an API key and a firm access code when creating a new connection which are provided upon [signup](https://compass.cosential.com/home/start). -Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/unanet.mdx) \ No newline at end of file +Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/unanet.mdx) + + + Guide to connect to Unanet (by Cosential) using Nango Connect. + diff --git a/docs-v2/integrations/all/unanet/connect.mdx b/docs-v2/integrations/all/unanet/connect.mdx new file mode 100644 index 00000000000..b3577615bad --- /dev/null +++ b/docs-v2/integrations/all/unanet/connect.mdx @@ -0,0 +1,42 @@ +--- +title: Unanet - How do I link my account? +sidebarTitle: Unanet +--- + +# Overview + +To authenticate with Unanet, you need four key pieces of information: +1. **API Key** - Your Unanet Access Key +2. **Firm ID** - Your Unanet subdomain +3. **Username** - Your Unanet username +4. **Password** - Your Unanet password + +This guide will walk you through finding or creating those credentials within Unanet. + +### Prerequisites: +- Before you can use Compass, you will need a client key issued to you by Cosential. +- If you are not currently a Cosential client, you will also need a Cosential account or a sandbox account. + +#### Step 1: Finding Username and Password +1. Log in to Unanet. +2. Create a user with a `Username` and `Password`. + +#### Step 2: Finding the Firm ID +1. Find the `Server URL`, which will have a format similar to `https://.infocusapp.com/api/`. +2. Find the `Firm ID` (the subdomain name). + +#### Step 3: Finding the API Key +1. Navigate to `Administration` > `API Management` > `Manage Keys` to create a new API Key. + +#### Step 4: Connect Your Unanet Account + + + +To authenticate using your API credentials, navigate to the Unanet authentication form. +Enter your credentials as follows: +- User Name: Your Unanet username +- Password: Your Unanet password +- Firm ID: Your Unanet Firm ID +- API Key: Your Unanet API Key + +Click "Connect" to complete the authentication. diff --git a/docs-v2/integrations/all/unanet/nango_connect_ui.png b/docs-v2/integrations/all/unanet/nango_connect_ui.png new file mode 100644 index 00000000000..cfe7fefa7c6 Binary files /dev/null and b/docs-v2/integrations/all/unanet/nango_connect_ui.png differ diff --git a/docs-v2/mint.json b/docs-v2/mint.json index ea83558ec5a..0dcbdbeeefd 100644 --- a/docs-v2/mint.json +++ b/docs-v2/mint.json @@ -214,6 +214,7 @@ "integrations/all/brightcrowd", "integrations/all/builder-io", "integrations/all/buildium", + "integrations/all/builtwith", "integrations/all/cal-com", "integrations/all/calendly", "integrations/all/canny", @@ -391,6 +392,7 @@ "integrations/all/salesforce", "integrations/all/salesforce-experience-cloud", "integrations/all/salesloft", + "integrations/all/sap-success-factors", "integrations/all/segment", "integrations/all/sendgrid", "integrations/all/servicem8", diff --git a/docs-v2/reference/sdks/frontend.mdx b/docs-v2/reference/sdks/frontend.mdx index 114e2a7ab3c..d4cb8bc8f61 100644 --- a/docs-v2/reference/sdks/frontend.mdx +++ b/docs-v2/reference/sdks/frontend.mdx @@ -11,7 +11,7 @@ Trigger authorization flows in your frontend with this SDK. It is available on [ ```ts import Nango from '@nangohq/frontend'; -const nango = new Nango({ connectSessionToken: '' }); +const nango = new Nango({ connectSessionToken: '' }); ``` **Parameters** diff --git a/docs-v2/reference/sdks/node.mdx b/docs-v2/reference/sdks/node.mdx index ff0cf12c1c7..9532f43fdb2 100644 --- a/docs-v2/reference/sdks/node.mdx +++ b/docs-v2/reference/sdks/node.mdx @@ -1002,6 +1002,7 @@ await nango.syncStatus('', ['SYNC_NAME1', 'SYNC_NAME2'], '", + "connection_id": "", "name": "", "status": "RUNNING", "type": "INCREMENTAL", diff --git a/docs-v2/script.js b/docs-v2/script.js index 0aea15cf8c4..8cb72212059 100644 --- a/docs-v2/script.js +++ b/docs-v2/script.js @@ -1,11 +1,19 @@ -/* eslint-disable no-undef */ +/\* eslint-disable no-undef \*/ var script = document.createElement("script"); script.src = "https://widget.kapa.ai/kapa-widget.bundle.js"; script.setAttribute("data-website-id", "d4b1f0f4-ea6f-4dc7-80c9-393418474105"); script.setAttribute("data-project-name", "Nango"); script.setAttribute("data-project-color", "#020202"); script.setAttribute( - "data-project-logo", - "https://avatars.githubusercontent.com/u/106751793?v=4"); +"data-project-logo", +"https://avatars.githubusercontent.com/u/106751793?v=4"); script.setAttribute("data-modal-disclaimer", "This is a custom LLM for Nango.dev with access to all documentation, closed GitHub PRs and Issues and the API reference. Note that this is AI technology, so please use common sense."); document.body.appendChild(script); + + + +// Koala Start +window.koalaSettings = { host: 'https://bluegrass.nango.dev' }; + +!function(t){var k="ko",i=(window.globalKoalaKey=window.globalKoalaKey||k);if(window[i])return;var ko=(window[i]=[]);["identify","track","removeListeners","on","off","qualify","ready"].forEach(function(t){ko[t]=function(){var n=[].slice.call(arguments);return n.unshift(t),ko.push(n),ko}});var n=document.createElement("script");n.async=!0,n.setAttribute("src","https://shoegaze.nango.dev/v1/pk_799998f91877afef040206962ce1af164de9/sdk.js"),(document.body || document.head).appendChild(n)}(); +// Koala End \ No newline at end of file diff --git a/docs-v2/snippets/generated/airtable/PreBuiltUseCases.mdx b/docs-v2/snippets/generated/airtable/PreBuiltUseCases.mdx index 30278ab8582..998db93e891 100644 --- a/docs-v2/snippets/generated/airtable/PreBuiltUseCases.mdx +++ b/docs-v2/snippets/generated/airtable/PreBuiltUseCases.mdx @@ -4,6 +4,13 @@ + +| Endpoint | Description | Readme | +| - | - | - | +| `GET /whoami` | Fetch current user information | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/airtable/actions/whoami.md) | + + + | Endpoint | Description | Readme | | - | - | - | diff --git a/docs-v2/snippets/generated/builtwith/PreBuiltTooling.mdx b/docs-v2/snippets/generated/builtwith/PreBuiltTooling.mdx new file mode 100644 index 00000000000..f8d5582d997 --- /dev/null +++ b/docs-v2/snippets/generated/builtwith/PreBuiltTooling.mdx @@ -0,0 +1,40 @@ +## Pre-built tooling + + +| Tools | Status | +| - | - | +| Pre-built authorization (API Key) | ✅ | +| Pre-built authorization UI | ✅ | +| Custom authorization UI | ✅ | +| End-user authorization guide | ✅ | +| Expired credentials detection | ✅ | + + +| Tools | Status | +| - | - | +| Pre-built use-cases | 🚫 (time to contribute: <48h) | +| API unification | ✅ | +| 2-way sync | ✅ | +| Webhooks from Nango on data modifications | ✅ | +| Real-time webhooks from 3rd-party API | 🚫 (time to contribute: <48h) | +| Proxy requests | ✅ | + + +| Tools | Status | +| - | - | +| HTTP request logging | ✅ | +| End-to-type type safety | ✅ | +| Data runtime validation | ✅ | +| OpenTelemetry export | ✅ | +| Slack alerts on errors | ✅ | +| Integration status API | ✅ | + + +| Tools | Status | +| - | - | +| Create or customize use-cases | ✅ | +| Pre-configured pagination | 🚫 (time to contribute: <48h) | +| Pre-configured rate-limit handling | 🚫 (time to contribute: <48h) | +| Per-customer configurations | ✅ | + + \ No newline at end of file diff --git a/docs-v2/snippets/generated/builtwith/PreBuiltUseCases.mdx b/docs-v2/snippets/generated/builtwith/PreBuiltUseCases.mdx new file mode 100644 index 00000000000..e29f9b230e4 --- /dev/null +++ b/docs-v2/snippets/generated/builtwith/PreBuiltUseCases.mdx @@ -0,0 +1,5 @@ +## Pre-built use-cases + +_No pre-built use cases yet (time to contribute: <48h)_ + +Not seeing the use case you need? [Build your own](https://docs.nango.dev/guides/customize/setup) independently. diff --git a/docs-v2/snippets/generated/calendly/PreBuiltUseCases.mdx b/docs-v2/snippets/generated/calendly/PreBuiltUseCases.mdx index 668b3f77508..9c750266448 100644 --- a/docs-v2/snippets/generated/calendly/PreBuiltUseCases.mdx +++ b/docs-v2/snippets/generated/calendly/PreBuiltUseCases.mdx @@ -9,6 +9,7 @@ | - | - | - | | `POST /users` | Creates a user in Calendly | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/calendly/actions/create-user.md) | | `DELETE /users` | Deletes a user in Calendly | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/calendly/actions/delete-user.md) | +| `GET /whoami` | Fetch current user information | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/calendly/actions/whoami.md) | | `GET /users` | Fetches a list of users from Calendly | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/calendly/syncs/users.md) | diff --git a/docs-v2/snippets/generated/chorus/PreBuiltTooling.mdx b/docs-v2/snippets/generated/chorus/PreBuiltTooling.mdx index f97bb511221..f8d5582d997 100644 --- a/docs-v2/snippets/generated/chorus/PreBuiltTooling.mdx +++ b/docs-v2/snippets/generated/chorus/PreBuiltTooling.mdx @@ -6,7 +6,7 @@ | Pre-built authorization (API Key) | ✅ | | Pre-built authorization UI | ✅ | | Custom authorization UI | ✅ | -| End-user authorization guide | 🚫 | +| End-user authorization guide | ✅ | | Expired credentials detection | ✅ | diff --git a/docs-v2/snippets/generated/freshsales/PreBuiltTooling.mdx b/docs-v2/snippets/generated/freshsales/PreBuiltTooling.mdx index f97bb511221..f8d5582d997 100644 --- a/docs-v2/snippets/generated/freshsales/PreBuiltTooling.mdx +++ b/docs-v2/snippets/generated/freshsales/PreBuiltTooling.mdx @@ -6,7 +6,7 @@ | Pre-built authorization (API Key) | ✅ | | Pre-built authorization UI | ✅ | | Custom authorization UI | ✅ | -| End-user authorization guide | 🚫 | +| End-user authorization guide | ✅ | | Expired credentials detection | ✅ | diff --git a/docs-v2/snippets/generated/gainsight-cc/PreBuiltTooling.mdx b/docs-v2/snippets/generated/gainsight-cc/PreBuiltTooling.mdx index 4dd2ba15dd6..22272b66479 100644 --- a/docs-v2/snippets/generated/gainsight-cc/PreBuiltTooling.mdx +++ b/docs-v2/snippets/generated/gainsight-cc/PreBuiltTooling.mdx @@ -7,6 +7,7 @@ | Credentials auto-refresh | ✅ | | Pre-built authorization UI | ✅ | | Custom authorization UI | ✅ | +| End-user authorization guide | ✅ | | Expired credentials detection | ✅ | diff --git a/docs-v2/snippets/generated/hackerrank-work/PreBuiltTooling.mdx b/docs-v2/snippets/generated/hackerrank-work/PreBuiltTooling.mdx index 493ce270e73..639f2c21a1f 100644 --- a/docs-v2/snippets/generated/hackerrank-work/PreBuiltTooling.mdx +++ b/docs-v2/snippets/generated/hackerrank-work/PreBuiltTooling.mdx @@ -6,7 +6,7 @@ | Pre-built authorization (Basic) | ✅ | | Pre-built authorization UI | ✅ | | Custom authorization UI | ✅ | -| End-user authorization guide | 🚫 | +| End-user authorization guide | ✅ | | Expired credentials detection | ✅ | diff --git a/docs-v2/snippets/generated/hubspot/PreBuiltUseCases.mdx b/docs-v2/snippets/generated/hubspot/PreBuiltUseCases.mdx index d278d3af997..15b2e230d4c 100644 --- a/docs-v2/snippets/generated/hubspot/PreBuiltUseCases.mdx +++ b/docs-v2/snippets/generated/hubspot/PreBuiltUseCases.mdx @@ -84,6 +84,7 @@ | Endpoint | Description | Readme | | - | - | - | +| `GET /whoami` | Fetch current user information | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/hubspot/actions/whoami.md) | | `POST /users` | Creates a single user in Hubspot | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/hubspot/actions/create-user.md) | | `DELETE /users` | Deletes a user in Hubspot | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/hubspot/actions/delete-user.md) | | `GET /users` | Fetches a list of users from Hubspot | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/hubspot/syncs/users.md) | diff --git a/docs-v2/snippets/generated/mixpanel/PreBuiltTooling.mdx b/docs-v2/snippets/generated/mixpanel/PreBuiltTooling.mdx index a57b8ab2438..7f8826df4a9 100644 --- a/docs-v2/snippets/generated/mixpanel/PreBuiltTooling.mdx +++ b/docs-v2/snippets/generated/mixpanel/PreBuiltTooling.mdx @@ -6,7 +6,7 @@ | Pre-built authorization (Basic) | ✅ | | Pre-built authorization UI | ✅ | | Custom authorization UI | ✅ | -| End-user authorization guide | 🚫 | +| End-user authorization guide | ✅ | | Expired credentials detection | ✅ | diff --git a/docs-v2/snippets/generated/pendo/PreBuiltTooling.mdx b/docs-v2/snippets/generated/pendo/PreBuiltTooling.mdx index f97bb511221..f8d5582d997 100644 --- a/docs-v2/snippets/generated/pendo/PreBuiltTooling.mdx +++ b/docs-v2/snippets/generated/pendo/PreBuiltTooling.mdx @@ -6,7 +6,7 @@ | Pre-built authorization (API Key) | ✅ | | Pre-built authorization UI | ✅ | | Custom authorization UI | ✅ | -| End-user authorization guide | 🚫 | +| End-user authorization guide | ✅ | | Expired credentials detection | ✅ | diff --git a/docs-v2/snippets/generated/posthog/PreBuiltTooling.mdx b/docs-v2/snippets/generated/posthog/PreBuiltTooling.mdx index f97bb511221..f8d5582d997 100644 --- a/docs-v2/snippets/generated/posthog/PreBuiltTooling.mdx +++ b/docs-v2/snippets/generated/posthog/PreBuiltTooling.mdx @@ -6,7 +6,7 @@ | Pre-built authorization (API Key) | ✅ | | Pre-built authorization UI | ✅ | | Custom authorization UI | ✅ | -| End-user authorization guide | 🚫 | +| End-user authorization guide | ✅ | | Expired credentials detection | ✅ | diff --git a/docs-v2/snippets/generated/salesforce/PreBuiltUseCases.mdx b/docs-v2/snippets/generated/salesforce/PreBuiltUseCases.mdx index 69520618b10..8a9c8582a54 100644 --- a/docs-v2/snippets/generated/salesforce/PreBuiltUseCases.mdx +++ b/docs-v2/snippets/generated/salesforce/PreBuiltUseCases.mdx @@ -44,6 +44,13 @@ + +| Endpoint | Description | Readme | +| - | - | - | +| `GET /whoami` | Fetch current user information | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/salesforce/actions/whoami.md) | + + + | Endpoint | Description | Readme | | - | - | - | diff --git a/docs-v2/snippets/generated/sap-success-factors/PreBuiltTooling.mdx b/docs-v2/snippets/generated/sap-success-factors/PreBuiltTooling.mdx new file mode 100644 index 00000000000..904447e6f8c --- /dev/null +++ b/docs-v2/snippets/generated/sap-success-factors/PreBuiltTooling.mdx @@ -0,0 +1,40 @@ +## Pre-built tooling + + +| Tools | Status | +| - | - | +| Pre-built authorization (Two Step) | ✅ | +| Pre-built authorization UI | ✅ | +| Custom authorization UI | ✅ | +| End-user authorization guide | ✅ | +| Expired credentials detection | ✅ | + + +| Tools | Status | +| - | - | +| Pre-built use-cases | 🚫 (time to contribute: <48h) | +| API unification | ✅ | +| 2-way sync | ✅ | +| Webhooks from Nango on data modifications | ✅ | +| Real-time webhooks from 3rd-party API | 🚫 (time to contribute: <48h) | +| Proxy requests | ✅ | + + +| Tools | Status | +| - | - | +| HTTP request logging | ✅ | +| End-to-type type safety | ✅ | +| Data runtime validation | ✅ | +| OpenTelemetry export | ✅ | +| Slack alerts on errors | ✅ | +| Integration status API | ✅ | + + +| Tools | Status | +| - | - | +| Create or customize use-cases | ✅ | +| Pre-configured pagination | 🚫 (time to contribute: <48h) | +| Pre-configured rate-limit handling | 🚫 (time to contribute: <48h) | +| Per-customer configurations | ✅ | + + \ No newline at end of file diff --git a/docs-v2/snippets/generated/sap-success-factors/PreBuiltUseCases.mdx b/docs-v2/snippets/generated/sap-success-factors/PreBuiltUseCases.mdx new file mode 100644 index 00000000000..e29f9b230e4 --- /dev/null +++ b/docs-v2/snippets/generated/sap-success-factors/PreBuiltUseCases.mdx @@ -0,0 +1,5 @@ +## Pre-built use-cases + +_No pre-built use cases yet (time to contribute: <48h)_ + +Not seeing the use case you need? [Build your own](https://docs.nango.dev/guides/customize/setup) independently. diff --git a/docs-v2/snippets/generated/sendgrid/PreBuiltTooling.mdx b/docs-v2/snippets/generated/sendgrid/PreBuiltTooling.mdx index f97bb511221..f8d5582d997 100644 --- a/docs-v2/snippets/generated/sendgrid/PreBuiltTooling.mdx +++ b/docs-v2/snippets/generated/sendgrid/PreBuiltTooling.mdx @@ -6,7 +6,7 @@ | Pre-built authorization (API Key) | ✅ | | Pre-built authorization UI | ✅ | | Custom authorization UI | ✅ | -| End-user authorization guide | 🚫 | +| End-user authorization guide | ✅ | | Expired credentials detection | ✅ | diff --git a/docs-v2/snippets/generated/shipstation/PreBuiltTooling.mdx b/docs-v2/snippets/generated/shipstation/PreBuiltTooling.mdx index a57b8ab2438..7f8826df4a9 100644 --- a/docs-v2/snippets/generated/shipstation/PreBuiltTooling.mdx +++ b/docs-v2/snippets/generated/shipstation/PreBuiltTooling.mdx @@ -6,7 +6,7 @@ | Pre-built authorization (Basic) | ✅ | | Pre-built authorization UI | ✅ | | Custom authorization UI | ✅ | -| End-user authorization guide | 🚫 | +| End-user authorization guide | ✅ | | Expired credentials detection | ✅ | diff --git a/docs-v2/snippets/generated/stripe-app/PreBuiltTooling.mdx b/docs-v2/snippets/generated/stripe-app/PreBuiltTooling.mdx index 4dd2ba15dd6..224d9e93379 100644 --- a/docs-v2/snippets/generated/stripe-app/PreBuiltTooling.mdx +++ b/docs-v2/snippets/generated/stripe-app/PreBuiltTooling.mdx @@ -12,7 +12,7 @@ | Tools | Status | | - | - | -| Pre-built use-cases | 🚫 (time to contribute: <48h) | +| Pre-built use-cases | ✅ | | API unification | ✅ | | 2-way sync | ✅ | | Webhooks from Nango on data modifications | ✅ | diff --git a/docs-v2/snippets/generated/stripe-app/PreBuiltUseCases.mdx b/docs-v2/snippets/generated/stripe-app/PreBuiltUseCases.mdx index e29f9b230e4..b875e1f700b 100644 --- a/docs-v2/snippets/generated/stripe-app/PreBuiltUseCases.mdx +++ b/docs-v2/snippets/generated/stripe-app/PreBuiltUseCases.mdx @@ -1,5 +1,15 @@ -## Pre-built use-cases -_No pre-built use cases yet (time to contribute: <48h)_ +## Pre-built use cases + + + + + +| Endpoint | Description | Readme | +| - | - | - | +| `GET /subscriptions` | Fetches a list of subscriptions | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/stripe-app/syncs/subscriptions.md) | + + + Not seeing the use case you need? [Build your own](https://docs.nango.dev/guides/customize/setup) independently. diff --git a/docs-v2/snippets/generated/unanet/PreBuiltTooling.mdx b/docs-v2/snippets/generated/unanet/PreBuiltTooling.mdx index 493ce270e73..639f2c21a1f 100644 --- a/docs-v2/snippets/generated/unanet/PreBuiltTooling.mdx +++ b/docs-v2/snippets/generated/unanet/PreBuiltTooling.mdx @@ -6,7 +6,7 @@ | Pre-built authorization (Basic) | ✅ | | Pre-built authorization UI | ✅ | | Custom authorization UI | ✅ | -| End-user authorization guide | 🚫 | +| End-user authorization guide | ✅ | | Expired credentials detection | ✅ | diff --git a/docs-v2/snippets/generated/workday/PreBuiltTooling.mdx b/docs-v2/snippets/generated/workday/PreBuiltTooling.mdx index 7f8826df4a9..639f2c21a1f 100644 --- a/docs-v2/snippets/generated/workday/PreBuiltTooling.mdx +++ b/docs-v2/snippets/generated/workday/PreBuiltTooling.mdx @@ -12,7 +12,7 @@ | Tools | Status | | - | - | -| Pre-built use-cases | 🚫 (time to contribute: <48h) | +| Pre-built use-cases | ✅ | | API unification | ✅ | | 2-way sync | ✅ | | Webhooks from Nango on data modifications | ✅ | diff --git a/docs-v2/snippets/generated/workday/PreBuiltUseCases.mdx b/docs-v2/snippets/generated/workday/PreBuiltUseCases.mdx index e29f9b230e4..09d7cc046a3 100644 --- a/docs-v2/snippets/generated/workday/PreBuiltUseCases.mdx +++ b/docs-v2/snippets/generated/workday/PreBuiltUseCases.mdx @@ -1,5 +1,29 @@ -## Pre-built use-cases -_No pre-built use cases yet (time to contribute: <48h)_ +## Pre-built use cases + + + + + +| Endpoint | Description | Readme | +| - | - | - | +| `GET /employees` | Fetches Employees | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/workday/syncs/employees.md) | + + + + +| Endpoint | Description | Readme | +| - | - | - | +| `GET /groups` | Fetches Company groups | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/workday/syncs/groups.md) | + + + + +| Endpoint | Description | Readme | +| - | - | - | +| `GET /locations` | Fetches Company locations | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/workday/syncs/locations.md) | + + + Not seeing the use case you need? [Build your own](https://docs.nango.dev/guides/customize/setup) independently. diff --git a/docs-v2/snippets/generated/xero/PreBuiltUseCases.mdx b/docs-v2/snippets/generated/xero/PreBuiltUseCases.mdx index e9970e89ee9..405f105e644 100644 --- a/docs-v2/snippets/generated/xero/PreBuiltUseCases.mdx +++ b/docs-v2/snippets/generated/xero/PreBuiltUseCases.mdx @@ -28,7 +28,7 @@ - + | Endpoint | Description | Readme | | - | - | - | | `GET /general-ledger` | Fetch all general ledger entries in Xero | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/xero/syncs/general-ledger.md) | diff --git a/docs-v2/snippets/generated/zoom/PreBuiltUseCases.mdx b/docs-v2/snippets/generated/zoom/PreBuiltUseCases.mdx index 37b8e2993c2..c969b82eba6 100644 --- a/docs-v2/snippets/generated/zoom/PreBuiltUseCases.mdx +++ b/docs-v2/snippets/generated/zoom/PreBuiltUseCases.mdx @@ -24,6 +24,7 @@ | Endpoint | Description | Readme | | - | - | - | | `POST /users` | Creates a user in Zoom. Requires Pro account or higher | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/zoom/actions/create-user.md) | +| `GET /whoami` | Fetch current user information | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/zoom/actions/whoami.md) | | `DELETE /users` | Deletes a user in Zoom. Requires Pro account or higher | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/zoom/actions/delete-user.md) | | `GET /users` | Fetches a list of users from Zoom | [🔗](https://github.com/NangoHQ/integration-templates/blob/main/integrations/zoom/syncs/users.md) | diff --git a/docs-v2/spec.yaml b/docs-v2/spec.yaml index f7dd6590520..a4c9ac21d5a 100644 --- a/docs-v2/spec.yaml +++ b/docs-v2/spec.yaml @@ -1265,6 +1265,9 @@ paths: id: type: string description: The unique identifier for the sync. + connection_id: + type: string + description: The ID of the connection name: type: string description: The name of the sync. diff --git a/package-lock.json b/package-lock.json index 503fe7b05da..cf84d39e3ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ "testcontainers": "9.12.0", "tsx": "4.19.0", "typescript": "5.3.3", - "vitest": "1.6.0" + "vitest": "2.1.8" }, "engines": { "node": ">=18.0.0 || >=20.0.0" @@ -1364,6 +1364,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", + "license": "MIT", "dependencies": { "tslib": "^2.2.0" }, @@ -1372,17 +1373,19 @@ } }, "node_modules/@azure/abort-controller/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/@azure/core-auth": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.7.2.tgz", - "integrity": "sha512-Igm/S3fDYmnMq1uKS38Ae1/m37B3zigdlZw+kocwEhh5GjyKjPrXKO2J6rzpC1wAxrNil/jX9BJRqBshyjnF3g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.9.0.tgz", + "integrity": "sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==", + "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", - "@azure/core-util": "^1.1.0", + "@azure/core-util": "^1.11.0", "tslib": "^2.6.2" }, "engines": { @@ -1393,6 +1396,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "license": "MIT", "dependencies": { "tslib": "^2.6.2" }, @@ -1401,14 +1405,16 @@ } }, "node_modules/@azure/core-auth/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/@azure/core-client": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz", "integrity": "sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==", + "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.4.0", @@ -1426,6 +1432,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "license": "MIT", "dependencies": { "tslib": "^2.6.2" }, @@ -1434,9 +1441,10 @@ } }, "node_modules/@azure/core-client/node_modules/@azure/core-tracing": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.2.tgz", - "integrity": "sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.2.0.tgz", + "integrity": "sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==", + "license": "MIT", "dependencies": { "tslib": "^2.6.2" }, @@ -1445,15 +1453,17 @@ } }, "node_modules/@azure/core-client/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/@azure/core-http": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.4.tgz", - "integrity": "sha512-Fok9VVhMdxAFOtqiiAtg74fL0UJkt0z3D+ouUUxcRLzZNBioPRAMJFVxiWoJljYpXsRi4GDQHzQHDc9AiYaIUQ==", - "deprecated": "deprecating as we migrated to core v2", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.5.tgz", + "integrity": "sha512-T8r2q/c3DxNu6mEJfPuJtptUVqwchxzjj32gKcnMi06rdiVONS9rar7kT9T2Am+XvER7uOzpsP79WsqNbdgdWg==", + "deprecated": "This package is no longer supported. Please refer to https://github.com/Azure/azure-sdk-for-js/blob/490ce4dfc5b98ba290dee3b33a6d0876c5f138e2/sdk/core/README.md", + "license": "MIT", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.3.0", @@ -1471,31 +1481,34 @@ "xml2js": "^0.5.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/core-http/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/@azure/core-http/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==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.16.3.tgz", - "integrity": "sha512-VxLk4AHLyqcHsfKe4MZ6IQ+D+ShuByy+RfStKfSjxJoL3WBWq17VNmrz8aT8etKzqc2nAeIyLxScjpzsS4fz8w==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.18.1.tgz", + "integrity": "sha512-/wS73UEDrxroUEVywEm7J0p2c+IIiVxyfigCGfsKvCxxCET4V/Hef2aURqltrXMRjNmdmt5IuOgIpl8f6xdO5A==", + "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.4.0", + "@azure/core-auth": "^1.8.0", "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.9.0", + "@azure/core-util": "^1.11.0", "@azure/logger": "^1.0.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", @@ -1509,6 +1522,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "license": "MIT", "dependencies": { "tslib": "^2.6.2" }, @@ -1517,9 +1531,10 @@ } }, "node_modules/@azure/core-rest-pipeline/node_modules/@azure/core-tracing": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.2.tgz", - "integrity": "sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.2.0.tgz", + "integrity": "sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==", + "license": "MIT", "dependencies": { "tslib": "^2.6.2" }, @@ -1528,12 +1543,10 @@ } }, "node_modules/@azure/core-rest-pipeline/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dependencies": { - "debug": "^4.3.4" - }, + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", "engines": { "node": ">= 14" } @@ -1542,6 +1555,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -1551,11 +1565,12 @@ } }, "node_modules/@azure/core-rest-pipeline/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -1563,14 +1578,16 @@ } }, "node_modules/@azure/core-rest-pipeline/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/@azure/core-tracing": { "version": "1.0.0-preview.13", "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz", "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==", + "license": "MIT", "dependencies": { "@opentelemetry/api": "^1.0.1", "tslib": "^2.2.0" @@ -1580,14 +1597,16 @@ } }, "node_modules/@azure/core-tracing/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/@azure/core-util": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.9.2.tgz", - "integrity": "sha512-l1Qrqhi4x1aekkV+OlcqsJa4AnAkj5p0JV8omgwjaV9OAbP41lvrMvs+CptfetKkeEaGRGSzby7sjPZEX7+kkQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.11.0.tgz", + "integrity": "sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==", + "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", "tslib": "^2.6.2" @@ -1600,6 +1619,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "license": "MIT", "dependencies": { "tslib": "^2.6.2" }, @@ -1608,24 +1628,26 @@ } }, "node_modules/@azure/core-util/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/@azure/identity": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.4.1.tgz", - "integrity": "sha512-DwnG4cKFEM7S3T+9u05NstXU/HN0dk45kPOinUyNKsn5VWwpXd9sbPKEg6kgJzGbm1lMuhx9o31PVbCtM5sfBA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.5.0.tgz", + "integrity": "sha512-EknvVmtBuSIic47xkOqyNabAme0RYTw52BTMz8eBgU1ysTyMrD1uOoM+JdS0J/4Yfp98IBT3osqq3BfwSaNaGQ==", + "license": "MIT", "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.5.0", + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.9.0", "@azure/core-client": "^1.9.2", - "@azure/core-rest-pipeline": "^1.1.0", + "@azure/core-rest-pipeline": "^1.17.0", "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.3.0", + "@azure/core-util": "^1.11.0", "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^3.14.0", - "@azure/msal-node": "^2.9.2", + "@azure/msal-browser": "^3.26.1", + "@azure/msal-node": "^2.15.0", "events": "^3.0.0", "jws": "^4.0.0", "open": "^8.0.0", @@ -1636,10 +1658,23 @@ "node": ">=18.0.0" } }, + "node_modules/@azure/identity/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@azure/identity/node_modules/@azure/core-tracing": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.2.tgz", - "integrity": "sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.2.0.tgz", + "integrity": "sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==", + "license": "MIT", "dependencies": { "tslib": "^2.6.2" }, @@ -1651,6 +1686,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "license": "MIT", "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", @@ -1661,20 +1697,23 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "license": "MIT", "dependencies": { "jwa": "^2.0.0", "safe-buffer": "^5.0.1" } }, "node_modules/@azure/identity/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/@azure/logger": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.4.tgz", "integrity": "sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==", + "license": "MIT", "dependencies": { "tslib": "^2.6.2" }, @@ -1683,35 +1722,39 @@ } }, "node_modules/@azure/logger/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/@azure/msal-browser": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.22.0.tgz", - "integrity": "sha512-ZkL2Z0zffsBIE3ovhMwa0rVrPeKV2GHhDWFgWiIcKiPt82b21YLijK3c/rNjTHkME+6FCjMIa/5Nul+ZjH197w==", + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.28.0.tgz", + "integrity": "sha512-1c1qUF6vB52mWlyoMem4xR1gdwiQWYEQB2uhDkbAL4wVJr8WmAcXybc1Qs33y19N4BdPI8/DHI7rPE8L5jMtWw==", + "license": "MIT", "dependencies": { - "@azure/msal-common": "14.14.2" + "@azure/msal-common": "14.16.0" }, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-common": { - "version": "14.14.2", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.14.2.tgz", - "integrity": "sha512-XV0P5kSNwDwCA/SjIxTe9mEAsKB0NqGNSuaVrkCCE2lAyBr/D6YtD80Vkdp4tjWnPFwjzkwldjr1xU/facOJog==", + "version": "14.16.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.16.0.tgz", + "integrity": "sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==", + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-node": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.13.1.tgz", - "integrity": "sha512-sijfzPNorKt6+9g1/miHwhj6Iapff4mPQx1azmmZExgzUROqWTM1o3ACyxDja0g47VpowFy/sxTM/WsuCyXTiw==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.16.2.tgz", + "integrity": "sha512-An7l1hEr0w1HMMh1LU+rtDtqL7/jw74ORlc9Wnh06v7TU/xpG39/Zdr1ZJu3QpjUfKJ+E0/OXMW8DRSWTlh7qQ==", + "license": "MIT", "dependencies": { - "@azure/msal-common": "14.14.2", + "@azure/msal-common": "14.16.0", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, @@ -1723,6 +1766,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -5499,17 +5543,6 @@ "node": ">=0.10.0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/source-map": { "version": "27.5.1", "dev": true, @@ -5686,7 +5719,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -10760,11 +10795,6 @@ "version": "2.0.0", "license": "BSD-3-Clause" }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "dev": true, - "license": "MIT" - }, "node_modules/@sinonjs/commons": { "version": "1.8.6", "dev": true, @@ -12494,9 +12524,10 @@ "license": "MIT" }, "node_modules/@types/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", + "license": "MIT", "dependencies": { "@types/node": "*", "form-data": "^4.0.0" @@ -12768,6 +12799,7 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.3.tgz", "integrity": "sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -13371,100 +13403,126 @@ } }, "node_modules/@vitest/expect": { - "version": "1.6.0", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz", + "integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "chai": "^4.3.10" + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner": { - "version": "1.6.0", + "node_modules/@vitest/mocker": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz", + "integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "1.6.0", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" + "@vitest/spy": "2.1.8", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" }, "funding": { "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/estree": "^1.0.0" } }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", + "node_modules/@vitest/pretty-format": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz", + "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12.20" + "dependencies": { + "tinyrainbow": "^1.2.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/snapshot": { - "version": "1.6.0", + "node_modules/@vitest/runner": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz", + "integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==", "dev": true, "license": "MIT", "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" + "@vitest/utils": "2.1.8", + "pathe": "^1.1.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/spy": { - "version": "1.6.0", + "node_modules/@vitest/snapshot": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz", + "integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^2.2.0" + "@vitest/pretty-format": "2.1.8", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/utils": { - "version": "1.6.0", + "node_modules/@vitest/spy": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz", + "integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==", "dev": true, "license": "MIT", "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" + "tinyspy": "^3.0.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/utils/node_modules/estree-walker": { - "version": "3.0.3", + "node_modules/@vitest/utils": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz", + "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0" + "@vitest/pretty-format": "2.1.8", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/@webassemblyjs/ast": { @@ -13679,22 +13737,6 @@ "node": ">=6.5" } }, - "node_modules/abstract-leveldown": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", - "integrity": "sha512-TOod9d5RDExo6STLMGa+04HGkl+TlMfbDnTyN93/ETJ9DpQ0DaYLqcMZlbXvdc4W3vVo1Qrl+WhSp8zvDsJ+jA==", - "dependencies": { - "xtend": "~3.0.0" - } - }, - "node_modules/abstract-leveldown/node_modules/xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", - "engines": { - "node": ">=0.4" - } - }, "node_modules/accepts": { "version": "1.3.8", "license": "MIT", @@ -13707,7 +13749,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -13770,7 +13814,8 @@ "node_modules/adaptivecards": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/adaptivecards/-/adaptivecards-1.2.3.tgz", - "integrity": "sha512-amQ5OSW3OpIkrxVKLjxVBPk/T49yuOtnqs1z5ZPfZr0+OpTovzmiHbyoAGDIsu5SNYHwOZFp/3LGOnRaALFa/g==" + "integrity": "sha512-amQ5OSW3OpIkrxVKLjxVBPk/T49yuOtnqs1z5ZPfZr0+OpTovzmiHbyoAGDIsu5SNYHwOZFp/3LGOnRaALFa/g==", + "license": "MIT" }, "node_modules/address": { "version": "1.2.2", @@ -14227,6 +14272,7 @@ "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "license": "MIT", "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -14234,16 +14280,19 @@ } }, "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "license": "MIT" }, "node_modules/assertion-error": { - "version": "1.1.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", "engines": { - "node": "*" + "node": ">=12" } }, "node_modules/ast-types-flow": { @@ -14348,7 +14397,9 @@ } }, "node_modules/axios": { - "version": "1.7.4", + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -14651,6 +14702,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -14705,30 +14757,6 @@ "node": ">=8" } }, - "node_modules/bl": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", - "integrity": "sha512-pfqikmByp+lifZCS0p6j6KreV6kNU6Apzpm2nKOk+94cZb/jvle55+JxWiByUQ0Wo/+XnDXEy5MxxKMb6r0VIw==", - "dependencies": { - "readable-stream": "~1.0.26" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/bl/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, "node_modules/bluebird": { "version": "3.7.2", "license": "MIT" @@ -14736,7 +14764,8 @@ "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "license": "MIT" }, "node_modules/body-parser": { "version": "1.20.3", @@ -14801,120 +14830,224 @@ "license": "ISC" }, "node_modules/botbuilder": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/botbuilder/-/botbuilder-4.23.0.tgz", - "integrity": "sha512-lgBt1Uc7QEYR8MkU/EmP7AqHXv+jQ/7TVAQMb/d1+TIhG4qsJFiNGIrDJfaS+Twl/r72sgamN7u6zXEceWxOYw==", - "dependencies": { - "@azure/core-http": "^3.0.2", - "@azure/msal-node": "^2.13.0", - "axios": "^1.7.4", - "botbuilder-core": "4.23.0", - "botbuilder-stdlib": "4.23.0-internal", - "botframework-connector": "4.23.0", - "botframework-schema": "4.23.0", - "botframework-streaming": "4.23.0", - "dayjs": "^1.10.3", - "filenamify": "^4.1.0", - "fs-extra": "^7.0.1", - "htmlparser2": "^6.0.1", - "uuid": "^8.3.2", - "zod": "^3.22.4" + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/botbuilder/-/botbuilder-4.23.1.tgz", + "integrity": "sha512-0yCkRfeeeDXPic1bo9xX9Dj/SyUDB0nNAoxxSOpBxSbClztV+Mupx2rTtExMcUKRUbSUWIKYWHL9htkT2ya5JA==", + "license": "MIT", + "dependencies": { + "@azure/core-http": "^3.0.4", + "@azure/msal-node": "^2.13.1", + "axios": "^1.7.7", + "botbuilder-core": "4.23.1", + "botbuilder-stdlib": "4.23.1-internal", + "botframework-connector": "4.23.1", + "botframework-schema": "4.23.1", + "botframework-streaming": "4.23.1", + "dayjs": "^1.11.13", + "filenamify": "^4.3.0", + "fs-extra": "^11.2.0", + "htmlparser2": "^9.0.1", + "uuid": "^10.0.0", + "zod": "^3.23.8" } }, "node_modules/botbuilder-core": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/botbuilder-core/-/botbuilder-core-4.23.0.tgz", - "integrity": "sha512-6wYxRM8zgZ5eFuEIuKzC+sRowR56mLgXM6DSVXKXGl1y3ZYt/pmfT9+R1J6Fe8SbpHJKV2yMzFjpdcsnvu3ICQ==", - "dependencies": { - "botbuilder-dialogs-adaptive-runtime-core": "4.23.0-preview", - "botbuilder-stdlib": "4.23.0-internal", - "botframework-connector": "4.23.0", - "botframework-schema": "4.23.0", - "uuid": "^8.3.2", - "zod": "^3.22.4" + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/botbuilder-core/-/botbuilder-core-4.23.1.tgz", + "integrity": "sha512-lgWZ5Z8jl6MuVGxooq9eaJK/Jdqu5opJ3K3kQ/yFxG/C7VNte93BHeYviERESUMvcCNOhMRIiTrKyVYfKO4NDw==", + "license": "MIT", + "dependencies": { + "botbuilder-dialogs-adaptive-runtime-core": "4.23.1-preview", + "botbuilder-stdlib": "4.23.1-internal", + "botframework-connector": "4.23.1", + "botframework-schema": "4.23.1", + "uuid": "^10.0.0", + "zod": "^3.23.8" } }, "node_modules/botbuilder-core/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==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/botbuilder-dialogs-adaptive-runtime-core": { - "version": "4.23.0-preview", - "resolved": "https://registry.npmjs.org/botbuilder-dialogs-adaptive-runtime-core/-/botbuilder-dialogs-adaptive-runtime-core-4.23.0-preview.tgz", - "integrity": "sha512-CGNQGLgOpQpdymwNXSxH8PgCemDr3NPnKt/Vi3Fe2mJIOBO+dy/HifI7NTLjboiteUcSchywUNkTaEJ+GAy7jw==", + "version": "4.23.1-preview", + "resolved": "https://registry.npmjs.org/botbuilder-dialogs-adaptive-runtime-core/-/botbuilder-dialogs-adaptive-runtime-core-4.23.1-preview.tgz", + "integrity": "sha512-6au9eGmEIpscP+cLYZ2G71azlj1E8rwL3WpAqfBG2RlWZCOuWH9uFNh2V9lg/KrDC2ks3O2YFk0tCym40i0XLQ==", + "license": "MIT", "dependencies": { - "dependency-graph": "^0.10.0" + "dependency-graph": "^1.0.0" } }, "node_modules/botbuilder-stdlib": { - "version": "4.23.0-internal", - "resolved": "https://registry.npmjs.org/botbuilder-stdlib/-/botbuilder-stdlib-4.23.0-internal.tgz", - "integrity": "sha512-MY2jaOMVuN5y0Gd71Rcb5qxZC7ujWWSwgJtIB4Wyf/NyCFn4IyUWvf4pcNPd2zubXnlYlRnfLshVTbJI54WZzw==" + "version": "4.23.1-internal", + "resolved": "https://registry.npmjs.org/botbuilder-stdlib/-/botbuilder-stdlib-4.23.1-internal.tgz", + "integrity": "sha512-ChtEcnSRCDRgFuMN6ji24fHqtMERdDUP/WENX6iZQwtQUEUb12G3PcYWuaOEQhllSae6qfo3QsDW0kjGsrBX+Q==", + "license": "MIT" + }, + "node_modules/botbuilder/node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, + "node_modules/botbuilder/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/botbuilder/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/botbuilder/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/botbuilder/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/botbuilder/node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } }, "node_modules/botbuilder/node_modules/uuid": { - "version": "8.3.2", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/botframework-connector": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/botframework-connector/-/botframework-connector-4.23.0.tgz", - "integrity": "sha512-gq9MXfa//2nM3fNWRAxoYG2wUr0DG0TZpJiGdhF578WfDoji9rmvt1+JWln87UCSBjOP/Zcxd4j4VbgCoVM/kA==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/botframework-connector/-/botframework-connector-4.23.1.tgz", + "integrity": "sha512-UqOdVndOGNN1dgtLEKDD1rObPPI32tPwyrtU8WDuVukaPSL7KYp6z1SjudZ9ywDcrt5z+Rkbz2kGzaSidCVZWA==", + "license": "MIT", "dependencies": { - "@azure/core-http": "^3.0.2", + "@azure/core-http": "^3.0.4", "@azure/identity": "^4.4.1", - "@azure/msal-node": "^2.13.0", - "@types/jsonwebtoken": "8.3.5", - "axios": "^1.7.4", + "@azure/msal-node": "^2.13.1", + "@types/jsonwebtoken": "9.0.6", + "axios": "^1.7.7", "base64url": "^3.0.0", - "botbuilder-stdlib": "4.23.0-internal", - "botframework-schema": "4.23.0", - "browserify-fs": "^1.0.0", + "botbuilder-stdlib": "4.23.1-internal", + "botframework-schema": "4.23.1", "buffer": "^6.0.3", - "cross-fetch": "^3.0.5", + "cross-fetch": "^4.0.0", "crypto-browserify": "^3.12.0", "https-browserify": "^1.0.0", - "https-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", "jsonwebtoken": "^9.0.2", - "node-fetch": "^2.6.7", + "node-fetch": "^2.7.0", "openssl-wrapper": "^0.3.4", - "rsa-pem-from-mod-exp": "^0.8.4", + "rsa-pem-from-mod-exp": "^0.8.6", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", - "zod": "^3.22.4" + "zod": "^3.23.8" } }, "node_modules/botframework-connector/node_modules/@types/jsonwebtoken": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.3.5.tgz", - "integrity": "sha512-VGM1gb+LwsQ5EPevvbvdnKncajBdYqNcrvixBif1BsiDQiSF1q+j4bBTvKC6Bt9n2kqNSx+yNTY2TVJ360E7EQ==", + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", + "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/botframework-connector/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dependencies": { - "debug": "^4.3.4" - }, + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", "engines": { "node": ">= 14" } }, + "node_modules/botframework-connector/node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, "node_modules/botframework-connector/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -14922,51 +15055,68 @@ } }, "node_modules/botframework-schema": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/botframework-schema/-/botframework-schema-4.23.0.tgz", - "integrity": "sha512-U3juxXxiNoS5Q700YBww2W2S7zWiAaZlG7qg4B8EHRuMOwpN1nQ5svdVZXB7kdpjeCCvqK/KqxJUpU6g2Yvkgg==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/botframework-schema/-/botframework-schema-4.23.1.tgz", + "integrity": "sha512-J/cjL9IFewO3Q2yuV+QGtWyzVFPgKCp/3adY5/+0MrBQasJS5IIGm45W4CV/uYuoAstOIpYJ9nQPzvNWbDN16g==", + "license": "MIT", "dependencies": { "adaptivecards": "1.2.3", - "uuid": "^8.3.2", - "zod": "^3.22.4" + "uuid": "^10.0.0", + "zod": "^3.23.8" } }, "node_modules/botframework-schema/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==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/botframework-streaming": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/botframework-streaming/-/botframework-streaming-4.23.0.tgz", - "integrity": "sha512-LITMQ6iSJlYnwFmsucHLtaGGXdN1egvJPJ+0Yj9WKtI9i6p/N06SxsMWFZwZOzGTM9GKa9zKfXMjYDiN4KQ+XQ==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/botframework-streaming/-/botframework-streaming-4.23.1.tgz", + "integrity": "sha512-/BjIu2BR8y/HOdJ+Wdr1nZUvW2W53G8whH65msvM95kmjEyqskeEWP62xDpZLA1OM3sLD9APNix69BX1awcbdw==", + "license": "MIT", "dependencies": { - "@types/node": "^10.17.27", + "@types/node": "18.19.47", "@types/ws": "^6.0.3", - "uuid": "^8.3.2", + "uuid": "^10.0.0", "ws": "^7.5.10" } }, "node_modules/botframework-streaming/node_modules/@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + "version": "18.19.47", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.47.tgz", + "integrity": "sha512-1f7dB3BL/bpd9tnDJrrHb66Y+cVrhxSOTGorRNdHwYTUlTay3HuTDPKo9a/4vX9pMQkhYBcAbL4jQdNlhCFP9A==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/botframework-streaming/node_modules/@types/ws": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.4.tgz", "integrity": "sha512-PpPrX7SZW9re6+Ha8ojZG4Se8AZXgf0GK6zmfqEuCsY49LFDNXO3SByp44X3dFEqtB73lkCDAdUazhAjVPiNwg==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/botframework-streaming/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==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -14975,6 +15125,7 @@ "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -15146,7 +15297,8 @@ "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "license": "MIT" }, "node_modules/browser-process-hrtime": { "version": "1.0.0", @@ -15157,6 +15309,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "license": "MIT", "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -15170,6 +15323,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "license": "MIT", "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -15180,6 +15334,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -15187,29 +15342,25 @@ "safe-buffer": "^5.1.2" } }, - "node_modules/browserify-fs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz", - "integrity": "sha512-8LqHRPuAEKvyTX34R6tsw4bO2ro6j9DmlYBhiYWHRM26Zv2cBw1fJOU0NeUQ0RkXkPn/PFBjhA0dm4AgaBurTg==", - "dependencies": { - "level-filesystem": "^1.0.1", - "level-js": "^2.1.3", - "levelup": "^0.18.2" - } - }, "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", + "license": "MIT", "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" } }, "node_modules/browserify-sign": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "license": "ISC", "dependencies": { "bn.js": "^5.2.1", "browserify-rsa": "^4.1.0", @@ -15229,12 +15380,14 @@ "node_modules/browserify-sign/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" }, "node_modules/browserify-sign/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==", + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15248,12 +15401,14 @@ "node_modules/browserify-sign/node_modules/readable-stream/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==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" }, "node_modules/browserify-sign/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==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -15261,7 +15416,8 @@ "node_modules/browserify-sign/node_modules/string_decoder/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==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" }, "node_modules/browserslist": { "version": "4.24.2", @@ -15351,7 +15507,8 @@ "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "license": "MIT" }, "node_modules/buildcheck": { "version": "0.0.6", @@ -15375,7 +15532,8 @@ "node_modules/builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "license": "MIT" }, "node_modules/builtins": { "version": "5.0.1", @@ -15531,20 +15689,20 @@ } }, "node_modules/chai": { - "version": "4.4.1", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", "dev": true, "license": "MIT", "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=12" } }, "node_modules/chalk": { @@ -15603,14 +15761,13 @@ } }, "node_modules/check-error": { - "version": "1.0.3", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.2" - }, "engines": { - "node": "*" + "node": ">= 16" } }, "node_modules/check-types": { @@ -15679,12 +15836,16 @@ } }, "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" } }, "node_modules/cjs-module-lexer": { @@ -15885,14 +16046,6 @@ "node": ">=12" } }, - "node_modules/clone": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", - "integrity": "sha512-IO78I0y6JcSpEPHzK4obKdsL7E7oLdRVDVOLwr2Hkbjsb+Eoz0dxW6tef0WizoKu0gLC4oZSZuEF4U2K6w1WQw==", - "engines": { - "node": "*" - } - }, "node_modules/clsx": { "version": "1.1.1", "dev": true, @@ -16379,11 +16532,6 @@ "version": "1.0.0", "license": "MIT" }, - "node_modules/confbox": { - "version": "0.1.7", - "dev": true, - "license": "MIT" - }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "dev": true, @@ -16710,20 +16858,23 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" } }, "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "license": "MIT" }, "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -16736,6 +16887,7 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "license": "MIT", "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -16777,24 +16929,29 @@ } }, "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", + "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", + "license": "MIT", "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" }, "engines": { - "node": "*" + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/crypto-random-string": { @@ -17560,12 +17717,11 @@ "license": "MIT" }, "node_modules/deep-eql": { - "version": "4.1.3", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, "license": "MIT", - "dependencies": { - "type-detect": "^4.0.0" - }, "engines": { "node": ">=6" } @@ -17602,14 +17758,6 @@ "node": ">= 10" } }, - "node_modules/deferred-leveldown": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", - "integrity": "sha512-+WCbb4+ez/SZ77Sdy1iadagFiVzMB89IKOBhglgnUkVxOxRWmmFsz8UDSNWh4Rhq+3wr/vMFlYj+rdEwWUDdng==", - "dependencies": { - "abstract-leveldown": "~0.12.1" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -17675,11 +17823,12 @@ } }, "node_modules/dependency-graph": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.10.0.tgz", - "integrity": "sha512-c9amUgpgxSi1bE5/sbLwcs5diLD0ygCQYmhfM5H1s5VH1mCsYkcmAL3CcNdv4kdSw6JuMoHeDGzLgj/gAXdWVg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "license": "MIT", "engines": { - "node": ">= 0.6.0" + "node": ">=4" } }, "node_modules/dequal": { @@ -17776,18 +17925,11 @@ "node": ">=0.3.1" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -17795,9 +17937,10 @@ } }, "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "license": "MIT" }, "node_modules/dir-glob": { "version": "3.0.1", @@ -17904,6 +18047,7 @@ }, "node_modules/dom-serializer": { "version": "1.4.1", + "dev": true, "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", @@ -17945,6 +18089,7 @@ }, "node_modules/domhandler": { "version": "4.3.1", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" @@ -17958,6 +18103,7 @@ }, "node_modules/domutils": { "version": "2.8.0", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", @@ -18083,9 +18229,10 @@ "dev": true }, "node_modules/elliptic": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", - "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -18097,9 +18244,10 @@ } }, "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "license": "MIT" }, "node_modules/emittery": { "version": "0.8.1", @@ -18182,6 +18330,7 @@ }, "node_modules/entities": { "version": "2.2.0", + "dev": true, "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" @@ -18232,17 +18381,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, "node_modules/error-ex": { "version": "1.3.2", "dev": true, @@ -18368,7 +18506,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.2.1", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", "dev": true, "license": "MIT" }, @@ -19690,6 +19830,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "license": "MIT", "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -19737,6 +19878,16 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/exponential-backoff": { "version": "3.1.1", "license": "Apache-2.0" @@ -20247,11 +20398,6 @@ "is-callable": "^1.1.3" } }, - "node_modules/foreach": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==" - }, "node_modules/foreground-child": { "version": "3.1.1", "license": "ISC", @@ -20473,29 +20619,17 @@ "license": "MIT" }, "node_modules/fs-extra": { - "version": "7.0.1", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-extra/node_modules/jsonfile": { - "version": "4.0.0", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "0.1.2", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" + "node": ">=14.14" } }, "node_modules/fs-monkey": { @@ -20550,30 +20684,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fwd-stream": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", - "integrity": "sha512-q2qaK2B38W07wfPSQDKMiKOD5Nzv2XyuvQlrmh1q0pxyHNanKHq8lwQ6n9zHucAwA5EbzRJKEgds2orn88rYTg==", - "dependencies": { - "readable-stream": "~1.0.26-4" - } - }, - "node_modules/fwd-stream/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/fwd-stream/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, "node_modules/gaxios": { "version": "6.3.0", "license": "Apache-2.0", @@ -20653,14 +20763,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-func-name": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/get-intrinsic": { "version": "1.2.4", "license": "MIT", @@ -21283,21 +21385,23 @@ } }, "node_modules/hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", + "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", + "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" }, "engines": { - "node": ">=4" + "node": ">= 0.10" } }, "node_modules/hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -21340,6 +21444,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "license": "MIT", "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -21526,6 +21631,7 @@ }, "node_modules/htmlparser2": { "version": "6.1.0", + "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -21617,7 +21723,8 @@ "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "license": "MIT" }, "node_modules/https-proxy-agent": { "version": "5.0.1", @@ -21697,11 +21804,6 @@ "dev": true, "license": "ISC" }, - "node_modules/idb-wrapper": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.2.tgz", - "integrity": "sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg==" - }, "node_modules/identity-obj-proxy": { "version": "3.0.0", "dev": true, @@ -21826,11 +21928,6 @@ "node": ">=8" } }, - "node_modules/indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==" - }, "node_modules/inflight": { "version": "1.0.6", "license": "ISC", @@ -22186,11 +22283,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-object": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", - "integrity": "sha512-GkfZZlIZtpkFrqyAXPQSRBMsaHAw+CgoKe2HXAkjd/sfoI9+hS8PT4wg2rJxdQyUKr7N2vHJbg7/jQtE5l5vBQ==" - }, "node_modules/is-path-inside": { "version": "3.0.3", "dev": true, @@ -22405,11 +22497,6 @@ "version": "0.0.1", "license": "MIT" }, - "node_modules/isbuffer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz", - "integrity": "sha512-xU+NoHp+YtKQkaM2HsQchYn0sltxMxew0HavMfHbjnucBoTSGbw745tL+Z7QBANleWM1eEQMenEpi174mIeS4g==" - }, "node_modules/isexe": { "version": "2.0.0", "license": "ISC" @@ -24391,7 +24478,6 @@ }, "node_modules/jsonfile": { "version": "6.1.0", - "dev": true, "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -24634,212 +24720,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/level-blobs": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", - "integrity": "sha512-n0iYYCGozLd36m/Pzm206+brIgXP8mxPZazZ6ZvgKr+8YwOZ8/PPpYC5zMUu2qFygRN8RO6WC/HH3XWMW7RMVg==", - "dependencies": { - "level-peek": "1.0.6", - "once": "^1.3.0", - "readable-stream": "^1.0.26-4" - } - }, - "node_modules/level-blobs/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/level-blobs/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "node_modules/level-filesystem": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz", - "integrity": "sha512-PhXDuCNYpngpxp3jwMT9AYBMgOvB6zxj3DeuIywNKmZqFj2djj9XfT2XDVslfqmo0Ip79cAd3SBy3FsfOZPJ1g==", - "dependencies": { - "concat-stream": "^1.4.4", - "errno": "^0.1.1", - "fwd-stream": "^1.0.4", - "level-blobs": "^0.1.7", - "level-peek": "^1.0.6", - "level-sublevel": "^5.2.0", - "octal": "^1.0.0", - "once": "^1.3.0", - "xtend": "^2.2.0" - } - }, - "node_modules/level-filesystem/node_modules/xtend": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", - "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/level-fix-range": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz", - "integrity": "sha512-9llaVn6uqBiSlBP+wKiIEoBa01FwEISFgHSZiyec2S0KpyLUkGR4afW/FCZ/X8y+QJvzS0u4PGOlZDdh1/1avQ==" - }, - "node_modules/level-hooks": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz", - "integrity": "sha512-fxLNny/vL/G4PnkLhWsbHnEaRi+A/k8r5EH/M77npZwYL62RHi2fV0S824z3QdpAk6VTgisJwIRywzBHLK4ZVA==", - "dependencies": { - "string-range": "~1.2" - } - }, - "node_modules/level-js": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz", - "integrity": "sha512-lZtjt4ZwHE00UMC1vAb271p9qzg8vKlnDeXfIesH3zL0KxhHRDjClQLGLWhyR0nK4XARnd4wc/9eD1ffd4PshQ==", - "dependencies": { - "abstract-leveldown": "~0.12.0", - "idb-wrapper": "^1.5.0", - "isbuffer": "~0.0.0", - "ltgt": "^2.1.2", - "typedarray-to-buffer": "~1.0.0", - "xtend": "~2.1.2" - } - }, - "node_modules/level-js/node_modules/object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" - }, - "node_modules/level-js/node_modules/typedarray-to-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz", - "integrity": "sha512-vjMKrfSoUDN8/Vnqitw2FmstOfuJ73G6CrSEKnf11A6RmasVxHqfeBcnTb6RsL4pTMuV5Zsv9IiHRphMZyckUw==" - }, - "node_modules/level-js/node_modules/xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", - "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/level-peek": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", - "integrity": "sha512-TKEzH5TxROTjQxWMczt9sizVgnmJ4F3hotBI48xCTYvOKd/4gA/uY0XjKkhJFo6BMic8Tqjf6jFMLWeg3MAbqQ==", - "dependencies": { - "level-fix-range": "~1.0.2" - } - }, - "node_modules/level-sublevel": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz", - "integrity": "sha512-tO8jrFp+QZYrxx/Gnmjawuh1UBiifpvKNAcm4KCogesWr1Nm2+ckARitf+Oo7xg4OHqMW76eAqQ204BoIlscjA==", - "dependencies": { - "level-fix-range": "2.0", - "level-hooks": ">=4.4.0 <5", - "string-range": "~1.2.1", - "xtend": "~2.0.4" - } - }, - "node_modules/level-sublevel/node_modules/is": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", - "integrity": "sha512-ajQCouIvkcSnl2iRdK70Jug9mohIHVX9uKpoWnl115ov0R5mzBvRrXxrnHbsA+8AdwCwc/sfw7HXmd4I5EJBdQ==", - "engines": { - "node": "*" - } - }, - "node_modules/level-sublevel/node_modules/level-fix-range": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", - "integrity": "sha512-WrLfGWgwWbYPrHsYzJau+5+te89dUbENBg3/lsxOs4p2tYOhCHjbgXxBAj4DFqp3k/XBwitcRXoCh8RoCogASA==", - "dependencies": { - "clone": "~0.1.9" - } - }, - "node_modules/level-sublevel/node_modules/object-keys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", - "integrity": "sha512-XODjdR2pBh/1qrjPcbSeSgEtKbYo7LqYNq64/TPuCf7j9SfDD3i21yatKoIy39yIWNvVM59iutfQQpCv1RfFzA==", - "deprecated": "Please update to the latest object-keys", - "dependencies": { - "foreach": "~2.0.1", - "indexof": "~0.0.1", - "is": "~0.2.6" - } - }, - "node_modules/level-sublevel/node_modules/xtend": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", - "integrity": "sha512-fOZg4ECOlrMl+A6Msr7EIFcON1L26mb4NY5rurSkOex/TWhazOrg6eXD/B0XkuiYcYhQDWLXzQxLMVJ7LXwokg==", - "dependencies": { - "is-object": "~0.1.2", - "object-keys": "~0.2.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/levelup": { - "version": "0.18.6", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz", - "integrity": "sha512-uB0auyRqIVXx+hrpIUtol4VAPhLRcnxcOsd2i2m6rbFIDarO5dnrupLOStYYpEcu8ZT087Z9HEuYw1wjr6RL6Q==", - "dependencies": { - "bl": "~0.8.1", - "deferred-leveldown": "~0.2.0", - "errno": "~0.1.1", - "prr": "~0.0.0", - "readable-stream": "~1.0.26", - "semver": "~2.3.1", - "xtend": "~3.0.0" - } - }, - "node_modules/levelup/node_modules/prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha512-LmUECmrW7RVj6mDWKjTXfKug7TFGdiz9P18HMcO4RHL+RW7MCOGNvpj5j47Rnp6ne6r4fZ2VzyUWEpKbg+tsjQ==" - }, - "node_modules/levelup/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/levelup/node_modules/semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/levelup/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "node_modules/levelup/node_modules/xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", - "engines": { - "node": ">=0.4" - } - }, "node_modules/leven": { "version": "3.1.0", "dev": true, @@ -25215,21 +25095,6 @@ "node": ">=8.9.0" } }, - "node_modules/local-pkg": { - "version": "0.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/localforage": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", @@ -25518,12 +25383,11 @@ } }, "node_modules/loupe": { - "version": "2.3.7", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", + "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" - } + "license": "MIT" }, "node_modules/lower-case": { "version": "2.0.2", @@ -25538,24 +25402,16 @@ "dev": true, "license": "0BSD" }, - "node_modules/ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==" - }, "node_modules/magic-string": { - "version": "0.30.10", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "dev": true, - "license": "MIT" - }, "node_modules/mailgun.js": { "version": "8.2.1", "license": "MIT", @@ -25612,6 +25468,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -25683,6 +25540,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "license": "MIT", "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -25692,9 +25550,10 @@ } }, "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "license": "MIT" }, "node_modules/mime": { "version": "1.6.0", @@ -25786,7 +25645,8 @@ "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "license": "MIT" }, "node_modules/minimatch": { "version": "3.1.2", @@ -25827,17 +25687,6 @@ "dev": true, "license": "MIT" }, - "node_modules/mlly": { - "version": "1.7.1", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.3", - "pathe": "^1.1.2", - "pkg-types": "^1.1.1", - "ufo": "^1.5.3" - } - }, "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", @@ -25945,12 +25794,6 @@ "react-dom": "*" } }, - "node_modules/nano-css/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true - }, "node_modules/nano-css/node_modules/css-tree": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", @@ -26451,11 +26294,6 @@ "dev": true, "license": "MIT" }, - "node_modules/octal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz", - "integrity": "sha512-nnda7W8d+A3vEIY+UrDQzzboPf1vhs4JYVhff5CDkq9QNoZY7Xrxeo/htox37j9dZf7yNHevZzqtejWgy1vCqQ==" - }, "node_modules/on-finished": { "version": "2.4.1", "license": "MIT", @@ -26542,7 +26380,8 @@ "node_modules/openssl-wrapper": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/openssl-wrapper/-/openssl-wrapper-0.3.4.tgz", - "integrity": "sha512-iITsrx6Ho8V3/2OVtmZzzX8wQaKAaFXEJQdzoPUZDtyf5jWFlqo+h+OhGT4TATQ47f9ACKHua8nw7Qoy85aeKQ==" + "integrity": "sha512-iITsrx6Ho8V3/2OVtmZzzX8wQaKAaFXEJQdzoPUZDtyf5jWFlqo+h+OhGT4TATQ47f9ACKHua8nw7Qoy85aeKQ==", + "license": "MIT" }, "node_modules/opentracing": { "version": "0.14.7", @@ -26692,6 +26531,7 @@ "version": "5.1.7", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "license": "ISC", "dependencies": { "asn1.js": "^4.10.1", "browserify-aes": "^1.2.0", @@ -26860,15 +26700,19 @@ }, "node_modules/pathe": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true, "license": "MIT" }, "node_modules/pathval": { - "version": "1.1.1", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, "license": "MIT", "engines": { - "node": "*" + "node": ">= 14.16" } }, "node_modules/pause": { @@ -26878,6 +26722,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "license": "MIT", "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -27069,16 +26914,6 @@ "node": ">=8" } }, - "node_modules/pkg-types": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.7", - "mlly": "^1.7.0", - "pathe": "^1.1.2" - } - }, "node_modules/pkg-up": { "version": "3.1.0", "dev": true, @@ -28460,30 +28295,6 @@ "renderkid": "^3.0.0" } }, - "node_modules/pretty-format": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/prism-react-renderer": { "version": "1.3.5", "dev": true, @@ -28616,11 +28427,6 @@ "version": "1.1.0", "license": "MIT" }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" - }, "node_modules/psl": { "version": "1.9.0", "dev": true, @@ -28635,6 +28441,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -28645,9 +28452,10 @@ } }, "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "license": "MIT" }, "node_modules/pump": { "version": "3.0.0", @@ -28739,6 +28547,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "license": "MIT", "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -29907,6 +29716,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -29949,7 +29759,8 @@ "node_modules/rsa-pem-from-mod-exp": { "version": "0.8.6", "resolved": "https://registry.npmjs.org/rsa-pem-from-mod-exp/-/rsa-pem-from-mod-exp-0.8.6.tgz", - "integrity": "sha512-c5ouQkOvGHF1qomUUDJGFcXsomeSO2gbEs6hVhMAtlkE1CuaZase/WzoaKFG/EZQuNmq6pw/EMCeEnDvOgCJYQ==" + "integrity": "sha512-c5ouQkOvGHF1qomUUDJGFcXsomeSO2gbEs6hVhMAtlkE1CuaZase/WzoaKFG/EZQuNmq6pw/EMCeEnDvOgCJYQ==", + "license": "MIT" }, "node_modules/rtl-css-js": { "version": "1.16.1", @@ -30596,6 +30407,7 @@ "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -30646,6 +30458,8 @@ }, "node_modules/siginfo": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, "license": "ISC" }, @@ -31022,6 +30836,8 @@ }, "node_modules/stackback": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, "license": "MIT" }, @@ -31152,7 +30968,9 @@ } }, "node_modules/std-env": { - "version": "3.7.0", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", "dev": true, "license": "MIT" }, @@ -31160,6 +30978,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "license": "MIT", "engines": { "node": ">=4", "npm": ">=6" @@ -31169,6 +30988,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "license": "MIT", "dependencies": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" @@ -31185,6 +31005,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "license": "MIT", "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", @@ -31258,11 +31079,6 @@ "dev": true, "license": "MIT" }, - "node_modules/string-range": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", - "integrity": "sha512-tYft6IFi8SjplJpxCUxyqisD3b+R2CSkomrtJYCkvuf1KuCAWgz7YXt4O0jip7efpfCemwHEzTEAO8EuOYgh3w==" - }, "node_modules/string-width": { "version": "4.2.3", "license": "MIT", @@ -31436,22 +31252,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-literal": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/strip-outer": { "version": "1.0.1", "license": "MIT", @@ -32327,12 +32127,33 @@ "dev": true }, "node_modules/tinybench": { - "version": "2.6.0", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true, "license": "MIT" }, "node_modules/tinypool": { - "version": "0.8.4", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", "dev": true, "license": "MIT", "engines": { @@ -32340,7 +32161,9 @@ } }, "node_modules/tinyspy": { - "version": "2.2.1", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, "license": "MIT", "engines": { @@ -32979,6 +32802,7 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "license": "MIT", "engines": { "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } @@ -33126,11 +32950,6 @@ "node": ">=14.17" } }, - "node_modules/ufo": { - "version": "1.5.3", - "dev": true, - "license": "MIT" - }, "node_modules/uid-safe": { "version": "2.1.5", "license": "MIT", @@ -33235,7 +33054,6 @@ }, "node_modules/universalify": { "version": "2.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -33609,14 +33427,16 @@ } }, "node_modules/vite-node": { - "version": "1.6.0", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.8.tgz", + "integrity": "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", "vite": "^5.0.0" }, "bin": { @@ -33629,6 +33449,31 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/vite-node/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/vite-node/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, + "license": "MIT" + }, "node_modules/vite-plugin-svgr": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.2.0.tgz", @@ -34299,30 +34144,32 @@ } }, "node_modules/vitest": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "1.6.0", - "@vitest/runner": "1.6.0", - "@vitest/snapshot": "1.6.0", - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.3", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.8.tgz", + "integrity": "sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.8", + "@vitest/mocker": "2.1.8", + "@vitest/pretty-format": "^2.1.8", + "@vitest/runner": "2.1.8", + "@vitest/snapshot": "2.1.8", + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "1.6.0", - "why-is-node-running": "^2.2.2" + "vite-node": "2.1.8", + "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" @@ -34336,8 +34183,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.6.0", - "@vitest/ui": "1.6.0", + "@vitest/browser": "2.1.8", + "@vitest/ui": "2.1.8", "happy-dom": "*", "jsdom": "*" }, @@ -34362,129 +34209,30 @@ } } }, - "node_modules/vitest/node_modules/execa": { - "version": "8.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/vitest/node_modules/get-stream": { - "version": "8.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/human-signals": { - "version": "5.0.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/vitest/node_modules/is-stream": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/mimic-fn": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/npm-run-path": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/onetime": { - "version": "6.0.0", + "node_modules/vitest/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/path-key": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "ms": "^2.1.3" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "license": "ISC", "engines": { - "node": ">=14" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/vitest/node_modules/strip-final-newline": { - "version": "3.0.0", + "node_modules/vitest/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, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, "node_modules/w3c-hr-time": { "version": "1.0.2", @@ -34973,7 +34721,9 @@ } }, "node_modules/why-is-node-running": { - "version": "2.2.2", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { @@ -35829,7 +35579,7 @@ "esbuild": "^0.17.19", "json-schema": "0.4.0", "strip-ansi": "7.1.0", - "vitest": "1.6.0" + "vitest": "2.1.8" }, "engines": { "node": ">=18.0" @@ -36091,7 +35841,7 @@ }, "devDependencies": { "typescript": "5.3.3", - "vitest": "1.6.0" + "vitest": "2.1.8" } }, "packages/fleet": { @@ -36104,7 +35854,7 @@ }, "devDependencies": { "@nangohq/types": "file:../types", - "vitest": "1.6.0" + "vitest": "2.1.8" } }, "packages/frontend": { @@ -36159,7 +35909,7 @@ "nodemon": "3.1.7", "type-fest": "4.26.1", "typescript": "5.3.3", - "vitest": "1.6.0" + "vitest": "2.1.8" } }, "packages/jobs/node_modules/get-port": { @@ -36194,7 +35944,7 @@ }, "devDependencies": { "@nangohq/types": "file:../types", - "vitest": "1.6.0" + "vitest": "2.1.8" } }, "packages/kvstore": { @@ -36205,7 +35955,7 @@ "redis": "4.6.13" }, "devDependencies": { - "vitest": "1.6.0" + "vitest": "2.1.8" } }, "packages/logs": { @@ -36227,7 +35977,7 @@ "devDependencies": { "@nangohq/types": "file:../types", "type-fest": "4.26.1", - "vitest": "1.6.0" + "vitest": "2.1.8" } }, "packages/logs/node_modules/@opentelemetry/api-logs": { @@ -36449,7 +36199,7 @@ }, "devDependencies": { "@nangohq/types": "0.48.1", - "vitest": "1.6.0" + "vitest": "2.1.8" } }, "packages/nango-yaml/node_modules/ms": { @@ -36469,7 +36219,7 @@ "devDependencies": { "@nangohq/types": "0.48.1", "tsup": "^8.2.4", - "vitest": "1.6.0" + "vitest": "2.1.8" }, "engines": { "node": ">=18.0" @@ -36491,7 +36241,7 @@ "@nangohq/types": "file:../types", "@types/node": "20.12.2", "type-fest": "4.26.1", - "vitest": "1.6.0" + "vitest": "2.1.8" } }, "packages/orchestrator/node_modules/get-port": { @@ -36535,7 +36285,7 @@ "@types/node": "20.12.2", "node-fetch": "^3.3.2", "typescript": "5.3.3", - "vitest": "1.6.0" + "vitest": "2.1.8" } }, "packages/persist/node_modules/node-fetch": { @@ -36568,7 +36318,7 @@ }, "devDependencies": { "@types/md5": "2.3.2", - "vitest": "1.6.0" + "vitest": "2.1.8" } }, "packages/runner": { @@ -36581,7 +36331,7 @@ "@trpc/client": "^10.45.1", "@trpc/server": "^10.45.1", "axios": "^1.7.4", - "botbuilder": "4.23.0", + "botbuilder": "4.23.1", "connect-timeout": "1.9.0", "dd-trace": "5.21.0", "express": "^4.20.0", @@ -36595,7 +36345,7 @@ "@types/connect-timeout": "0.0.39", "@types/node": "20.12.2", "typescript": "5.3.3", - "vitest": "1.6.0" + "vitest": "2.1.8" } }, "packages/runner/node_modules/@trpc/client": { @@ -36626,7 +36376,7 @@ }, "devDependencies": { "type-fest": "4.26.1", - "vitest": "1.6.0" + "vitest": "2.1.8" } }, "packages/scheduler/node_modules/type-fest": { @@ -36708,7 +36458,7 @@ "nodemon": "3.1.7", "type-fest": "4.26.1", "typescript": "5.3.3", - "vitest": "1.6.0" + "vitest": "2.1.8" }, "engines": { "node": ">=18.0", @@ -36850,7 +36600,7 @@ "knex": "3.1.0", "type-fest": "4.26.1", "typescript": "^5.3.3", - "vitest": "1.6.0" + "vitest": "2.1.8" }, "engines": { "node": ">=18.0", @@ -38545,37 +38295,11 @@ "acorn": "^8" } }, - "packages/shared/node_modules/@nangohq/utils/node_modules/agent-base": { - "version": "7.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "packages/shared/node_modules/@nangohq/utils/node_modules/async": { "version": "3.2.6", "inBundle": true, "license": "MIT" }, - "packages/shared/node_modules/@nangohq/utils/node_modules/asynckit": { - "version": "0.4.0", - "inBundle": true, - "license": "MIT" - }, - "packages/shared/node_modules/@nangohq/utils/node_modules/axios": { - "version": "1.7.9", - "inBundle": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, "packages/shared/node_modules/@nangohq/utils/node_modules/cjs-module-lexer": { "version": "1.4.1", "inBundle": true, @@ -38621,17 +38345,6 @@ "text-hex": "1.0.x" } }, - "packages/shared/node_modules/@nangohq/utils/node_modules/combined-stream": { - "version": "1.0.8", - "inBundle": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "packages/shared/node_modules/@nangohq/utils/node_modules/crypto-randomuuid": { "version": "1.0.0", "inBundle": true, @@ -38685,27 +38398,6 @@ "node": ">=18" } }, - "packages/shared/node_modules/@nangohq/utils/node_modules/debug": { - "version": "4.4.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "packages/shared/node_modules/@nangohq/utils/node_modules/debug/node_modules/ms": { - "version": "2.1.3", - "inBundle": true, - "license": "MIT" - }, "packages/shared/node_modules/@nangohq/utils/node_modules/delay": { "version": "5.0.0", "inBundle": true, @@ -38717,14 +38409,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/shared/node_modules/@nangohq/utils/node_modules/delayed-stream": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "packages/shared/node_modules/@nangohq/utils/node_modules/detect-newline": { "version": "3.1.0", "inBundle": true, @@ -38743,16 +38427,6 @@ "inBundle": true, "license": "MIT" }, - "packages/shared/node_modules/@nangohq/utils/node_modules/exponential-backoff": { - "version": "3.1.1", - "inBundle": true, - "license": "Apache-2.0" - }, - "packages/shared/node_modules/@nangohq/utils/node_modules/fast-safe-stringify": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT" - }, "packages/shared/node_modules/@nangohq/utils/node_modules/fecha": { "version": "4.2.3", "inBundle": true, @@ -38763,70 +38437,6 @@ "inBundle": true, "license": "MIT" }, - "packages/shared/node_modules/@nangohq/utils/node_modules/follow-redirects": { - "version": "1.15.9", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "packages/shared/node_modules/@nangohq/utils/node_modules/form-data": { - "version": "4.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "packages/shared/node_modules/@nangohq/utils/node_modules/guess-json-indent": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=18.18.0" - } - }, - "packages/shared/node_modules/@nangohq/utils/node_modules/http-proxy-agent": { - "version": "7.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "packages/shared/node_modules/@nangohq/utils/node_modules/https-proxy-agent": { - "version": "7.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "packages/shared/node_modules/@nangohq/utils/node_modules/ieee754": { "version": "1.2.1", "funding": [ @@ -38960,25 +38570,6 @@ "node": ">=12" } }, - "packages/shared/node_modules/@nangohq/utils/node_modules/mime-db": { - "version": "1.52.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "packages/shared/node_modules/@nangohq/utils/node_modules/mime-types": { - "version": "2.1.35", - "inBundle": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "packages/shared/node_modules/@nangohq/utils/node_modules/module-details-from-path": { "version": "1.0.3", "inBundle": true, @@ -39093,11 +38684,6 @@ "node": ">=12.0.0" } }, - "packages/shared/node_modules/@nangohq/utils/node_modules/proxy-from-env": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" - }, "packages/shared/node_modules/@nangohq/utils/node_modules/readable-stream": { "version": "3.6.2", "inBundle": true, @@ -39214,22 +38800,6 @@ "safe-buffer": "~5.2.0" } }, - "packages/shared/node_modules/@nangohq/utils/node_modules/string-byte-length": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=18.18.0" - } - }, - "packages/shared/node_modules/@nangohq/utils/node_modules/string-byte-slice": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=18.18.0" - } - }, "packages/shared/node_modules/@nangohq/utils/node_modules/text-hex": { "version": "1.0.0", "inBundle": true, @@ -39248,19 +38818,6 @@ "node": ">= 14.0.0" } }, - "packages/shared/node_modules/@nangohq/utils/node_modules/truncate-json": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "guess-json-indent": "^3.0.0", - "string-byte-length": "^3.0.0", - "string-byte-slice": "^3.0.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, "packages/shared/node_modules/@nangohq/utils/node_modules/type-fest": { "version": "2.19.0", "inBundle": true, @@ -39604,7 +39161,7 @@ "@nangohq/types": "file:../types", "express": "^4.20.0", "ms": "3.0.0-canary.1", - "vitest": "1.6.0" + "vitest": "2.1.8" } }, "packages/utils/node_modules/agent-base": { @@ -40780,7 +40337,7 @@ "devDependencies": { "@nangohq/types": "file:../types", "typescript": "5.3.3", - "vitest": "1.6.0" + "vitest": "2.1.8" } }, "packages/webhooks/node_modules/dayjs": { diff --git a/package.json b/package.json index 881fe208e56..f69d7535129 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "testcontainers": "9.12.0", "tsx": "4.19.0", "typescript": "5.3.3", - "vitest": "1.6.0" + "vitest": "2.1.8" }, "lint-staged": { "*.{js,jsx,ts,tsx,cjs}": [ diff --git a/packages/cli/lib/services/dryrun.service.ts b/packages/cli/lib/services/dryrun.service.ts index b8d7180e15c..3549d4bd985 100644 --- a/packages/cli/lib/services/dryrun.service.ts +++ b/packages/cli/lib/services/dryrun.service.ts @@ -477,17 +477,16 @@ export class DryRunService { return { success: false, error: new NangoError(content, 500), response: null }; } + const filename = `${syncName}-${nangoProps.providerConfigKey}.js`; try { - const wrappedScript = ` - (function() { - var module = { exports: {} }; - var exports = module.exports; - ${script} - return module.exports; - })(); + const wrappedCode = `(function() { var module = { exports: {} }; var exports = module.exports; ${script} + return module.exports; + })(); `; - const scriptObj = new vm.Script(wrappedScript); + const scriptObj = new vm.Script(wrappedCode, { + filename + }); const sandbox = { console, require: (moduleName: string) => { @@ -604,11 +603,21 @@ export class DryRunService { } } else { const tmp = serializeError(!err || typeof err !== 'object' ? new Error(JSON.stringify(err)) : err); + + const stacktrace = tmp.stack + ? tmp.stack + .split('\n') + .filter((s, i) => i === 0 || s.includes(filename)) + .map((s) => s.trim()) + .slice(0, 5) // max 5 lines + : []; + return { success: false, error: { type: 'script_internal_error', payload: { name: tmp.name || 'Error', code: tmp.code, message: tmp.message }, + ...(stacktrace.length > 0 ? { stacktrace } : {}), status: 500 }, response: null diff --git a/packages/cli/package.json b/packages/cli/package.json index 2ce337fbff3..f885c4b8cce 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -70,7 +70,7 @@ "esbuild": "^0.17.19", "json-schema": "0.4.0", "strip-ansi": "7.1.0", - "vitest": "1.6.0" + "vitest": "2.1.8" }, "engines": { "node": ">=18.0" diff --git a/packages/database/package.json b/packages/database/package.json index f2886dbac8e..29458a26b00 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -23,7 +23,7 @@ }, "devDependencies": { "typescript": "5.3.3", - "vitest": "1.6.0" + "vitest": "2.1.8" }, "files": [ "dist/**/*" diff --git a/packages/fleet/package.json b/packages/fleet/package.json index 13b751595c0..eb5146cb919 100644 --- a/packages/fleet/package.json +++ b/packages/fleet/package.json @@ -23,6 +23,6 @@ }, "devDependencies": { "@nangohq/types": "file:../types", - "vitest": "1.6.0" + "vitest": "2.1.8" } } diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 3bfd3578e3e..6526b3ee3df 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -20,6 +20,7 @@ "files": [ "dist/**/*.js", "dist/**/*.d.ts", + "dist/**/*.map", "!**/*.json", "README.md" ] diff --git a/packages/frontend/tsconfig.json b/packages/frontend/tsconfig.json index 7d31f7ff63b..008e8d94d72 100644 --- a/packages/frontend/tsconfig.json +++ b/packages/frontend/tsconfig.json @@ -3,7 +3,10 @@ "compilerOptions": { "lib": ["es2015", "dom"], "rootDir": "lib", - "outDir": "dist" + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true }, "references": [ { diff --git a/packages/jobs/lib/app.ts b/packages/jobs/lib/app.ts index 1cfcaf7a5c3..357cedccd8b 100644 --- a/packages/jobs/lib/app.ts +++ b/packages/jobs/lib/app.ts @@ -57,8 +57,7 @@ try { process.on('unhandledRejection', (reason) => { logger.error('Received unhandledRejection...', reason); - process.exitCode = 1; - void close(); + // not closing on purpose }); process.on('uncaughtException', (e) => { diff --git a/packages/jobs/lib/execution/sync.integration.test.ts b/packages/jobs/lib/execution/sync.integration.test.ts index fe050abe22d..81322c6c0aa 100644 --- a/packages/jobs/lib/execution/sync.integration.test.ts +++ b/packages/jobs/lib/execution/sync.integration.test.ts @@ -324,7 +324,7 @@ async function seeds(records: UnencryptedRecordData[], trackDeletes: boolean) { const { env } = await seeders.seedAccountEnvAndUser(); const model = 'GithubIssue'; - const connection = await seeders.createConnectionSeed(env, 'github'); + const connection = await seeders.createConnectionSeed({ env, provider: 'github' }); if (!connection.id) { throw new Error('Failed to create connection'); diff --git a/packages/jobs/package.json b/packages/jobs/package.json index b30153e1919..e5be1593632 100644 --- a/packages/jobs/package.json +++ b/packages/jobs/package.json @@ -39,6 +39,6 @@ "nodemon": "3.1.7", "typescript": "5.3.3", "type-fest": "4.26.1", - "vitest": "1.6.0" + "vitest": "2.1.8" } } diff --git a/packages/keystore/package.json b/packages/keystore/package.json index 1f5d97d2dd7..30acf23123b 100644 --- a/packages/keystore/package.json +++ b/packages/keystore/package.json @@ -23,6 +23,6 @@ }, "devDependencies": { "@nangohq/types": "file:../types", - "vitest": "1.6.0" + "vitest": "2.1.8" } } diff --git a/packages/kvstore/package.json b/packages/kvstore/package.json index 07b97bf8e5c..22d22c0c197 100644 --- a/packages/kvstore/package.json +++ b/packages/kvstore/package.json @@ -18,7 +18,7 @@ "redis": "4.6.13" }, "devDependencies": { - "vitest": "1.6.0" + "vitest": "2.1.8" }, "files": [ "dist/**/*" diff --git a/packages/logs/package.json b/packages/logs/package.json index 243d46dfe16..5689fe683ee 100644 --- a/packages/logs/package.json +++ b/packages/logs/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@nangohq/types": "file:../types", "type-fest": "4.26.1", - "vitest": "1.6.0" + "vitest": "2.1.8" }, "files": [ "dist/**/*" diff --git a/packages/nango-yaml/package.json b/packages/nango-yaml/package.json index 92f31c934d7..4f2742dbdf6 100644 --- a/packages/nango-yaml/package.json +++ b/packages/nango-yaml/package.json @@ -18,7 +18,7 @@ }, "devDependencies": { "@nangohq/types": "0.48.1", - "vitest": "1.6.0" + "vitest": "2.1.8" }, "files": [ "dist/**/*" diff --git a/packages/node-client/package.json b/packages/node-client/package.json index 9f2b66348a8..281523cf61e 100644 --- a/packages/node-client/package.json +++ b/packages/node-client/package.json @@ -38,6 +38,6 @@ "devDependencies": { "@nangohq/types": "0.48.1", "tsup": "^8.2.4", - "vitest": "1.6.0" + "vitest": "2.1.8" } } diff --git a/packages/orchestrator/package.json b/packages/orchestrator/package.json index 435ff52e28e..fdf565c7f57 100644 --- a/packages/orchestrator/package.json +++ b/packages/orchestrator/package.json @@ -26,6 +26,6 @@ "@nangohq/types": "file:../types", "type-fest": "4.26.1", "@types/node": "20.12.2", - "vitest": "1.6.0" + "vitest": "2.1.8" } } diff --git a/packages/persist/package.json b/packages/persist/package.json index f9e0e4c7b62..6971b140ed6 100644 --- a/packages/persist/package.json +++ b/packages/persist/package.json @@ -32,6 +32,6 @@ "@types/node": "20.12.2", "node-fetch": "^3.3.2", "typescript": "5.3.3", - "vitest": "1.6.0" + "vitest": "2.1.8" } } diff --git a/packages/records/lib/models/records.integration.test.ts b/packages/records/lib/models/records.integration.test.ts index ff5acfad7aa..c35b3a98c1f 100644 --- a/packages/records/lib/models/records.integration.test.ts +++ b/packages/records/lib/models/records.integration.test.ts @@ -1,4 +1,4 @@ -import { expect, describe, it, beforeAll, afterEach } from 'vitest'; +import { expect, describe, it, beforeAll, afterAll } from 'vitest'; import dayjs from 'dayjs'; import * as uuid from 'uuid'; import { migrate } from '../db/migrate.js'; @@ -13,13 +13,13 @@ describe('Records service', () => { await migrate(); }); - afterEach(async () => { + afterAll(async () => { await db(RECORDS_TABLE).truncate(); }); it('Should write records', async () => { - const connectionId = 1; - const environmentId = 2; + const connectionId = Math.floor(Math.random() * 1000000); + const environmentId = Math.floor(Math.random() * 1000000); const model = 'my-model'; const syncId = '00000000-0000-0000-0000-000000000000'; const records = [ @@ -50,8 +50,8 @@ describe('Records service', () => { }); it('Should be able to encrypt and insert 2000 records under 2 seconds', async () => { - const connectionId = 1; - const environmentId = 2; + const connectionId = Math.floor(Math.random() * 1000000); + const environmentId = Math.floor(Math.random() * 1000000); const model = 'my-model'; const syncId = '00000000-0000-0000-0000-000000000000'; const records = Array.from({ length: 2000 }, (_, i) => ({ @@ -76,8 +76,8 @@ describe('Records service', () => { }); it('Should delete records', async () => { - const connectionId = 1; - const environmentId = 2; + const connectionId = Math.floor(Math.random() * 1000000); + const environmentId = Math.floor(Math.random() * 1000000); const model = 'my-model'; const syncId = '00000000-0000-0000-0000-000000000000'; const records = [ @@ -196,8 +196,8 @@ describe('Records service', () => { }); it('Should return correct added records count when upserting concurrently', async () => { - const connectionId = 1; - const environmentId = 2; + const connectionId = Math.floor(Math.random() * 1000000); + const environmentId = Math.floor(Math.random() * 1000000); const model = 'my-model'; const syncId = '00000000-0000-0000-0000-000000000000'; const syncJobId = 1; diff --git a/packages/records/package.json b/packages/records/package.json index 524ca08022a..6afe6d663fd 100644 --- a/packages/records/package.json +++ b/packages/records/package.json @@ -26,6 +26,6 @@ }, "devDependencies": { "@types/md5": "2.3.2", - "vitest": "1.6.0" + "vitest": "2.1.8" } } diff --git a/packages/runner/Dockerfile b/packages/runner/Dockerfile index 2f152d51106..7787d2e6447 100644 --- a/packages/runner/Dockerfile +++ b/packages/runner/Dockerfile @@ -1,4 +1,4 @@ -FROM node:20.12.2-slim +FROM node:20.18.1-bookworm-slim RUN apt-get update \ && apt-get install -y ca-certificates \ diff --git a/packages/runner/lib/exec.ts b/packages/runner/lib/exec.ts index 3baad1c0506..3717adafa67 100644 --- a/packages/runner/lib/exec.ts +++ b/packages/runner/lib/exec.ts @@ -32,15 +32,13 @@ export async function exec( const nango = process.env['NANGO_TELEMETRY_SDK'] ? instrumentSDK(rawNango) : rawNango; nango.abortSignal = abortController.signal; - const wrappedCode = ` - (function() { - var module = { exports: {} }; - var exports = module.exports; - ${code} - return module.exports; - })(); + const wrappedCode = `(function() { var module = { exports: {} }; var exports = module.exports; ${code} + return module.exports; + })(); `; + const filename = `${nangoProps.syncConfig.sync_name}-${nangoProps.providerConfigKey}.js`; + return await tracer.trace>(SpanTypes.RUNNER_EXEC, async (span) => { span.setTag('accountId', nangoProps.team?.id) .setTag('environmentId', nangoProps.environmentId) @@ -49,7 +47,9 @@ export async function exec( .setTag('syncId', nangoProps.syncId); try { - const script = new vm.Script(wrappedCode); + const script = new vm.Script(wrappedCode, { + filename + }); const sandbox: vm.Context = { console, require: (moduleName: string) => { @@ -202,6 +202,7 @@ export async function exec( } else if (err instanceof Error) { const tmp = errorToObject(err); span.setTag('error', tmp); + return { success: false, error: { @@ -214,11 +215,25 @@ export async function exec( } else { const tmp = errorToObject(!err || typeof err !== 'object' ? new Error(JSON.stringify(err)) : err); span.setTag('error', tmp); + + const stacktrace = tmp.stack + ? tmp.stack + .split('\n') + .filter((s, i) => i === 0 || s.includes(filename)) + .map((s) => s.trim()) + .slice(0, 5) // max 5 lines + : []; + return { success: false, error: { type: 'script_internal_error', - payload: truncateJson({ name: tmp.name || 'Error', code: tmp.code, message: tmp.message }), + payload: truncateJson({ + name: tmp.name || 'Error', + code: tmp.code, + message: tmp.message, + ...(stacktrace.length > 0 ? { stacktrace } : {}) + }), status: 500 }, response: null diff --git a/packages/runner/lib/exec.unit.test.ts b/packages/runner/lib/exec.unit.test.ts index 8c566bc3116..508a9e92927 100644 --- a/packages/runner/lib/exec.unit.test.ts +++ b/packages/runner/lib/exec.unit.test.ts @@ -253,8 +253,7 @@ describe('Exec', () => { xsrfHeaderName: 'X-XSRF-TOKEN' }, message: expect.any(String), - name: expect.any(String), - status: null + name: expect.any(String) } }, status: 500, diff --git a/packages/runner/package.json b/packages/runner/package.json index 83df7dac8ca..bd1f2d8f646 100644 --- a/packages/runner/package.json +++ b/packages/runner/package.json @@ -23,7 +23,7 @@ "@trpc/client": "^10.45.1", "@trpc/server": "^10.45.1", "axios": "^1.7.4", - "botbuilder": "4.23.0", + "botbuilder": "4.23.1", "connect-timeout": "1.9.0", "dd-trace": "5.21.0", "express": "^4.20.0", @@ -37,6 +37,6 @@ "@types/connect-timeout": "0.0.39", "@types/node": "20.12.2", "typescript": "5.3.3", - "vitest": "1.6.0" + "vitest": "2.1.8" } } diff --git a/packages/scheduler/package.json b/packages/scheduler/package.json index 65442761262..7967ec23228 100644 --- a/packages/scheduler/package.json +++ b/packages/scheduler/package.json @@ -24,6 +24,6 @@ }, "devDependencies": { "type-fest": "4.26.1", - "vitest": "1.6.0" + "vitest": "2.1.8" } } diff --git a/packages/server/Dockerfile b/packages/server/Dockerfile index 5fc50af0895..9ba95bc25a3 100644 --- a/packages/server/Dockerfile +++ b/packages/server/Dockerfile @@ -1,4 +1,4 @@ -FROM node:20.12.2-slim +FROM node:20.18.1-bookworm-slim ENV SERVER_RUN_MODE=DOCKERIZED diff --git a/packages/server/lib/controllers/connect/postReconnect.integration.test.ts b/packages/server/lib/controllers/connect/postReconnect.integration.test.ts index dfbf8acc59e..2d4f7edaca7 100644 --- a/packages/server/lib/controllers/connect/postReconnect.integration.test.ts +++ b/packages/server/lib/controllers/connect/postReconnect.integration.test.ts @@ -55,7 +55,7 @@ describe(`POST ${endpoint}`, () => { // Create an initial connection await seeders.createConfigSeed(env, 'github', 'github'); - const connection = await seeders.createConnectionSeed(env, 'github'); + const connection = await seeders.createConnectionSeed({ env, provider: 'github' }); await linkConnection(db.knex, { endUserId: endUser.id, connection }); const res = await api.fetch(endpoint, { @@ -84,7 +84,7 @@ describe(`POST ${endpoint}`, () => { // Create an initial connection await seeders.createConfigSeed(env, 'github', 'github'); - const connection = await seeders.createConnectionSeed(env, 'github'); + const connection = await seeders.createConnectionSeed({ env, provider: 'github' }); const res = await api.fetch(endpoint, { method: 'POST', @@ -108,7 +108,7 @@ describe(`POST ${endpoint}`, () => { // Create an initial connection await seeders.createConfigSeed(env, 'github', 'github'); - const connection = await seeders.createConnectionSeed(env, 'github'); + const connection = await seeders.createConnectionSeed({ env, provider: 'github' }); const res = await api.fetch(endpoint, { method: 'POST', diff --git a/packages/server/lib/controllers/connection/connectionId/getConnection.integration.test.ts b/packages/server/lib/controllers/connection/connectionId/getConnection.integration.test.ts index e2613575263..2390b3c5b53 100644 --- a/packages/server/lib/controllers/connection/connectionId/getConnection.integration.test.ts +++ b/packages/server/lib/controllers/connection/connectionId/getConnection.integration.test.ts @@ -61,7 +61,10 @@ describe(`GET ${endpoint}`, () => { const { env, account } = await seeders.seedAccountEnvAndUser(); await seeders.createConfigSeed(env, 'algolia', 'algolia'); const endUser = await seeders.createEndUser({ environment: env, account }); - const conn = await seeders.createConnectionSeed(env, 'algolia', endUser, { + const conn = await seeders.createConnectionSeed({ + env, + provider: 'algolia', + endUser, rawCredentials: { type: 'API_KEY', apiKey: 'test_api_key' }, connectionConfig: { APP_ID: 'TEST' } }); @@ -106,13 +109,19 @@ describe(`GET ${endpoint}`, () => { await seeders.createConfigSeed(env, 'algolia', 'algolia'); const endUser = await seeders.createEndUser({ environment: env, account }); - const conn = await seeders.createConnectionSeed(env, 'algolia', endUser, { + const conn = await seeders.createConnectionSeed({ + env, + provider: 'algolia', + endUser, rawCredentials: { type: 'API_KEY', apiKey: 'test_api_key' }, connectionConfig: { APP_ID: 'TEST' } }); await seeders.createConfigSeed(env, 'google', 'google'); - await seeders.createConnectionSeed(env, 'google', endUser, { + await seeders.createConnectionSeed({ + env, + provider: 'google', + endUser, connectionId: conn.connection_id, rawCredentials: { type: 'API_KEY', apiKey: 'test_api_key' }, connectionConfig: { APP_ID: 'TEST' } diff --git a/packages/server/lib/controllers/connection/connectionId/metadata/patchMetadata.integration.test.ts b/packages/server/lib/controllers/connection/connectionId/metadata/patchMetadata.integration.test.ts index f403be9dbdf..4e4635c5b93 100644 --- a/packages/server/lib/controllers/connection/connectionId/metadata/patchMetadata.integration.test.ts +++ b/packages/server/lib/controllers/connection/connectionId/metadata/patchMetadata.integration.test.ts @@ -136,7 +136,7 @@ describe(`PATCH ${endpoint}`, () => { const env = await seeders.createEnvironmentSeed(); const unique_key = 'test-update'; await seeders.createConfigSeed(env, unique_key, 'google'); - const connections = await seeders.createConnectionSeed(env, unique_key); + const connections = await seeders.createConnectionSeed({ env, provider: unique_key }); const { connection_id, provider_config_key } = connections; diff --git a/packages/server/lib/controllers/connection/connectionId/metadata/postMetadata.integration.test.ts b/packages/server/lib/controllers/connection/connectionId/metadata/postMetadata.integration.test.ts index 8e0f665a9c6..ba7cbdbdeac 100644 --- a/packages/server/lib/controllers/connection/connectionId/metadata/postMetadata.integration.test.ts +++ b/packages/server/lib/controllers/connection/connectionId/metadata/postMetadata.integration.test.ts @@ -136,7 +136,7 @@ describe(`POST ${endpoint}`, () => { it('Should replace existing metadata, overwriting anything existing', async () => { const env = await seeders.createEnvironmentSeed(); await seeders.createConfigSeed(env, 'test-replace', 'google'); - const connections = await seeders.createConnectionSeed(env, 'test-replace'); + const connections = await seeders.createConnectionSeed({ env, provider: 'test-replace' }); const { connection_id, provider_config_key } = connections; diff --git a/packages/server/lib/controllers/connection/getConnections.integration.test.ts b/packages/server/lib/controllers/connection/getConnections.integration.test.ts index f99f0378be6..b55487561d4 100644 --- a/packages/server/lib/controllers/connection/getConnections.integration.test.ts +++ b/packages/server/lib/controllers/connection/getConnections.integration.test.ts @@ -41,7 +41,7 @@ describe(`GET ${endpoint}`, () => { it('should list one connection', async () => { const { env } = await seeders.seedAccountEnvAndUser(); await seeders.createConfigSeed(env, 'github', 'github'); - const conn = await seeders.createConnectionSeed(env, 'github'); + const conn = await seeders.createConnectionSeed({ env, provider: 'github' }); const res = await api.fetch(endpoint, { method: 'GET', @@ -69,8 +69,8 @@ describe(`GET ${endpoint}`, () => { it('should search connections', async () => { const { env } = await seeders.seedAccountEnvAndUser(); await seeders.createConfigSeed(env, 'github', 'github'); - await seeders.createConnectionSeed(env, 'github'); - const conn2 = await seeders.createConnectionSeed(env, 'github'); + await seeders.createConnectionSeed({ env, provider: 'github' }); + const conn2 = await seeders.createConnectionSeed({ env, provider: 'github' }); const res = await api.fetch(endpoint, { method: 'GET', @@ -91,7 +91,7 @@ describe(`GET ${endpoint}`, () => { const { env, account } = await seeders.seedAccountEnvAndUser(); await seeders.createConfigSeed(env, 'github', 'github'); const endUser = await seeders.createEndUser({ environment: env, account }); - const conn = await seeders.createConnectionSeed(env, 'github', endUser); + const conn = await seeders.createConnectionSeed({ env, provider: 'github', endUser }); const res = await api.fetch(endpoint, { method: 'GET', @@ -120,7 +120,7 @@ describe(`GET ${endpoint}`, () => { const { env, account } = await seeders.seedAccountEnvAndUser(); await seeders.createConfigSeed(env, 'github', 'github'); const endUser = await seeders.createEndUser({ environment: env, account }); - await seeders.createConnectionSeed(env, 'github', endUser); + await seeders.createConnectionSeed({ env, provider: 'github', endUser }); const res = await api.fetch(endpoint, { method: 'GET', @@ -140,7 +140,7 @@ describe(`GET ${endpoint}`, () => { const { env, account } = await seeders.seedAccountEnvAndUser(); await seeders.createConfigSeed(env, 'github', 'github'); const endUser = await seeders.createEndUser({ environment: env, account }); - const conn = await seeders.createConnectionSeed(env, 'github', endUser); + const conn = await seeders.createConnectionSeed({ env, provider: 'github', endUser }); const res = await api.fetch(endpoint, { method: 'GET', @@ -160,7 +160,7 @@ describe(`GET ${endpoint}`, () => { const { env, account } = await seeders.seedAccountEnvAndUser(); await seeders.createConfigSeed(env, 'github', 'github'); const endUser = await seeders.createEndUser({ environment: env, account }); - const conn = await seeders.createConnectionSeed(env, 'github', endUser); + const conn = await seeders.createConnectionSeed({ env, provider: 'github', endUser }); const res = await api.fetch(endpoint, { method: 'GET', diff --git a/packages/server/lib/controllers/v1/flows/id/patchDisable.ts b/packages/server/lib/controllers/v1/flows/id/patchDisable.ts index a4320a18018..55aff572906 100644 --- a/packages/server/lib/controllers/v1/flows/id/patchDisable.ts +++ b/packages/server/lib/controllers/v1/flows/id/patchDisable.ts @@ -3,7 +3,7 @@ import { asyncWrapper } from '../../../../utils/asyncWrapper.js'; import type { PatchFlowDisable } from '@nangohq/types'; import { requireEmptyQuery, zodErrorToHTTP } from '@nangohq/utils'; import { flowConfig } from '../../../sync/deploy/validation.js'; -import { configService, disableScriptConfig } from '@nangohq/shared'; +import { configService, disableScriptConfig, errorNotificationService } from '@nangohq/shared'; import { providerConfigKeySchema, providerSchema, scriptNameSchema } from '../../../../helpers/validation.js'; export const validationBody = z @@ -53,6 +53,7 @@ export const patchFlowDisable = asyncWrapper(async (req, res) } const updated = await disableScriptConfig({ id: valParams.data.id, environmentId: environment.id }); + await errorNotificationService.sync.clearBySyncConfig({ sync_config_id: valParams.data.id }); if (updated > 0) { res.status(200).send({ data: { success: true } }); diff --git a/packages/server/lib/controllers/v1/integrations/providerConfigKey/flows/getFlows.integration.test.ts b/packages/server/lib/controllers/v1/integrations/providerConfigKey/flows/getFlows.integration.test.ts index bff76ea875b..70c33148576 100644 --- a/packages/server/lib/controllers/v1/integrations/providerConfigKey/flows/getFlows.integration.test.ts +++ b/packages/server/lib/controllers/v1/integrations/providerConfigKey/flows/getFlows.integration.test.ts @@ -84,7 +84,7 @@ describe(`GET ${route}`, () => { it('should create same template and deduplicate correctly', async () => { const { env } = await seeders.seedAccountEnvAndUser(); const config = await seeders.createConfigSeed(env, 'github', 'github'); - const connection = await seeders.createConnectionSeed(env, 'github'); + const connection = await seeders.createConnectionSeed({ env, provider: 'github' }); await seeders.createSyncSeeds({ connectionId: connection.id!, diff --git a/packages/server/lib/webhook/hubspot-webhook-routing.unit.test.ts b/packages/server/lib/webhook/hubspot-webhook-routing.unit.test.ts index e0b314bf03a..cb830672e0d 100644 --- a/packages/server/lib/webhook/hubspot-webhook-routing.unit.test.ts +++ b/packages/server/lib/webhook/hubspot-webhook-routing.unit.test.ts @@ -100,7 +100,7 @@ describe('Webhook route unit tests', () => { expect(nangoMock.executeScriptForWebhooks).toHaveBeenCalledTimes(body.length); - const firstCallFirstArgument = nangoMock.executeScriptForWebhooks.mock.calls[0][1]; + const firstCallFirstArgument = nangoMock.executeScriptForWebhooks.mock.calls[0]?.[1]; expect(firstCallFirstArgument.eventId).toBe(4023112300); }); @@ -153,9 +153,9 @@ describe('Webhook route unit tests', () => { expect(nangoMock.executeScriptForWebhooks).toHaveBeenCalledTimes(body.length); - const firstCallFirstArgument = nangoMock.executeScriptForWebhooks.mock.calls[0][1]; + const firstCallFirstArgument = nangoMock.executeScriptForWebhooks.mock.calls[0]?.[1]; expect(firstCallFirstArgument.eventId).toBe(1234); - const secondCallFirstArgument = nangoMock.executeScriptForWebhooks.mock.calls[1][1]; + const secondCallFirstArgument = nangoMock.executeScriptForWebhooks.mock.calls[1]?.[1]; expect(secondCallFirstArgument.eventId).toBe(123); }); }); diff --git a/packages/server/package.json b/packages/server/package.json index ba0292e229a..da0a56d7970 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -85,6 +85,6 @@ "nodemon": "3.1.7", "type-fest": "4.26.1", "typescript": "5.3.3", - "vitest": "1.6.0" + "vitest": "2.1.8" } } diff --git a/packages/shared/flows.yaml b/packages/shared/flows.yaml index b541d9c3304..43cfcdc7ebb 100644 --- a/packages/shared/flows.yaml +++ b/packages/shared/flows.yaml @@ -116,6 +116,14 @@ integrations: scopes: - schema.bases:read actions: + whoami: + description: Fetch current user information + output: UserInformation + endpoint: + method: GET + path: /whoami + group: Users + scopes: user.email:read create-webhook: description: Create a webhook for a particular base input: CreateWebhook @@ -220,6 +228,9 @@ integrations: DeleteWebhook: baseId: string webhookId: string + UserInformation: + id: string + email: string | null algolia: actions: create-contacts: @@ -2164,6 +2175,13 @@ integrations: input: IdEntity scopes: - admin + whoami: + description: Fetch current user information + output: UserInformation + endpoint: + method: GET + path: /whoami + group: Users models: IdEntity: id: string @@ -2176,6 +2194,9 @@ integrations: lastName: string CreateUser: email: string + UserInformation: + id: string + email: string Event: id: string uri: string @@ -2720,6 +2741,56 @@ integrations: license?: string officeId?: string autoAssign?: boolean + dialpad-sandbox: + syncs: + users: + runs: every day + description: Fetches a list of users from Dialpad + output: User + track_deletes: true + sync_type: full + endpoint: + method: GET + path: /users + group: Users + actions: + create-user: + description: Creates a user in Dialpad + output: User + endpoint: + method: POST + path: /users + group: Users + input: DialpadCreateUser + delete-user: + description: Deletes a user in Dialpad by email + endpoint: + method: DELETE + path: /users/email + group: Users + output: SuccessResponse + input: IdEntity + models: + IdEntity: + id: string + SuccessResponse: + success: boolean + User: + id: string + email: string + firstName: string + lastName: string + CreateUser: + firstName: string + lastName: string + email: string + DialpadCreateUser: + firstName: string + lastName: string + email: string + license?: string + officeId?: string + autoAssign?: boolean discourse: syncs: active-users: @@ -5219,6 +5290,13 @@ integrations: - oauth - settings.currencies.read actions: + whoami: + description: Fetch current user information + output: UserInformation + endpoint: + method: GET + path: /whoami + group: Users fetch-properties: description: Fetch the properties of a specified object input: InputProperty @@ -5644,6 +5722,9 @@ integrations: roleIds: string[] secondaryTeamIds: string[] superAdmin: boolean + UserInformation: + id: number + email: string HubspotKnowledgeBase: id: string title: string @@ -9076,6 +9157,7 @@ integrations: group: Issues scopes: - issues:create + version: 1.0.0 syncs: issues: runs: every 5min @@ -12077,6 +12159,13 @@ integrations: path: /opportunities group: Opportunities version: 1.0.0 + whoami: + description: Fetch current user information + output: UserInformation + endpoint: + method: GET + path: /whoami + group: Users syncs: accounts: runs: every hour @@ -12176,6 +12265,9 @@ integrations: salutation: string | null title: string | null last_modified_date: string + UserInformation: + id: string + email: string CommonContactInput: first_name?: string | undefined account_id?: string | undefined @@ -12563,6 +12655,13 @@ integrations: path: /opportunities group: Opportunities version: 1.0.0 + whoami: + description: Fetch current user information + output: UserInformation + endpoint: + method: GET + path: /whoami + group: Users syncs: accounts: runs: every hour @@ -12662,6 +12761,9 @@ integrations: salutation: string | null title: string | null last_modified_date: string + UserInformation: + id: string + email: string CommonContactInput: first_name?: string | undefined account_id?: string | undefined @@ -13205,6 +13307,260 @@ integrations: warning?: string | undefined error?: string | undefined raw_json: string + stripe-app: + syncs: + subscriptions: + description: Fetches a list of subscriptions + runs: every 2h + endpoint: + method: GET + path: /subscriptions + group: Subscriptions + output: Subscription + sync_type: full + track_deletes: true + scopes: + - subscription_read + models: + Subscription: + id: string + automatic_tax: + enabled: boolean + liability: boolean | string | null + disabled_reason: string | null + billing_cycle_anchor: number + billing_thresholds: string | null + cancel_at: string | null + cancel_at_period_end: boolean + canceled_at: string | null + cancellation_details: CancellationDetails + collection_method: string + created: number + currency: string + current_period_end: number + current_period_start: number + customer: string + days_until_due: number | null + default_payment_method: string | null + description: string | null + discount: string | null + discounts: string[] | null + ended_at: string | null + invoice_settings: InvoiceSettings + items: Item[] + latest_invoice: string + livemode: boolean + next_pending_invoice_item_invoice: string | null + on_behalf_of: string | null + pause_collection: string | null + payment_settings: PaymentSettings + pending_invoice_item_interval: string | null + pending_setup_intent: string | null + schedule: string | null + start_date: number + status: string + transfer_data: string | null + trial_end: string | null + trial_settings: TrialSettings + trial_start: string | null + Item: + id: string + billing_thresholds: string | null + created: number + plan: Plan + price: Price + quantity: number + subscription: string + tax_rates: string[] + Plan: + id: string + object: string + active: boolean + aggregate_usage: any + amount: number + amount_decimal: string + billing_scheme: string + created: number + currency: string + discounts: any + interval: string + interval_count: number + livemode: boolean + nickname: any + product: string + tiers_mode: any + transform_usage: any + trial_period_days: any + usage_type: string + Recurring: + aggregate_usage: any + interval: string + interval_count: number + trial_period_days: any + usage_type: string + Price: + id: string + object: string + active: boolean + billing_scheme: string + created: number + currency: string + custom_unit_amount: any + livemode: boolean + lookup_key: any + nickname: any + product: string + recurring: Recurring + tax_behavior: string + tiers_mode: any + transform_quantity: any + type: string + unit_amount: number + unit_amount_decimal: string + CancellationDetails: + comment: string | null + feedback: string | null + reason: string | null + InvoiceSettings: + issuer: Issuer + account_tax_ids: null | string | string[] + Issuer: + type: string + PaymentSettings: + payment_method_options: string | null + payment_method_types: string | null + save_default_payment_method: string + TrialSettings: + end_behavior: EndBehavior + EndBehavior: + missing_payment_method: string + stripe-app-sandbox: + syncs: + subscriptions: + description: Fetches a list of subscriptions + runs: every 2h + endpoint: + method: GET + path: /subscriptions + group: Subscriptions + output: Subscription + sync_type: full + track_deletes: true + scopes: + - subscription_read + models: + Subscription: + id: string + automatic_tax: + enabled: boolean + liability: boolean | string | null + disabled_reason: string | null + billing_cycle_anchor: number + billing_thresholds: string | null + cancel_at: string | null + cancel_at_period_end: boolean + canceled_at: string | null + cancellation_details: CancellationDetails + collection_method: string + created: number + currency: string + current_period_end: number + current_period_start: number + customer: string + days_until_due: number | null + default_payment_method: string | null + description: string | null + discount: string | null + discounts: string[] | null + ended_at: string | null + invoice_settings: InvoiceSettings + items: Item[] + latest_invoice: string + livemode: boolean + next_pending_invoice_item_invoice: string | null + on_behalf_of: string | null + pause_collection: string | null + payment_settings: PaymentSettings + pending_invoice_item_interval: string | null + pending_setup_intent: string | null + schedule: string | null + start_date: number + status: string + transfer_data: string | null + trial_end: string | null + trial_settings: TrialSettings + trial_start: string | null + Item: + id: string + billing_thresholds: string | null + created: number + plan: Plan + price: Price + quantity: number + subscription: string + tax_rates: string[] + Plan: + id: string + object: string + active: boolean + aggregate_usage: any + amount: number + amount_decimal: string + billing_scheme: string + created: number + currency: string + discounts: any + interval: string + interval_count: number + livemode: boolean + nickname: any + product: string + tiers_mode: any + transform_usage: any + trial_period_days: any + usage_type: string + Recurring: + aggregate_usage: any + interval: string + interval_count: number + trial_period_days: any + usage_type: string + Price: + id: string + object: string + active: boolean + billing_scheme: string + created: number + currency: string + custom_unit_amount: any + livemode: boolean + lookup_key: any + nickname: any + product: string + recurring: Recurring + tax_behavior: string + tiers_mode: any + transform_quantity: any + type: string + unit_amount: number + unit_amount_decimal: string + CancellationDetails: + comment: string | null + feedback: string | null + reason: string | null + InvoiceSettings: + issuer: Issuer + account_tax_ids: null | string | string[] + Issuer: + type: string + PaymentSettings: + payment_method_options: string | null + payment_method_types: string | null + save_default_payment_method: string + TrialSettings: + end_behavior: EndBehavior + EndBehavior: + missing_payment_method: string teamtailor: syncs: candidates: @@ -13878,6 +14234,73 @@ integrations: Attachment: name: string data: string + workday: + syncs: + employees: + runs: every hour + track_deletes: true + sync_type: full + output: Employee + description: Fetches Employees + endpoint: + method: GET + path: /employees + group: Employees + groups: + runs: every hour + track_deletes: true + sync_type: full + output: Group + description: Fetches Company groups + endpoint: + method: GET + path: /groups + group: Groups + locations: + runs: every hour + track_deletes: true + sync_type: full + output: Location + description: Fetches Company locations + endpoint: + method: GET + path: /locations + group: Locations + models: + Employee: + id: string + user_name: string | null + first_name?: string + last_name?: string + email: string + role: string + department: string + site: string + country?: string | null + external_id?: string + employment_relationship?: string + phone_number: string | null + Group: + id: string + active: boolean + created_at: string | null + name: string + Location: + id: string + name: string + description: string | null + city: string | null + state: CompanyLocationState | null + country: + name: string + iso_code: string + zip_code: string + address: string + phone_number: string | null + CompanyLocationState: + name: string + abbrev: string + iso_code: string xero: syncs: contacts: @@ -13946,7 +14369,7 @@ integrations: endpoint: method: GET path: /general-ledger - group: GeneralLedger + group: General Ledger scopes: - accounting.journals.read payments: @@ -14367,13 +14790,19 @@ integrations: accountId: string accountCode: string accountName: string - description: string + description?: string | undefined netAmount: number grossAmount: number taxAmount: number - taxType: string - taxName: string - trackingCategories: string[] + taxType?: string | undefined + taxName?: string | undefined + trackingCategories: TrackingCategory[] + TrackingCategory: + name: string + option: string + trackingCategoryId: string + trackingOptionId: string + options: string[] zendesk: syncs: tickets: @@ -15081,6 +15510,15 @@ integrations: scopes: - user:write - user:write:admin + whoami: + description: Fetch current user information + output: UserInformation + endpoint: + method: GET + path: /whoami + group: Users + scopes: + - user:read:user delete-user: description: Deletes a user in Zoom. Requires Pro account or higher endpoint: @@ -15180,6 +15618,9 @@ integrations: firstName: string lastName: string email: string + UserInformation: + id: string + email: string Meeting: id: string topic: string diff --git a/packages/shared/lib/models/Sync.ts b/packages/shared/lib/models/Sync.ts index 79b6b114494..ac61a31f6de 100644 --- a/packages/shared/lib/models/Sync.ts +++ b/packages/shared/lib/models/Sync.ts @@ -26,6 +26,8 @@ export interface SyncResult { export type SyncResultByModel = Record; +export type SyncWithConnectionId = Sync & { connection_id: string }; + export interface Sync extends TimestampsAndDeleted { id: string; nango_connection_id: number; @@ -60,6 +62,7 @@ export interface ReportedSyncJobStatus { id?: string; type: SyncType | 'INITIAL'; name?: string; + connection_id?: string; status: SyncStatus; latestResult?: SyncResultByModel | undefined; jobStatus?: SyncStatus; diff --git a/packages/shared/lib/seeders/account.seeder.ts b/packages/shared/lib/seeders/account.seeder.ts index 867d18aa503..38dcbcec4f9 100644 --- a/packages/shared/lib/seeders/account.seeder.ts +++ b/packages/shared/lib/seeders/account.seeder.ts @@ -3,7 +3,7 @@ import accountService from '../services/account.service.js'; import type { DBTeam } from '@nangohq/types'; export async function createAccount(): Promise { - const acc = await accountService.getOrCreateAccount(uuid()); + const acc = await accountService.createAccountWithoutEnvironments(uuid()); if (!acc) { throw new Error('failed_to_create_account'); } diff --git a/packages/shared/lib/seeders/connection.seeder.ts b/packages/shared/lib/seeders/connection.seeder.ts index c91d812d80c..68f07448ce5 100644 --- a/packages/shared/lib/seeders/connection.seeder.ts +++ b/packages/shared/lib/seeders/connection.seeder.ts @@ -2,7 +2,7 @@ import db from '@nangohq/database'; import connectionService from '../services/connection.service.js'; import type { NangoConnection } from '../models/Connection.js'; import type { AuthCredentials } from '../models/Auth.js'; -import type { DBEnvironment, EndUser } from '@nangohq/types'; +import type { ConnectionConfig, DBEnvironment, EndUser } from '@nangohq/types'; import { linkConnection } from '../services/endUser.service.js'; export const createConnectionSeeds = async (env: DBEnvironment): Promise => { @@ -19,40 +19,52 @@ export const createConnectionSeeds = async (env: DBEnvironment): Promise res.connection.id!)); + + for (const res of result) { + if (!res.connection.id) { + throw new Error('Could not create connection seed'); + } + + connectionIds.push(res.connection.id); + } } return connectionIds; }; -export const createConnectionSeed = async ( - env: DBEnvironment, - provider: string, - endUser?: EndUser, - rest?: { - connectionId?: string; - rawCredentials?: AuthCredentials; - connectionConfig?: any; - } -): Promise => { - const name = rest?.connectionId ? rest.connectionId : Math.random().toString(36).substring(7); +export const createConnectionSeed = async ({ + env, + provider, + endUser, + connectionId, + rawCredentials, + connectionConfig +}: { + env: DBEnvironment; + provider: string; + endUser?: EndUser; + connectionId?: string; + rawCredentials?: AuthCredentials; + connectionConfig?: ConnectionConfig; +}): Promise => { + const name = connectionId ? connectionId : Math.random().toString(36).substring(7); const result = await connectionService.upsertConnection({ connectionId: name, providerConfigKey: provider, provider: provider, - parsedRawCredentials: rest?.rawCredentials || ({} as AuthCredentials), - connectionConfig: rest?.connectionConfig || {}, + parsedRawCredentials: rawCredentials || ({} as AuthCredentials), + connectionConfig: connectionConfig || {}, environmentId: env.id, accountId: 0 }); - if (!result || result[0] === undefined) { + if (!result || result[0] === undefined || !result[0].connection.id) { throw new Error('Could not create connection seed'); } if (endUser) { await linkConnection(db.knex, { endUserId: endUser.id, connection: result[0].connection }); } - return { id: result[0].connection.id!, connection_id: name, provider_config_key: provider, environment_id: env.id }; + return { id: result[0].connection.id, connection_id: name, provider_config_key: provider, environment_id: env.id }; }; export const deleteAllConnectionSeeds = async (): Promise => { diff --git a/packages/shared/lib/services/account.service.ts b/packages/shared/lib/services/account.service.ts index 78b2543959a..e38f2c8b9fd 100644 --- a/packages/shared/lib/services/account.service.ts +++ b/packages/shared/lib/services/account.service.ts @@ -70,6 +70,7 @@ class AccountService { if (!newAccount || newAccount.length == 0 || !newAccount[0]) { throw new Error('Failed to create account'); } + await environmentService.createDefaultEnvironments(newAccount[0]['id']); return newAccount[0]; @@ -94,6 +95,15 @@ class AccountService { return null; } + /** + * Create Account without default environments + * @desc create a new account and assign to the default environments + */ + async createAccountWithoutEnvironments(name: string): Promise { + const result = await db.knex.from(`_nango_accounts`).insert({ name }).returning('*'); + return result[0] || null; + } + async editCustomer(is_capped: boolean, accountId: number): Promise { await db.knex.update({ is_capped }).from(`_nango_accounts`).where({ id: accountId }); } diff --git a/packages/shared/lib/services/connection.service.integration.test.ts b/packages/shared/lib/services/connection.service.integration.test.ts index b90b39c314b..0df0fffe3c3 100644 --- a/packages/shared/lib/services/connection.service.integration.test.ts +++ b/packages/shared/lib/services/connection.service.integration.test.ts @@ -79,8 +79,8 @@ describe('Connection service integration tests', () => { await createConfigSeed(env, 'google', 'google'); await createConfigSeed(env, 'notion', 'notion'); - const google = await createConnectionSeed(env, 'google'); - const notion = await createConnectionSeed(env, 'notion'); + const google = await createConnectionSeed({ env, provider: 'google' }); + const notion = await createConnectionSeed({ env, provider: 'notion' }); const dbConnections = await connectionService.listConnections({ environmentId: env.id @@ -96,10 +96,10 @@ describe('Connection service integration tests', () => { await createConfigSeed(env, 'google', 'google'); await createConfigSeed(env, 'notion', 'notion'); - const google = await createConnectionSeed(env, 'google'); - const notion = await createConnectionSeed(env, 'notion'); - await createConnectionSeed(env, 'notion'); - await createConnectionSeed(env, 'notion'); + const google = await createConnectionSeed({ env, provider: 'google' }); + const notion = await createConnectionSeed({ env, provider: 'notion' }); + await createConnectionSeed({ env, provider: 'notion' }); + await createConnectionSeed({ env, provider: 'notion' }); const dbConnections = await connectionService.listConnections({ environmentId: env.id, @@ -116,8 +116,8 @@ describe('Connection service integration tests', () => { await createConfigSeed(env, 'google', 'google'); await createConfigSeed(env, 'notion', 'notion'); - const google = await createConnectionSeed(env, 'google'); - await createConnectionSeed(env, 'notion'); + const google = await createConnectionSeed({ env, provider: 'google' }); + await createConnectionSeed({ env, provider: 'notion' }); const dbConnections = await connectionService.listConnections({ environmentId: env.id, @@ -133,8 +133,8 @@ describe('Connection service integration tests', () => { await createConfigSeed(env, 'notion', 'notion'); - const notion = await createConnectionSeed(env, 'notion'); - await createConnectionSeed(env, 'notion'); + const notion = await createConnectionSeed({ env, provider: 'notion' }); + await createConnectionSeed({ env, provider: 'notion' }); const dbConnections = await connectionService.listConnections({ environmentId: env.id, @@ -150,8 +150,8 @@ describe('Connection service integration tests', () => { await createConfigSeed(env, 'notion', 'notion'); - const notion = await createConnectionSeed(env, 'notion'); - await createConnectionSeed(env, 'notion'); + const notion = await createConnectionSeed({ env, provider: 'notion' }); + await createConnectionSeed({ env, provider: 'notion' }); const dbConnections = await connectionService.listConnections({ environmentId: env.id, @@ -167,7 +167,7 @@ describe('Connection service integration tests', () => { await createConfigSeed(env, 'notion', 'notion'); - const notionError = await createConnectionSeed(env, 'notion'); + const notionError = await createConnectionSeed({ env, provider: 'notion' }); await errorNotificationService.auth.create({ type: 'auth', action: 'connection_test', @@ -175,7 +175,7 @@ describe('Connection service integration tests', () => { log_id: Math.random().toString(36).substring(7), active: true }); - await createConnectionSeed(env, 'notion'); + await createConnectionSeed({ env, provider: 'notion' }); const dbConnections = await connectionService.listConnections({ environmentId: env.id, @@ -191,7 +191,7 @@ describe('Connection service integration tests', () => { await createConfigSeed(env, 'notion', 'notion'); - const notionError = await createConnectionSeed(env, 'notion'); + const notionError = await createConnectionSeed({ env, provider: 'notion' }); await errorNotificationService.auth.create({ type: 'auth', action: 'connection_test', @@ -199,7 +199,7 @@ describe('Connection service integration tests', () => { log_id: Math.random().toString(36).substring(7), active: true }); - const notionOK = await createConnectionSeed(env, 'notion'); + const notionOK = await createConnectionSeed({ env, provider: 'notion' }); const dbConnections = await connectionService.listConnections({ environmentId: env.id, @@ -217,9 +217,9 @@ describe('Connection service integration tests', () => { const config = await createConfigSeed(env, 'notion', 'notion'); - await createConnectionSeed(env, 'notion'); + await createConnectionSeed({ env, provider: 'notion' }); - const notionAuthError = await createConnectionSeed(env, 'notion'); + const notionAuthError = await createConnectionSeed({ env, provider: 'notion' }); await errorNotificationService.auth.create({ type: 'auth', action: 'connection_test', @@ -228,7 +228,7 @@ describe('Connection service integration tests', () => { active: true }); - const notionSyncError = await createConnectionSeed(env, 'notion'); + const notionSyncError = await createConnectionSeed({ env, provider: 'notion' }); const sync = await createSyncSeeds({ connectionId: notionSyncError.id!, environment_id: env.id, diff --git a/packages/shared/lib/services/file/remote.service.ts b/packages/shared/lib/services/file/remote.service.ts index 0e5eb8bfd3b..6998b4871cc 100644 --- a/packages/shared/lib/services/file/remote.service.ts +++ b/packages/shared/lib/services/file/remote.service.ts @@ -117,6 +117,10 @@ class RemoteFileService { } } + async getPublicTemplateJsonSchemaFile(integrationName: string, environmentId: number): Promise { + return this.getFile(`${this.publicRoute}/${integrationName}/.nango/schema.json`, environmentId); + } + getFile(fileName: string, environmentId: number): Promise { return new Promise((resolve, reject) => { const getObjectCommand = new GetObjectCommand({ diff --git a/packages/shared/lib/services/notification/error.service.ts b/packages/shared/lib/services/notification/error.service.ts index 0a64a793821..6e9258ff21a 100644 --- a/packages/shared/lib/services/notification/error.service.ts +++ b/packages/shared/lib/services/notification/error.service.ts @@ -6,6 +6,7 @@ import type { Result } from '@nangohq/utils'; import db from '@nangohq/database'; const DB_TABLE = '_nango_active_logs'; +const SYNC_TABLE = '_nango_syncs'; type ErrorNotification = Required>; type SyncErrorNotification = ErrorNotification & Required>; @@ -76,6 +77,21 @@ export const errorNotificationService = { }, clearBySyncId: async ({ sync_id }: Pick): Promise => { await db.knex.from(DB_TABLE).where({ type: 'sync', sync_id }).delete(); + }, + /** + * Clear By Sync Config Id + * @description Clear all sync notifications by sync config id. This is used + * when disabling a sync at the integration level. Any active logs are + * no longer relevant because the sync is disabled. + */ + clearBySyncConfig: async ({ sync_config_id }: { sync_config_id: number }): Promise => { + const query = db.knex + .from(DB_TABLE) + .join(SYNC_TABLE, `${SYNC_TABLE}.id`, '=', `${DB_TABLE}.sync_id`) + .where({ type: 'sync', active: true }) + .andWhere({ [`${SYNC_TABLE}.sync_config_id`]: sync_config_id, [`${SYNC_TABLE}.deleted`]: false }); + + await query.delete(); } } }; diff --git a/packages/shared/lib/services/notification/slack.service.ts b/packages/shared/lib/services/notification/slack.service.ts index ad642461c34..54a5d9e1c59 100644 --- a/packages/shared/lib/services/notification/slack.service.ts +++ b/packages/shared/lib/services/notification/slack.service.ts @@ -596,7 +596,7 @@ export class SlackService { environment_id: number; provider: string; }): Promise { - await db.knex.transaction(async (trx) => { + const update = await db.knex.transaction(async (trx) => { const slackNotificationsEnabled = await environmentService.getSlackNotificationsEnabled(nangoConnection.environment_id); if (!slackNotificationsEnabled) { return; @@ -638,7 +638,15 @@ export class SlackService { connection_list, updated_at: new Date() }); + return { + id, + slackTimestamp: slack_timestamp, + adminSlackTimestamp: admin_slack_timestamp, + connectionCount: connection_list.length + }; + }); + if (update) { // we report resolution to the slack channel which could be either // 1) The slack notification is resolved, connection_list === 0 // 2) The list of failing connections has been decremented @@ -649,11 +657,11 @@ export class SlackService { originalActivityLogId, environment_id, provider, - slack_timestamp as string, - admin_slack_timestamp as string, - connection_list.length + update.slackTimestamp as string, + update.adminSlackTimestamp as string, + update.connectionCount ); - }); + } } async closeAllOpenNotificationsForEnv(environment_id: number): Promise { diff --git a/packages/shared/lib/services/sync/config/deploy.service.ts b/packages/shared/lib/services/sync/config/deploy.service.ts index b82cb80507a..1465fc1e86f 100644 --- a/packages/shared/lib/services/sync/config/deploy.service.ts +++ b/packages/shared/lib/services/sync/config/deploy.service.ts @@ -416,6 +416,8 @@ export async function deployPreBuilt({ let provider_config_key: string; // this is a public template so copy it from the public location + // We might not want to do this as it just overrides the root nango.yaml + // which means we overwrite any custom nango.yaml that the user has await remoteFileService.copy( firstConfig.public_route, nangoConfigFile, @@ -522,6 +524,12 @@ export async function deployPreBuilt({ throw new NangoError('file_upload_error'); } + const flowJsonSchema: JSONSchema7 = { + definitions: {} + }; + + const flowModels = Array.isArray(models) ? models : [models]; + if (is_public) { await remoteFileService.copy( config.public_route, @@ -530,6 +538,21 @@ export async function deployPreBuilt({ environment.id, `${sync_name}.ts` ); + // fetch the json schema so we have type checking + const jsonSchema = await remoteFileService.getPublicTemplateJsonSchemaFile(firstConfig.public_route, environment.id); + + if (jsonSchema) { + const parsedJsonSchema = JSON.parse(jsonSchema); + for (const model of flowModels) { + const schema = parsedJsonSchema.definitions![model]; + if (!schema) { + const error = new NangoError('deploy_missing_json_schema_model', `json_schema doesn't contain model "${model}"`); + + return { success: false, error, response: null }; + } + flowJsonSchema.definitions![model] = schema; + } + } } else { if (typeof config.fileBody === 'object' && config.fileBody.ts) { await remoteFileService.upload( @@ -565,7 +588,7 @@ export async function deployPreBuilt({ nango_config_id, file_location, version, - models: Array.isArray(models) ? models : [models], + models: flowModels, active: true, runs, input: input && typeof input !== 'string' ? String(input.name) : input, @@ -581,6 +604,7 @@ export async function deployPreBuilt({ is_public, enabled: true, webhook_subscriptions: null, + models_json_schema: flowJsonSchema, updated_at: new Date() }; diff --git a/packages/shared/lib/services/sync/manager.service.ts b/packages/shared/lib/services/sync/manager.service.ts index c1f07c6d4ed..a05a49995c0 100644 --- a/packages/shared/lib/services/sync/manager.service.ts +++ b/packages/shared/lib/services/sync/manager.service.ts @@ -13,7 +13,7 @@ import { import { errorNotificationService } from '../notification/error.service.js'; import configService from '../config.service.js'; import type { Connection, NangoConnection } from '../../models/Connection.js'; -import type { Sync, ReportedSyncJobStatus, SyncCommand } from '../../models/Sync.js'; +import type { SyncWithConnectionId, ReportedSyncJobStatus, SyncCommand } from '../../models/Sync.js'; import { SyncType, SyncStatus } from '../../models/Sync.js'; import { NangoError } from '../../utils/error.js'; import type { Config as ProviderConfig } from '../../models/Provider.js'; @@ -334,12 +334,24 @@ export class SyncManagerService { continue; } - const reportedStatus = await this.syncStatus({ sync, environmentId, providerConfigKey, includeJobStatus, orchestrator, recordsService }); + const syncWithConnectionId: SyncWithConnectionId = { + ...sync, + connection_id: connection.connection_id + }; + + const reportedStatus = await this.syncStatus({ + sync: syncWithConnectionId, + environmentId, + providerConfigKey, + includeJobStatus, + orchestrator, + recordsService + }); syncsWithStatus.push(reportedStatus); } } else { - const syncs = + const syncs: SyncWithConnectionId[] = syncNames.length > 0 ? await getSyncsByProviderConfigAndSyncNames(environmentId, providerConfigKey, syncNames) : await getSyncsByProviderConfigKey(environmentId, providerConfigKey); @@ -421,7 +433,7 @@ export class SyncManagerService { orchestrator, recordsService }: { - sync: Sync; + sync: SyncWithConnectionId; environmentId: number; providerConfigKey: string; includeJobStatus: boolean; @@ -458,6 +470,7 @@ export class SyncManagerService { return { id: sync.id, + connection_id: sync.connection_id, type: latestJob?.type === SyncType.INCREMENTAL ? latestJob.type : 'INITIAL', finishedAt: latestJob?.updated_at, nextScheduledSyncAt: schedule.nextDueDate, diff --git a/packages/shared/lib/services/sync/sync.service.ts b/packages/shared/lib/services/sync/sync.service.ts index e8434f80b1e..7241ff72f76 100644 --- a/packages/shared/lib/services/sync/sync.service.ts +++ b/packages/shared/lib/services/sync/sync.service.ts @@ -1,6 +1,6 @@ import { v4 as uuidv4 } from 'uuid'; import db, { schema, dbNamespace } from '@nangohq/database'; -import type { Sync, SyncConfig, Job as SyncJob } from '../../models/Sync.js'; +import type { Sync, SyncWithConnectionId, SyncConfig, Job as SyncJob } from '../../models/Sync.js'; import { SyncStatus } from '../../models/Sync.js'; import type { Connection, NangoConnection } from '../../models/Connection.js'; import type { ActiveLog, IncomingFlowConfig, SlimAction, SlimSync, SyncAndActionDifferences, SyncTypeLiteral } from '@nangohq/types'; @@ -197,7 +197,8 @@ export const getSyncs = async ( this.on(`${SYNC_CONFIG_TABLE}.sync_name`, `${TABLE}.name`) .andOn(`${SYNC_CONFIG_TABLE}.deleted`, '=', db.knex.raw('FALSE')) .andOn(`${SYNC_CONFIG_TABLE}.active`, '=', db.knex.raw('TRUE')) - .andOn(`${SYNC_CONFIG_TABLE}.type`, '=', db.knex.raw('?', 'sync')); + .andOn(`${SYNC_CONFIG_TABLE}.type`, '=', db.knex.raw('?', 'sync')) + .andOn(`${SYNC_CONFIG_TABLE}.enabled`, '=', db.knex.raw('?', 'TRUE')); }) .where({ nango_connection_id: nangoConnection.id, @@ -241,8 +242,6 @@ export const getSyncsByConnectionId = async (nangoConnectionId: number): Promise return null; }; -type SyncWithConnectionId = Sync & { connection_id: string }; - export const getSyncsByProviderConfigKey = async (environment_id: number, providerConfigKey: string): Promise => { const results = await db.knex .select(`${TABLE}.*`, `${TABLE}.name`, `_nango_connections.connection_id`, `${TABLE}.created_at`, `${TABLE}.updated_at`, `${TABLE}.last_sync_date`) @@ -284,9 +283,13 @@ export const getSyncNamesByConnectionId = async (nangoConnectionId: number): Pro return []; }; -export const getSyncsByProviderConfigAndSyncNames = async (environment_id: number, providerConfigKey: string, syncNames: string[]): Promise => { +export const getSyncsByProviderConfigAndSyncNames = async ( + environment_id: number, + providerConfigKey: string, + syncNames: string[] +): Promise => { const results = await db.knex - .select(`${TABLE}.*`) + .select(`${TABLE}.*`, '_nango_connections.connection_id') .from(TABLE) .join('_nango_connections', '_nango_connections.id', `${TABLE}.nango_connection_id`) .where({ diff --git a/packages/shared/package.json b/packages/shared/package.json index f52158f3d54..baca3ab1b7e 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -69,7 +69,7 @@ "knex": "3.1.0", "type-fest": "4.26.1", "typescript": "^5.3.3", - "vitest": "1.6.0" + "vitest": "2.1.8" }, "files": [ "dist/**/*", diff --git a/packages/shared/providers.yaml b/packages/shared/providers.yaml index 5b5d463822d..1a78c728b2b 100644 --- a/packages/shared/providers.yaml +++ b/packages/shared/providers.yaml @@ -125,6 +125,9 @@ affinity: auth_mode: BASIC proxy: base_url: https://api.affinity.co + verification: + method: GET + endpoint: /lists docs: https://docs.nango.dev/integrations/all/affinity docs_connect: https://docs.nango.dev/integrations/all/affinity/connect credentials: @@ -138,6 +141,8 @@ affinity: type: string title: API Key description: Your Affinity API Key + # https://api-docs.affinity.co/#introduction + # Affinity is using basic auth with an api key doc_section: '#step-1-finding-your-api-key' aircall: @@ -288,13 +293,27 @@ anrok: doc_section: '#step-1-finding-your-api-key' amplitude: - display_name: Amplitude + display_name: Amplitude (Event Streaming API) categories: - analytics auth_mode: BASIC proxy: base_url: https://amplitude.com + verification: + method: GET + endpoint: /api/2/events/list docs: https://docs.nango.dev/integrations/all/amplitude + credentials: + username: + type: string + title: API Key + description: Your Amplitude API Key + password: + type: string + title: Secret Key + description: Your Amplitude secret key + # https://amplitude.com/docs/apis/authentication + # Amplitude is using basic auth with an api key anthropic: display_name: Anthropic @@ -353,6 +372,9 @@ apollo: auth_mode: API_KEY proxy: base_url: https://app.apollo.io/api + verification: + method: GET + endpoint: /v1/contact_stages query: api_key: ${apiKey} docs: https://docs.nango.dev/integrations/all/apollo @@ -428,6 +450,9 @@ asana-scim: auth_mode: API_KEY proxy: base_url: https://app.asana.com/api + verification: + method: GET + endpoint: /1.0/scim/Users headers: authorization: Bearer ${apiKey} docs: https://docs.nango.dev/integrations/all/asana @@ -560,12 +585,15 @@ avalara: username: type: string title: User Name / Account ID - description: Your User Name / Account ID + description: Avalara User Name / Account ID doc_section: '#step-1-finding-your-pair-keys' password: type: string - title: Password / License Key + title: Avalara Password / License Key description: Your Password / License Key + # https://developer.avalara.com/avatax/authentication-in-rest/ + # Avalara is using basic auth with combination of (username and password) + # or (Account ID and License Key) doc_section: '#step-1-finding-your-pair-keys' connection_config: avalaraClient: @@ -594,12 +622,15 @@ avalara-sandbox: username: type: string title: User Name / Account ID - description: Your User Name / Account ID + description: Avalara User Name / Account ID doc_section: '#step-1-finding-your-pair-keys' password: type: string title: Password / License Key - description: Your Password / License Key + description: Avalara Password / License Key + # https://developer.avalara.com/avatax/authentication-in-rest/ + # Avalara is using basic auth with combination of (username and password) + # or (Account ID and License Key) doc_section: '#step-1-finding-your-pair-keys' connection_config: avalaraClient: @@ -659,6 +690,9 @@ aws-iam: auth_mode: BASIC proxy: base_url: https://iam.amazonaws.com + verification: + method: GET + endpoint: /?Action=ListUsers connection_config: region: ${connectionConfig.region} retry: @@ -668,13 +702,15 @@ aws-iam: credentials: username: type: string - title: Access Key ID + title: AWS Access Key ID description: Your Access Key ID doc_section: '#step-1-finding-your-pair-keys' password: type: string - title: Secret Access Key + title: AWS Secret Access Key description: Your Secret Access Key + # https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html + # aws-iam is using basic auth with AWS Access Key ID and Secret Access Key doc_section: '#step-1-finding-your-pair-keys' connection_config: region: @@ -1239,6 +1275,30 @@ buildium: example: uOq2p+xlgpFdijfV/HqY+EvYpZKHRwlyhGuAVbJIxXs doc_section: '#step-2-finding-your-client-id-and-secret' +builtwith: + display_name: BuiltWith + categories: + - dev-tools + - analytics + - crm + - marketing + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://api.builtwith.com + query: + KEY: ${apiKey} + docs: https://docs.nango.dev/integrations/all/builtwith + docs_connect: https://docs.nango.dev/integrations/all/builtwith/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your BuiltWith account + example: 1bc32cba-a5d6-438a-bbcc-af312f560a3c + format: uuid + doc_section: '#step-1-finding-your-api-key' + cal-com-v1: display_name: Cal.com (v1) categories: @@ -1536,14 +1596,19 @@ chorus: auth_mode: API_KEY proxy: base_url: https://chorus.ai + verification: + method: GET + endpoint: /api/v1/users/me headers: authorization: Bearer ${apiKey} docs: https://docs.nango.dev/integrations/all/chorus + docs_connect: https://docs.nango.dev/integrations/all/chorus/connect credentials: apiKey: type: string title: API Key description: The API key for your Chorus account + doc_section: '#step-1-generating-your-chorus-api-key' circle-so: display_name: Circle.so @@ -1983,7 +2048,7 @@ datadog: - dev-tools auth_mode: API_KEY proxy: - base_url: https://${connectionConfig.siteParameter}/api + base_url: https://api.${connectionConfig.siteParameter}/api headers: dd-api-key: ${apiKey} dd-application-key: ${connectionConfig.applicationKey} @@ -2442,6 +2507,9 @@ evaluagent: auth_mode: BASIC proxy: base_url: https://${connectionConfig.region}.evaluagent.com + verification: + method: GET + endpoint: /v1/ping docs: https://docs.nango.dev/integrations/all/evaluagent connection_config: region: @@ -2778,31 +2846,39 @@ freshdesk: doc_section: '#step-2-finding-your-freshdesk-domain' freshsales: - display_name: FreshSales + display_name: Freshsales categories: - crm auth_mode: API_KEY proxy: base_url: https://${connectionConfig.subdomain}.freshsales.io + verification: + method: GET + endpoint: /api/settings/leads/fields headers: authorization: Token token=${apiKey} retry: after: 'retry-after' docs: https://docs.nango.dev/integrations/all/freshsales + docs_connect: https://docs.nango.dev/integrations/all/freshsales/connect connection_config: subdomain: type: string - title: FreshSales Domain - description: The subdomain of your FreshSales account + title: Freshsales subdomain + description: The subdomain of your Freshsales account pattern: '^[a-z0-9_-]+$' - example: domain + example: subdomain suffix: .freshsales.io prefix: https:// + doc_section: '#step-2-finding-your-freshsales-subdomain' credentials: apiKey: type: string title: API Key - description: The API key for your FreshSales account + description: The API key for your Freshsales account + example: 4oBqA_AzM_G3xbW3TJGvrA + pattern: '[A-Za-z0-9_]{22}' + doc_section: '#step-1-finding-your-freshsales-api-key' freshservice: display_name: FreshService @@ -2811,6 +2887,9 @@ freshservice: auth_mode: BASIC proxy: base_url: https://${connectionConfig.subdomain}.freshservice.com + verification: + method: GET + endpoint: /api/v2/tickets retry: after: 'retry-after' docs: https://docs.nango.dev/integrations/all/freshservice @@ -2889,7 +2968,7 @@ front: docs: https://docs.nango.dev/integrations/all/front gainsight-cc: - display_name: Gainsight + display_name: Gainsight CC categories: - support - crm @@ -2901,13 +2980,15 @@ gainsight-cc: proxy: base_url: https://api2-${connectionConfig.region}.insided.com docs: https://docs.nango.dev/integrations/all/gainsight-cc + docs_connect: https://docs.nango.dev/integrations/all/gainsight-cc/connect connection_config: region: type: string title: Region description: The region of your Gainsight account - example: eu - pattern: '^[a-z]+$' + example: eu-west-1 + pattern: '^[a-z]{2}-[a-z]+-[1-9]$' + doc_section: '#step-2-finding-your-region' garmin: display_name: Garmin @@ -2951,6 +3032,9 @@ guru: auth_mode: BASIC proxy: base_url: https://api.getguru.com/api/v1 + verification: + method: GET + endpoint: /whoami docs: https://docs.nango.dev/integrations/all/guru credentials: username: @@ -3180,6 +3264,34 @@ gong-oauth: format: uri pattern: '^https?://.*$' +gong-scim: + display_name: Gong (SCIM API) + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://app.gong.io/oauth2/authorize + token_url: https://app.gong.io/oauth2/generate-customer-token + token_response_metadata: + - api_base_url_for_customer + authorization_params: + response_type: code + access_type: offline + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + disable_pkce: true + token_request_auth_method: basic + proxy: + base_url: https://provisioning.gong.io/scim + retry: + after: 'retry-after' + headers: + accept: application/json + content-type: application/json + user-agent: custom-scim + docs: https://docs.nango.dev/integrations/all/gong + google: display_name: Google auth_mode: OAUTH2 @@ -3348,6 +3460,9 @@ grain-api-key: auth_mode: API_KEY proxy: base_url: https://api.grain.com + verification: + method: GET + endpoint: /_/public-api/me headers: authorization: Bearer ${apiKey} docs: https://docs.nango.dev/integrations/all/grain @@ -3483,12 +3598,17 @@ hackerrank-work: auth_mode: BASIC proxy: base_url: https://www.hackerrank.com + verification: + method: GET + endpoint: /x/api/v3/users?limit=10&offset=10 docs: https://docs.nango.dev/integrations/all/hackerrank-work + docs_connect: https://docs.nango.dev/integrations/all/hackerrank-work/connect credentials: username: type: string title: API Key description: Your HackerRank Work API Key + doc_section: '#step-1-finding-hackerrank-api-key' password: type: string title: '' @@ -3841,13 +3961,18 @@ helpscout-docs: retry: after: 'x-ratelimit-reset' base_url: https://docsapi.helpscout.net + verification: + method: GET + endpoint: /v1/sites docs: https://docs.nango.dev/integrations/all/helpscout + docs_connect: https://docs.nango.dev/integrations/all/helpscout-docs/connect credentials: username: type: string title: API Key description: Your Help Scout Docs API Key secret: true + doc_section: '#step-1-finding-help-scout-api-key' password: type: string title: '' @@ -4605,7 +4730,20 @@ mixpanel: auth_mode: BASIC proxy: base_url: https://mixpanel.com + credentials: + # https://developer.mixpanel.com/reference/service-accounts + username: + type: string + title: Service Account Username + description: Mixpanel Service Account Username + doc_section: '#step-1-finding-mixpanel-api-key' + password: + type: string + title: Service Account Secret + description: Mixpanel Service Account Secret + doc_section: '#step-1-finding-mixpanel-api-key' docs: https://docs.nango.dev/integrations/all/mixpanel + docs_connect: https://docs.nango.dev/integrations/all/mixpanel/connect miro: display_name: Miro @@ -4633,6 +4771,9 @@ miro-scim: auth_mode: API_KEY proxy: base_url: https://miro.com/api + verification: + method: GET + endpoint: /v1/scim/Users headers: authorization: Bearer ${apiKey} docs: https://docs.nango.dev/integrations/all/miro @@ -4777,6 +4918,9 @@ notion-scim: auth_mode: API_KEY proxy: base_url: https://api.notion.com/scim + verification: + method: GET + endpoint: /v2/Users headers: authorization: Bearer ${apiKey} docs: https://docs.nango.dev/integrations/all/notion @@ -5062,14 +5206,19 @@ pendo: auth_mode: API_KEY proxy: base_url: https://app.pendo.io + verification: + method: GET + endpoint: /api/v1/page headers: x-pendo-integration-key: ${apiKey} docs: https://docs.nango.dev/integrations/all/pendo + docs_connect: https://docs.nango.dev/integrations/all/pendo/connect credentials: apiKey: type: string title: API Key description: The API key for your Pendo account + doc_section: '#step-1-finding-pendo-api-key' pennylane: display_name: Pennylane @@ -5338,6 +5487,9 @@ plain: headers: authorization: Bearer ${apiKey} base_url: https://core-api.uk.plain.com/graphql/v1 + verification: + method: GET + endpoint: ?query=%7B__schema%7Btypes%7Bname,kind,fields%7Bname%7D%7D%7D%7D docs: https://docs.nango.dev/integrations/all/plain credentials: apiKey: @@ -5388,6 +5540,7 @@ posthog: method: GET endpoint: /api/users/@me docs: https://docs.nango.dev/integrations/all/posthog + docs_connect: https://docs.nango.dev/integrations/all/posthog/connect connection_config: subdomain: type: string @@ -5402,6 +5555,7 @@ posthog: type: string title: API Key description: The API key for your PostHog account + doc_section: '#step-1-finding-your-posthog-api-key' productboard: display_name: Productboard @@ -5581,6 +5735,9 @@ refiner: headers: authorization: Bearer ${apiKey} base_url: https://api.refiner.io/v1 + verification: + method: GET + endpoint: /account docs: https://docs.nango.dev/integrations/all/refiner credentials: apiKey: @@ -5595,6 +5752,9 @@ replicate: headers: authorization: Bearer ${apiKey} base_url: https://api.replicate.com + verification: + method: GET + endpoint: /v1/account docs: https://docs.nango.dev/integrations/all/replicate credentials: apiKey: @@ -5803,6 +5963,58 @@ salesforce-experience-cloud: format: uri pattern: '^https?://.*$' automated: true +sap-success-factors: + display_name: SAP SuccessFactors + categories: + - hr + auth_mode: TWO_STEP + token_url: https://${connectionConfig.apiServer}/oauth/token + token_params: + company_id: ${connectionConfig.companyId} + client_id: ${credential.apiKey} + grant_type: urn:ietf:params:oauth:grant-type:saml2-bearer + assertion: ${credential.assertion} + token_headers: + content-type: application/x-www-form-urlencoded + proxy: + base_url: https://${connectionConfig.apiServer} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://docs.nango.dev/integrations/all/sap-success-factors + docs_connect: https://docs.nango.dev/integrations/all/sap-success-factors/connect + connection_config: + apiServer: + type: string + title: API Server + description: The API Server to connect to your SAP SuccessFactors account + pattern: '^[a-z0-9.-]+$' + example: api41preview.sapsf.com + prefix: https:// + doc_section: '#step-1-finding-your-api-server' + order: 1 + companyId: + type: string + title: Company ID + description: The company ID of your SAP SuccessFactors account + example: SFSALES012345 + pattern: '^[A-Z0-9]+$' + doc_section: '#step-2-finding-your-company-id' + order: 2 + credentials: + apiKey: + type: string + title: API Key + description: The API key for your SAP SuccessFactors account + secret: true + doc_section: '#step-3-generating-your-api-key' + assertion: + type: string + title: SAML Assertion + description: The SAML Assertion generated for your SAP SuccessFactors account + secret: true + doc_section: '#step-4-generating-your-saml-assertion' salesloft: display_name: Salesloft @@ -5816,7 +6028,7 @@ salesloft: docs: https://docs.nango.dev/integrations/all/salesloft sendgrid: - display_name: Sendgrid + display_name: SendGrid categories: - marketing auth_mode: API_KEY @@ -5825,11 +6037,13 @@ sendgrid: authorization: Bearer ${apiKey} base_url: https://api.sendgrid.com docs: https://docs.nango.dev/integrations/all/sendgrid + docs_connect: https://docs.nango.dev/integrations/all/sendgrid/connect credentials: apiKey: type: string title: API Key description: The API key for your Sendgrid account + doc_section: '#step-1-generating-your-sendgrid-api-key' sedna: display_name: Sedna (Oauth2) @@ -5966,6 +6180,20 @@ shipstation: method: GET endpoint: /users docs: https://docs.nango.dev/integrations/all/shipstation + docs_connect: https://docs.nango.dev/integrations/all/shipstation/connect + credentials: + username: + type: string + title: API Key + description: Your ShipStation API key + doc_section: '#step-1-finding-shipstation-api-key-and-api-secret' + password: + type: string + title: API Secret + description: Your Shipstation API secret + # https://www.shipstation.com/docs/api/requirements/#authentication + # Shipstation is using basic auth with API key and secret + doc_section: '#step-1-finding-shipstation-api-key-and-api-secret' shopify: display_name: Shopify @@ -5999,6 +6227,9 @@ shortcut: base_url: https://api.app.shortcut.com headers: shortcut-token: ${apiKey} + verification: + method: GET + endpoint: /v3/member docs: https://docs.nango.dev/integrations/all/shortcut credentials: apiKey: @@ -6036,6 +6267,9 @@ smartrecruiters-api-key: base_url: https://api.smartrecruiters.com headers: x-smarttoken: ${apiKey} + verification: + method: GET + endpoint: /feed/publications docs: https://docs.nango.dev/integrations/all/smartrecruiters credentials: apiKey: @@ -6374,6 +6608,9 @@ teamtailor: headers: authorization: Token token=${apiKey} x-api-version: '20210218' + verification: + method: GET + endpoint: /v1/users docs: https://docs.nango.dev/integrations/all/teamtailor connection_config: extension: @@ -6566,9 +6803,12 @@ trello-scim: - ticketing auth_mode: API_KEY proxy: - base_url: https://trello.com/scim/ + base_url: https://trello.com/scim headers: authorization: Bearer ${apiKey} + verification: + method: GET + endpoint: /v2/users?sortBy=displayName&count=10 docs: https://docs.nango.dev/integrations/all/trello credentials: apiKey: @@ -6855,16 +7095,31 @@ unanet: method: GET endpoint: /api/projects docs: https://docs.nango.dev/integrations/all/unanet + docs_connect: https://docs.nango.dev/integrations/all/unanet/connect connection_config: firmId: type: string title: Firm ID description: The firm ID of your Unanet instance + doc_section: '#step-2-finding-the-firm-id' apiKey: type: string title: API Key description: The API key of your Unanet instance secret: true + doc_section: '#step-3-finding-the-api-key' + credentials: + username: + type: string + title: User name + description: Your Unanet username + doc_section: '#step-1-finding-username-and-password' + password: + type: string + title: Password + description: Your Unanet password + default_value: '' + doc_section: '#step-1-finding-username-and-password' unauthenticated: display_name: Unauthenticated @@ -6882,6 +7137,9 @@ unipile: base_url: https://${connectionConfig.subdomain}.unipile.com:${connectionConfig.port} headers: x-api-key: ${apiKey} + verification: + method: GET + endpoint: /api/v1/contacts docs: https://docs.nango.dev/integrations/all/unipile credentials: apiKey: @@ -7184,14 +7442,16 @@ workday: credentials: username: type: string - title: User Name + title: Client ID description: Workday Client ID doc_section: '#step-2-find-your-workday-client-id-and-client-secret' password: type: string - title: Password + title: Client Secret description: Workday Client Secret doc_section: '#step-2-find-your-workday-client-id-and-client-secret' + # https://community.workday.com/sites/default/files/file-hosting/productionapi/index.html + # Workday is using basic auth with client ID and client secret as username and password wrike: display_name: Wrike diff --git a/packages/utils/package.json b/packages/utils/package.json index 23db45da268..f98f003a724 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -32,7 +32,7 @@ "@nangohq/types": "file:../types", "express": "^4.20.0", "ms": "3.0.0-canary.1", - "vitest": "1.6.0" + "vitest": "2.1.8" }, "files": [ "dist/**/*" diff --git a/packages/webapp/public/images/template-logos/builtwith.svg b/packages/webapp/public/images/template-logos/builtwith.svg new file mode 100644 index 00000000000..86274a372a0 --- /dev/null +++ b/packages/webapp/public/images/template-logos/builtwith.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/webapp/public/images/template-logos/gong-scim.svg b/packages/webapp/public/images/template-logos/gong-scim.svg new file mode 120000 index 00000000000..4901384c470 --- /dev/null +++ b/packages/webapp/public/images/template-logos/gong-scim.svg @@ -0,0 +1 @@ +gong.svg \ No newline at end of file diff --git a/packages/webapp/public/images/template-logos/sap-success-factors.svg b/packages/webapp/public/images/template-logos/sap-success-factors.svg new file mode 100644 index 00000000000..6befc8d318e --- /dev/null +++ b/packages/webapp/public/images/template-logos/sap-success-factors.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/webapp/src/pages/Connection/Syncs.tsx b/packages/webapp/src/pages/Connection/Syncs.tsx index 3c7218dd072..69e4a547c53 100644 --- a/packages/webapp/src/pages/Connection/Syncs.tsx +++ b/packages/webapp/src/pages/Connection/Syncs.tsx @@ -50,7 +50,15 @@ export const Syncs: React.FC = ({ connection, provider }) => { .map((sync, index) => ( {sync.name} ( - + logs ){index < syncs.filter((sync) => sync.active_logs?.log_id).length - 1 && ', '} diff --git a/packages/webhooks/package.json b/packages/webhooks/package.json index 53a0219bb0b..a0c390bd425 100644 --- a/packages/webhooks/package.json +++ b/packages/webhooks/package.json @@ -24,7 +24,7 @@ "devDependencies": { "@nangohq/types": "file:../types", "typescript": "5.3.3", - "vitest": "1.6.0" + "vitest": "2.1.8" }, "files": [ "dist/**/*" diff --git a/scripts/validation/providers/schema.json b/scripts/validation/providers/schema.json index 118b67f247d..d2686539fe8 100644 --- a/scripts/validation/providers/schema.json +++ b/scripts/validation/providers/schema.json @@ -359,7 +359,7 @@ "properties": { "grant_type": { "type": "string", - "enum": ["authorization_code", "client_credentials"] + "enum": ["authorization_code", "client_credentials", "urn:ietf:params:oauth:grant-type:saml2-bearer"] }, "request": { "anyOf": [ diff --git a/tsconfig.json b/tsconfig.json index b0885d9b776..e99a4d94f12 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,10 +1,11 @@ { - "extends": "@tsconfig/node18-strictest-esm/tsconfig.json", - "compilerOptions": { - "ignoreDeprecations": "5.0", - "declaration": true, - "sourceMap": true, - "composite": true, - "checkJs": false - } + "extends": "@tsconfig/node18-strictest-esm/tsconfig.json", + "compilerOptions": { + "ignoreDeprecations": "5.0", + "declaration": true, + "sourceMap": true, + "composite": true, + "checkJs": false, + "importsNotUsedAsValues": "remove" + } } diff --git a/vite.integration.config.ts b/vite.integration.config.ts index c33e9943e3c..d84df21afe5 100644 --- a/vite.integration.config.ts +++ b/vite.integration.config.ts @@ -17,6 +17,13 @@ export default defineConfig({ ORCHESTRATOR_SERVICE_URL: 'http://orchestrator' }, fileParallelism: false, - pool: 'forks' + pool: 'forks', + watch: false, + + poolOptions: { + forks: { + singleFork: true + } + } } });