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
+ }
+ }
}
});