diff --git a/.github/workflows/deploy-runners.yaml b/.github/workflows/deploy-runners.yaml new file mode 100644 index 0000000000..4fa016d474 --- /dev/null +++ b/.github/workflows/deploy-runners.yaml @@ -0,0 +1,29 @@ +name: Nango Deploy Runners + +on: + workflow_dispatch: + inputs: + environment: + type: choice + description: "Environment to deploy to, defaults to staging" + required: true + default: "staging" + options: + - staging + - production + +jobs: + deploy_runners: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Call deploy runners script + env: + API_KEY: ${{ secrets.RENDER_API_KEY }} + ENVIRONMENT: ${{ github.event.inputs.environment }} + RUNNER_OWNER_ID: ${{ secrets.RENDER_RUNNER_OWNER_ID }} + shell: bash + run: | + bash ./scripts/deploy/runners.bash + diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 45e320a276..87751ec0e0 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -37,10 +37,10 @@ jobs: exit 1 fi - CONTAINER_NAME=nango-worker - WORKER=$(docker ps -q -f status=running -f name=^/${CONTAINER_NAME}$) - if [ ! "${WORKER}" ]; then - echo "Worker container doesn't exist" + CONTAINER_NAME=nango-jobs + JOBS=$(docker ps -q -f status=running -f name=^/${CONTAINER_NAME}$) + if [ ! "${JOBS}" ]; then + echo "Jobs container doesn't exist" exit 1 fi shell: bash diff --git a/.github/workflows/integration-template-upload.yaml b/.github/workflows/integration-template-upload.yaml index 57c9d02387..3b365fcf90 100644 --- a/.github/workflows/integration-template-upload.yaml +++ b/.github/workflows/integration-template-upload.yaml @@ -30,7 +30,7 @@ jobs: - name: Get specific changed files id: changed-files-specific - uses: tj-actions/changed-files@v39 + uses: tj-actions/changed-files@v41 with: files: | integration-templates/* diff --git a/docs-v2/api-reference/connection/set-metadata.mdx b/docs-v2/api-reference/connection/set-metadata.mdx index 8e5fcb392e..b9a6bf533e 100644 --- a/docs-v2/api-reference/connection/set-metadata.mdx +++ b/docs-v2/api-reference/connection/set-metadata.mdx @@ -1,14 +1,14 @@ --- -title: 'Update connection metadata' +title: 'Set connection metadata' openapi: 'POST /connection/{connectionId}/metadata' --- -## Update _connection metadata_ +## Set _connection metadata_ -Use this API endpoint to update your [custom metadata](/guides/advanced-auth#storing-custom-metadata-per-connection) for a _connection_. +Use this API endpoint to set your [custom metadata](/guides/advanced-auth#storing-custom-metadata-per-connection) for a _connection_. Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides any existing metadata. ## Fetching _connection metadata_ -To read the existing metadata of a _connection_, simply [fetch it](/api-reference/connection/get). Your custom metadata is included as part of the returned _connection_ object. \ No newline at end of file +To read the existing metadata of a _connection_, simply [fetch it](/api-reference/connection/get). Your custom metadata is included as part of the returned _connection_ object.To read the existing metadata of a _connection_, simply [fetch it](/api-reference/connection/get). Your custom metadata is included as part of the returned _connection_ object. diff --git a/docs-v2/api-reference/connection/update-metadata.mdx b/docs-v2/api-reference/connection/update-metadata.mdx new file mode 100644 index 0000000000..419b4dd9b4 --- /dev/null +++ b/docs-v2/api-reference/connection/update-metadata.mdx @@ -0,0 +1,16 @@ +--- +title: 'Update connection metadata' +openapi: 'PATCH /connection/{connectionId}/metadata' +--- + +## Update _connection metadata_ + +Use this API endpoint to update your [custom metadata](/guides/advanced-auth#storing-custom-metadata-per-connection) for a _connection_. + +Nango uses the request body as the new metadata (it must be a JSON object). This will take in whatever metadata and merge it with any +existing metadata. + +## Fetching _connection metadata_ + +To read the existing metadata of a _connection_, simply [fetch it](/api-reference/connection/get). Your custom metadata is included as part of the returned _connection_ object. + diff --git a/docs-v2/guides/sync.mdx b/docs-v2/guides/sync.mdx index 2f813f601e..9a15931117 100644 --- a/docs-v2/guides/sync.mdx +++ b/docs-v2/guides/sync.mdx @@ -53,7 +53,7 @@ Now, collect the continually updated data: ```bash curl --request GET \ - --url 'https://api.nango.dev/sync/records?model=' \ + --url 'https://api.nango.dev/records?model=' \ --header 'Authorization: Bearer ' \ --header 'Connection-Id: ' \ --header 'Provider-Config-Key: ' @@ -86,4 +86,4 @@ Dive deeper with the [Customize Syncs & Actions guide](/guides/custom). Explore ## Questions, problems, feedback? -We're here to help! Please reach out on the [Slack community](https://nango.dev/slack), we are very active there. \ No newline at end of file +We're here to help! Please reach out on the [Slack community](https://nango.dev/slack), we are very active there. diff --git a/docs-v2/guides/webhooks.mdx b/docs-v2/guides/webhooks.mdx index 8e0f3334b1..75561c883d 100644 --- a/docs-v2/guides/webhooks.mdx +++ b/docs-v2/guides/webhooks.mdx @@ -54,9 +54,25 @@ app.post('/webhook', (req, res) => { Webhooks with non-2xx responses are retried with exponential backoff. +## Webhook Verification + +You can validate that the webhook indeed comes from Nango by looking at the +`X-Nango-Signature` header which is a SHA-256 hash built using the secret +key found in your project settings combined with the payload of the request body: +```ts +import crypto from 'crypto'; + +const secretKeyDev = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; +const signature = `${secretKeyDev}${JSON.stringify(payload)}`; +const hash = crypto.createHash('sha256').update(signature).digest('hex'); +``` + +If the value of the `X-Nango-Signature` matches that of `hash` (as seen above) +then the request passed validation. + ## Webhooks from external APIs to Nango[](#to-nango) You can handle incoming webhooks from external APIs using Nango: - Configure the webhook with your application as you would normally do - Write a _sync_ script that returns the data models you want (it can perform additional API requests if needed) -- Upon webhook reception, trigger the _sync_ script and pass it the webhook payload \ No newline at end of file +- Upon webhook reception, trigger the _sync_ script and pass it the webhook payload- Upon webhook reception, trigger the _sync_ script and pass it the webhook payload diff --git a/docs-v2/integration-templates/overview.mdx b/docs-v2/integration-templates/overview.mdx index 2fde6ff023..f2924747fb 100644 --- a/docs-v2/integration-templates/overview.mdx +++ b/docs-v2/integration-templates/overview.mdx @@ -92,6 +92,10 @@ As Nango and its community expand, we're looking forward to offering hundreds of Sync Zendesk tickets and articles + + + Sync Zoho CRM accounts, contacts and deals/opportunities + ## Need Help with a Template? diff --git a/docs-v2/integration-templates/zoho-crm.mdx b/docs-v2/integration-templates/zoho-crm.mdx new file mode 100644 index 0000000000..b2a24b7e86 --- /dev/null +++ b/docs-v2/integration-templates/zoho-crm.mdx @@ -0,0 +1,21 @@ +--- +title: 'Zoho CRM API Integration Template' +sidebarTitle: 'Zoho CRM' +--- + +## Get started with the Zoho CRM template + + + Learn how to use integration templates in Nango + + + + Get the latest version of the Zoho CRM integration template from GitHub + + +## Need help with the template? +Please reach out on the [Slack community](https://nango.dev/slack), we are very active there and happy to help! \ No newline at end of file diff --git a/docs-v2/integrations/all/apollo.mdx b/docs-v2/integrations/all/apollo.mdx new file mode 100644 index 0000000000..11675ba801 --- /dev/null +++ b/docs-v2/integrations/all/apollo.mdx @@ -0,0 +1,32 @@ +--- +title: Apollo +sidebarTitle: Apollo +--- + +API configuration: [`apollo`](https://nango.dev/providers.yaml) + + +## Features + +| Feature | Status | +| -------------------------------------------------------------------------------- | ------------------------------- | +| [Auth (Basic)](/guides/api-key) | ✅ | +| [Syncs](/guides/sync) & [Actions](/guides/action) | 🚫 | +| [Nango Proxy](/guides/proxy) | ✅ | +| Auto-pagination | 🚫 (time to contribute: <1h) | +| API-specific rate limits | 🚫 (time to contribute: <1h) | + +We can implement missing features in <48h, just ask for it in the [community](https://nango.dev/slack). + +## Getting started + +- [Generate a Apollo API token in your Apollo developer account](https://developer.apollo.io/keys/) +- [Apollo API docs](https://apolloio.github.io/apollo-api-docs/) + +Need help getting started? Get help in the [community](https://nango.dev/slack). + +## API gotchas + +- Coda uses API_KEY auth mode with query param: Param `api_token` in the request url to access different endpoints. + +Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/apollo.mdx) diff --git a/docs-v2/integrations/all/coda.mdx b/docs-v2/integrations/all/coda.mdx new file mode 100644 index 0000000000..69502e175f --- /dev/null +++ b/docs-v2/integrations/all/coda.mdx @@ -0,0 +1,31 @@ +--- +title: Coda +sidebarTitle: Coda +--- + +API configuration: [`Coda`](https://nango.dev/providers.yaml) + +## Features + +| Feature | Status | +| -------------------------------------------------------------------------------- | ------------------------------- | +| [Auth (Basic)](/guides/api-key) | ✅ | +| [Syncs](/guides/sync) & [Actions](/guides/action) | 🚫 | +| [Nango Proxy](/guides/proxy) | ✅ | +| Auto-pagination | 🚫 (time to contribute: <1h) | +| API-specific rate limits | 🚫 (time to contribute: <1h) | + +We can implement missing features in <48h, just ask for it in the [community](https://nango.dev/slack). + +## Getting started + +- [Generate a Coda API token in your Coda account](https://coda.io/@pamcha/coda-sync/find-your-api-key-2) +- [Coda API docs](https://coda.io/developers/apis/v1) + +Need help getting started? Get help in the [community](https://nango.dev/slack). + +## API gotchas + +- Coda uses API_KEY auth mode with Authorization: Bearer `api_token` in the request header to access different endpoints. + +Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/coda.mdx) \ No newline at end of file diff --git a/docs-v2/integrations/all/freshdesk.mdx b/docs-v2/integrations/all/freshdesk.mdx index a725c61418..977b55adcc 100644 --- a/docs-v2/integrations/all/freshdesk.mdx +++ b/docs-v2/integrations/all/freshdesk.mdx @@ -24,6 +24,25 @@ API configuration: [`freshdesk`](https://nango.dev/providers.yaml) Need help getting started? Get help in the [community](https://nango.dev/slack). +## Connection configuration in Nango + +Freshdesk requires a user specific subdomain for the API requests. + +You should request this from the user and pass it to Nango in the `nango.auth()` call: + +```js +nango.auth('freshdesk', '', { + params: { + subdomain: '' + }, + credentials: { + username: '', + password: 'x' // freshdesk asks you to leave "x" here + }}); +``` + +For more details, see the [docs here](/guides/advanced-auth#connection-configuration). + ## API gotchas - For Basic Auth, Freshdesk uses API key as a username and dummy characters as a password. diff --git a/docs-v2/integrations/all/intercom.mdx b/docs-v2/integrations/all/intercom.mdx index e7df7bae19..72a0d20853 100644 --- a/docs-v2/integrations/all/intercom.mdx +++ b/docs-v2/integrations/all/intercom.mdx @@ -19,6 +19,7 @@ API configuration: [`intercom`](https://nango.dev/providers.yaml) ## Getting started +- [Create a Developer Workspace](https://app.intercom.com/a/developer-signup) - [How to register an Application](https://developers.intercom.com/building-apps/docs/setting-up-oauth) - [OAuth-related docs](https://developers.intercom.com/building-apps/docs/setting-up-oauth) - [List of OAuth scopes](https://developers.intercom.com/building-apps/docs/oauth-scopes) @@ -28,4 +29,7 @@ API configuration: [`intercom`](https://nango.dev/providers.yaml) ## API gotchas +- Intercom access tokens do not expire. Logically, Intercom doesn't return a refresh token along with the access token. +- You do not need to pass API scopes/permissions during the authorization request. Permissions are only set in the Intercom Developer Portal. + Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/instagram.mdx) diff --git a/docs-v2/integrations/all/stripe-app.mdx b/docs-v2/integrations/all/stripe-app.mdx new file mode 100644 index 0000000000..e87c996c55 --- /dev/null +++ b/docs-v2/integrations/all/stripe-app.mdx @@ -0,0 +1,36 @@ +--- +title: Stripe +sidebarTitle: Stripe +--- + +API configuration: [`stripe`](https://nango.dev/providers.yaml) + +## Features + +| Feature | Status | +| -------------------------------------------------------------------------------- | ------------------------------- | +| [Auth (OAuth)](/guides/oauth) | ✅ | +| [Syncs](/guides/sync) & [Actions](/guides/action) | ✅ | +| [Nango Proxy](/guides/proxy) | ✅ | +| Auto-pagination | 🚫 (time to contribute: <1h) | +| API-specific rate limits | 🚫 (time to contribute: <1h) | + +We can implement missing features in <48h, just ask for it in the [community](https://nango.dev/slack). + +## Getting started + +- [How to register an Application](https://stripe.com/docs/stripe-apps) +- [OAuth-related docs](https://stripe.com/docs/stripe-apps/api-authentication/oauth) +- [List of OAuth scopes](https://stripe.com/docs/stripe-apps/reference/permissions) + +Need help getting started? Get help in the [community](https://nango.dev/slack). + +## Connection configuration in Nango + +Stripe requires you to use either the application domain or a temporary id (in test mode) to identify your application. See the [docs](https://stripe.com/docs/stripe-apps/api-authentication/oauth#install-app) for more information. + +You should add your app domain to the `appDomain` field in the connection params. + +```js +nango.auth('stripe-app', '', {params: {appDomain: ''}}); +``` diff --git a/docs-v2/integrations/knowledge-base.mdx b/docs-v2/integrations/knowledge-base.mdx index e498fedafd..8c946a9e98 100644 --- a/docs-v2/integrations/knowledge-base.mdx +++ b/docs-v2/integrations/knowledge-base.mdx @@ -27,6 +27,7 @@ Ask us on the [Slack community](https://nango.dev/slack) and we can help you qui + diff --git a/docs-v2/integrations/marketing.mdx b/docs-v2/integrations/marketing.mdx index eed6b22487..42e788469d 100644 --- a/docs-v2/integrations/marketing.mdx +++ b/docs-v2/integrations/marketing.mdx @@ -18,6 +18,7 @@ sidebarTitle: Marketing + diff --git a/docs-v2/integrations/support.mdx b/docs-v2/integrations/support.mdx index 4a64afc60d..813f78cabf 100644 --- a/docs-v2/integrations/support.mdx +++ b/docs-v2/integrations/support.mdx @@ -10,9 +10,12 @@ sidebarTitle: Support + + + diff --git a/docs-v2/mint.json b/docs-v2/mint.json index c819cb8b54..cebb25719a 100644 --- a/docs-v2/mint.json +++ b/docs-v2/mint.json @@ -99,7 +99,8 @@ "integration-templates/notion", "integration-templates/salesforce", "integration-templates/slack", - "integration-templates/zendesk" + "integration-templates/zendesk", + "integration-templates/zoho-crm" ] } ] @@ -170,6 +171,7 @@ "integrations/all/airtable", "integrations/all/amazon", "integrations/all/amplitude", + "integrations/all/apollo", "integrations/all/asana", "integrations/all/ashby", "integrations/all/atlassian", @@ -185,6 +187,7 @@ "integrations/all/calendly", "integrations/all/clickup", "integrations/all/close", + "integrations/all/coda", "integrations/all/confluence", "integrations/all/contentstack", "integrations/all/deel", @@ -341,6 +344,7 @@ "api-reference/connection/get", "api-reference/connection/post", "api-reference/connection/set-metadata", + "api-reference/connection/update-metadata", "api-reference/connection/delete" ] }, diff --git a/docs-v2/sdks/node.mdx b/docs-v2/sdks/node.mdx index 2c4f0eac0d..304c409149 100644 --- a/docs-v2/sdks/node.mdx +++ b/docs-v2/sdks/node.mdx @@ -150,11 +150,12 @@ await nango.deleteConnection('', ''); This will throw an exception if the delete call is not successful. -### Set and fetch custom Metadata +### Set, update or fetch custom Metadata Nango lets you store [custom metadata](/guides/advanced-auth#storing-custom-metadata-per-connection) on the Connection. -`setMetadata` overrides any existing Metadata for the connection! +`updateMetadata` updates existing Metadata for the connection by merging with any existing Metadata. +`setMetadata` overrides any existing Metadata for the connection. ```js // Store custom metadata with the connection @@ -165,6 +166,19 @@ const myMetadata = await nango.getMetadata('', '' console.log(JSON.stringify(myMetadata)); // prints: { "filter": "status=closed" } + +await nango.updateMetadata('', '', { type: 'ticket' }); + +console.log(JSON.stringify(myMetadata)); +// prints: { "filter": "status=closed", "type": "ticket" } + +// this will overwrite any existing metadata +await nango.setMetadata('', '', { reset: true }); + +const resetMetadata = await nango.getMetadata('', ''); + +console.log(JSON.stringify(resetMetadata)); +// prints: { "reset": true } ``` If you know the structure of the metadata, you can specify a type for it when diff --git a/docs-v2/spec.yaml b/docs-v2/spec.yaml index d03d237438..8226b4bc4d 100644 --- a/docs-v2/spec.yaml +++ b/docs-v2/spec.yaml @@ -509,6 +509,44 @@ paths: message: type: string + patch: + description: Update custom metadata for the connection. + parameters: + - name: connectionId + in: path + required: true + schema: + type: string + description: The connection ID used to create the connection. + - name: Provider-Config-Key + in: header + required: true + description: The integration ID used to create the connection (aka Unique Key). + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + responses: + '200': + description: Successfully updated the metadata + content: + application/json: + schema: + type: object + '400': + description: Invalid request + content: + application/json: + schema: + type: object + properties: + message: + type: string + /records: get: description: Returns data synced with Nango Sync diff --git a/integration-templates/asana/asana-tasks.ts b/integration-templates/asana/asana-tasks.ts index ddacd37950..c6a4642139 100644 --- a/integration-templates/asana/asana-tasks.ts +++ b/integration-templates/asana/asana-tasks.ts @@ -31,6 +31,7 @@ export default async function fetchData(nango: NangoSync) { mappedTasks = []; } } + await nango.batchSave(mappedTasks, 'AsanaTask'); } async function paginate(nango: NangoSync, endpoint: string, queryParams?: Record) { diff --git a/integration-templates/hubspot/hubspot-contacts.ts b/integration-templates/hubspot/hubspot-contacts.ts new file mode 100644 index 0000000000..3b1dc94c1b --- /dev/null +++ b/integration-templates/hubspot/hubspot-contacts.ts @@ -0,0 +1,25 @@ +import type { NangoSync, HubspotContact } from './models'; + +export default async function fetchData(nango: NangoSync) { + const query = `properties=firstname,lastname,email`; + + for await (const records of nango.paginate({ endpoint: '/crm/v3/objects/contacts', params: { query } })) { + const mappedRecords = mapHubspotContacts(records); + + await nango.batchSave(mappedRecords, 'HubspotContact'); + } +} + +function mapHubspotContacts(records: any[]): HubspotContact[] { + return records.map((record: any) => { + return { + id: record.id as string, + created_at: record.createdAt, + updated_at: record.updatedAt, + first_name: record.properties.firstname, + last_name: record.properties.lastname, + email: record.properties.email, + active: record.archived !== true + }; + }); +} diff --git a/integration-templates/hubspot/nango.yaml b/integration-templates/hubspot/nango.yaml index f3784a1ca3..b245ec7b31 100644 --- a/integration-templates/hubspot/nango.yaml +++ b/integration-templates/hubspot/nango.yaml @@ -4,6 +4,10 @@ integrations: runs: every half hour returns: - HubspotServiceTicket + hubspot-contacts: + runs: every day + returns: + - HubspotContact hubspot-owner: runs: every day returns: @@ -53,3 +57,10 @@ models: category: string content: string publishDate: number + HubspotContact: + id: string + created_at: string + updated_at: string + first_name: string + last_name: string + email: string diff --git a/integration-templates/zoho-crm/nango.yaml b/integration-templates/zoho-crm/nango.yaml new file mode 100644 index 0000000000..03463a6893 --- /dev/null +++ b/integration-templates/zoho-crm/nango.yaml @@ -0,0 +1,245 @@ +integrations: + zoho-crm: + zoho-crm-accounts: + runs: every half hour + auto_start: false + returns: + - ZohoCRMAccount + description: | + Fetches accounts from zoho crm. + Details: full sync, doesn't track deletes, metadata is not required. + Scope(s): ZohoCRM.modules.accounts.READ or ZohoCRM.modules.ALL + zoho-crm-contacts: + runs: every half hour + auto_start: false + returns: + - ZohoCRMContact + description: | + Fetches contacts from zoho crm. + Details: full sync, doesn't track deletes, metadata is not required. + Scope(s): ZohoCRM.modules.contacts.READ or ZohoCRM.modules.ALL + zoho-crm-deals: + runs: every half hour + auto_start: false + returns: + - ZohoCRMDeal + description: | + Fetches deals/opportunities from zoho crm. + Details: full sync, doesn't track deletes, metadata is not required. + Scope(s): ZohoCRM.modules.deals.READ or ZohoCRM.modules.ALL +models: + ZohoCRMAccount: + Owner: + name: string + id: string + email: string + $currency_symbol: string + $field_states: string + Account_Type: string + SIC_Code: string + Last_Activity_Time: date + Industry: string + Account_Site: string + $state: string + $process_flow: boolean + Billing_Country: string + $locked_for_me: boolean + id: string + $approved: boolean + $approval: + delegate: boolean + approve: boolean + reject: boolean + resubmit: boolean + Billing_Street: string + Created_Time: date + $editable: boolean + Billing_Code: string + Shipping_City: string + Shipping_Country: string + Shipping_Code: string + Billing_City: string + Created_By: + name: string + id: string + email: string + $zia_owner_assignment: string + Annual_Revenue: integer + Shipping_Street: string + Ownership: string + Description: string + Rating: integer + Shipping_State: string + $review_process: + approve: boolean + reject: boolean + resubmit: boolean + Website: string + Employees: integer + Record_Image: string + Modified_By: + name: string + id: string + email: string + $review: string + Phone: string + Account_Name: string + Account_Number: string + Ticker_Symbol: string + Modified_Time: date + $orchestration: boolean + Parent_Account: + name: string + id: string + $in_merge: boolean + Locked__s: boolean + Billing_State: string + Tag: [] + Fax: string + $approval_state: string + ZohoCRMContact: + Owner: + name: string + id: string + email: string + Email: string + $currency_symbol: string + $field_states: string + Other_Phone: string + Mailing_State: string + Other_State: string + Other_Country: string + Last_Activity_Time: date + Department: string + $state: string + Unsubscribed_Mode: string + $process_flow: boolean + Assistant: string + Mailing_Country: string + $locked_for_me: string + id: string + $approved: boolean + Reporting_To: + name: string + id: string + $approval: + delegate: boolean + approve: boolean + reject: boolean + resubmit: boolean + Other_City: string + Created_Time: date + $editable: boolean + Home_Phone: string + Created_By: + name: string + id: string + email: string + $zia_owner_assignment: string + Secondary_Email: string + Description: string + Vendor_Name: + name: string + id: string + Mailing_Zip: string + $review_process: + approve: boolean + reject: boolean + resubmit: boolean + Twitter: string + Other_Zip: string + Mailing_Street: string + Salutation: string + First_Name: string + Full_Name: string + Asst_Phone: string + Record_Image: string + Modified_By: + name: string + id: string + email: string + $review: boolean + Skype_ID: string + Phone: string + Account_Name: + name: string + id: string + Email_Opt_Out: boolean + Modified_Time: date + Date_of_Birth: date + Mailing_City: string + Unsubscribed_Time: date + Title: string + Other_Street: string + Mobile: string + $orchestration: boolean + Last_Name: string + $in_merge: boolean + Locked__s: boolean + Lead_Source: string + Tag: [] + Fax: string + $approval_state: string + ZohoCRMDeal: + Owner: + name: string + id: string + email: string + Description: string + $currency_symbol: string + Campaign_Source: + name: string + id: string + $field_states: string + $review_process: + approve: boolean + reject: boolean + resubmit: boolean + Closing_Date: date + Reason_For_Loss__s: string + Last_Activity_Time: date + Modified_By: + name: string + id: string + email: string + $review: string + Lead_Conversion_Time: date + $state: string + $process_flow: boolean + Deal_Name: string + Expected_Revenue: integer + Overall_Sales_Duration: integer + Stage: string + $locked_for_me: boolean + Account_Name: + name: string + id: string + id: string + $approved: boolean + $approval: + delegate: boolean + approve: boolean + reject: boolean + resubmit: boolean + Modified_Time: date + Created_Time: date + Amount: integer + Next_Step: string + Probability: integer + $editable: boolean + $orchestration: boolean + Contact_Name: + name: string + id: string + Sales_Cycle_Duration: integer + Type: string + $in_merge: boolean + Locked__s: boolean + Lead_Source: string + Created_By: + name: string + id: string + email: string + Tag: [] + $zia_owner_assignment: string + $approval_state: string diff --git a/integration-templates/zoho-crm/zoho-crm-accounts.ts b/integration-templates/zoho-crm/zoho-crm-accounts.ts new file mode 100644 index 0000000000..b3eaa5d73c --- /dev/null +++ b/integration-templates/zoho-crm/zoho-crm-accounts.ts @@ -0,0 +1,89 @@ +import type { ZohoCRMAccount, NangoSync } from './models'; + +export default async function fetchData(nango: NangoSync) { + let totalRecords = 0; + const fields = ''; // Define your fields to retrieve specific field values + + try { + const endpoint = '/crm/v2/Accounts'; + const config = { + headers: { + 'If-Modified-Since': nango.lastSyncDate?.toUTCString() || '' + }, + paginate: { + limit: 100 + }, + ...(fields ? { params: { fields } } : {}) + }; + for await (const account of nango.paginate({ ...config, endpoint })) { + const mappedAccounts: ZohoCRMAccount[] = account.map(mapAccounts) || []; + // Save Accounts + const batchSize: number = mappedAccounts.length; + totalRecords += batchSize; + + await nango.log(`Saving batch of ${batchSize} accounts (total accounts: ${totalRecords})`); + await nango.batchSave(mappedAccounts, 'ZohoCRMAccount'); + } + } catch (error: any) { + if (error.status == 304) { + await nango.log('No Accounts found.'); + } else { + throw new Error(`Error in fetchData: ${error.message}`); + } + } +} + +function mapAccounts(account: any): ZohoCRMAccount { + return { + Owner: account.Owner, + $currency_symbol: account.$currency_symbol, + $field_states: account.$field_states, + Account_Type: account.Account_Type, + SIC_Code: account.SIC_Code, + Last_Activity_Time: account.Last_Activity_Time, + Industry: account.Industry, + Account_Site: account.Account_Site, + $state: account.$state, + $process_flow: account.$process_flow, + Billing_Country: account.Billing_Country, + $locked_for_me: account.$locked_for_me, + id: account.id as string, + $approved: account.$approved, + $approval: account.$approval, + Billing_Street: account.Billing_Street, + Created_Time: account.Created_Time, + $editable: account.$editable, + Billing_Code: account.Billing_Code, + Shipping_City: account.Shipping_City, + Shipping_Country: account.Shipping_Country, + Shipping_Code: account.Shipping_Code, + Billing_City: account.Billing_City, + Created_By: account.Created_By, + $zia_owner_assignment: account.$zia_owner_assignment, + Annual_Revenue: account.Annual_Revenue, + Shipping_Street: account.Shipping_Street, + Ownership: account.Ownership, + Description: account.Description, + Rating: account.Rating, + Shipping_State: account.Shipping_State, + $review_process: account.$review_process, + Website: account.Website, + Employees: account.Employees, + Record_Image: account.Record_Image, + Modified_By: account.Modified_By, + $review: account.$review, + Phone: account.Phone, + Account_Name: account.Account_Name, + Account_Number: account.Account_Number, + Ticker_Symbol: account.Ticker_Symbol, + Modified_Time: account.Modified_Time, + $orchestration: account.$orchestration, + Parent_Account: account.Parent_Account, + $in_merge: account.$in_merge, + Locked__s: account.Locked__s, + Billing_State: account.Billing_State, + Tag: account.Tag, + Fax: account.Fax, + $approval_state: account.$approval_state + }; +} diff --git a/integration-templates/zoho-crm/zoho-crm-contacts.ts b/integration-templates/zoho-crm/zoho-crm-contacts.ts new file mode 100644 index 0000000000..add6709069 --- /dev/null +++ b/integration-templates/zoho-crm/zoho-crm-contacts.ts @@ -0,0 +1,99 @@ +import type { ZohoCRMContact, NangoSync } from './models'; + +export default async function fetchData(nango: NangoSync) { + let totalRecords = 0; + const fields = ''; // Define your fields to retrieve specific field values + + try { + const endpoint = '/crm/v2/Contacts'; + const config = { + headers: { + 'If-Modified-Since': nango.lastSyncDate?.toUTCString() || '' + }, + paginate: { + limit: 100 + }, + ...(fields ? { params: { fields } } : {}) + }; + for await (const contact of nango.paginate({ ...config, endpoint })) { + const mappedContacts: ZohoCRMContact[] = contact.map(mapContacts) || []; + // Save Contacts + const batchSize: number = mappedContacts.length; + totalRecords += batchSize; + + await nango.log(`Saving batch of ${batchSize} contacts (total contacts: ${totalRecords})`); + await nango.batchSave(mappedContacts, 'ZohoCRMContact'); + } + } catch (error: any) { + if (error.status == 304) { + await nango.log('No Contacts found.'); + } else { + throw new Error(`Error in fetchData: ${error.message}`); + } + } +} + +function mapContacts(contact: any): ZohoCRMContact { + return { + Owner: contact.Owner, + Email: contact.Email, + $currency_symbol: contact.$currency_symbol, + $field_states: contact.$field_states, + Other_Phone: contact.Other_Phone, + Mailing_State: contact.Mailing_State, + Other_State: contact.Other_State, + Other_Country: contact.Other_Country, + Last_Activity_Time: contact.Last_Activity_Time, + Department: contact.Department, + $state: contact.$state, + Unsubscribed_Mode: contact.Unsubscribed_Mode, + $process_flow: contact.$process_flow, + Assistant: contact.Assistant, + Mailing_Country: contact.Mailing_Country, + $locked_for_me: contact.locked_for_me, + id: contact.id as string, + $approved: contact.$approved, + Reporting_To: contact.Reporting_To, + $approval: contact.$approval, + Other_City: contact.Other_City, + Created_Time: contact.Created_Time, + $editable: contact.$editable, + Home_Phone: contact.Home_Phone, + Created_By: contact.Created_By, + $zia_owner_assignment: contact.$zia_owner_assignment, + Secondary_Email: contact.Secondary_Email, + Description: contact.Description, + Vendor_Name: contact.Vendor_Name, + Mailing_Zip: contact.Mailing_Zip, + $review_process: contact.$review_process, + Twitter: contact.Twitter, + Other_Zip: contact.Other_Zip, + Mailing_Street: contact.Mailing_Street, + Salutation: contact.Salutation, + First_Name: contact.First_Name, + Full_Name: contact.Full_Name, + Asst_Phone: contact.Asst_Phone, + Record_Image: contact.Record_Image, + Modified_By: contact.Modified_By, + $review: contact.$review, + Skype_ID: contact.Skype_ID, + Phone: contact.Phone, + Account_Name: contact.Account_Name, + Email_Opt_Out: contact.Email_Opt_Out, + Modified_Time: contact.Modified_Time, + Date_of_Birth: contact.Date_of_Birth, + Mailing_City: contact.Mailing_City, + Unsubscribed_Time: contact.Unsubscribed_Time, + Title: contact.Title, + Other_Street: contact.Other_Street, + Mobile: contact.Mobile, + $orchestration: contact.$orchestration, + Last_Name: contact.Last_Name, + $in_merge: contact.$in_merge, + Locked__s: contact.Locked__s, + Lead_Source: contact.Lead_Source, + Tag: contact.Tag, + Fax: contact.Fax, + $approval_state: contact.$approval_state + }; +} diff --git a/integration-templates/zoho-crm/zoho-crm-deals.ts b/integration-templates/zoho-crm/zoho-crm-deals.ts new file mode 100644 index 0000000000..b28a88ff0a --- /dev/null +++ b/integration-templates/zoho-crm/zoho-crm-deals.ts @@ -0,0 +1,79 @@ +import type { ZohoCRMDeal, NangoSync } from './models'; + +export default async function fetchData(nango: NangoSync) { + let totalRecords = 0; + const fields = ''; // Define your fields to retrieve specific field values + + try { + const endpoint = '/crm/v2/Deals'; + const config = { + headers: { + 'If-Modified-Since': nango.lastSyncDate?.toUTCString() || '' + }, + paginate: { + limit: 100 + }, + ...(fields ? { params: { fields } } : {}) + }; + for await (const deal of nango.paginate({ ...config, endpoint })) { + const mappedDeals: ZohoCRMDeal[] = deal.map(mapDeals) || []; + // Save Deals + const batchSize: number = mappedDeals.length; + totalRecords += batchSize; + + await nango.log(`Saving batch of ${batchSize} deals (total deals: ${totalRecords})`); + await nango.batchSave(mappedDeals, 'ZohoCRMDeal'); + } + } catch (error: any) { + if (error.status == 304) { + await nango.log('No Deals found.'); + } else { + throw new Error(`Error in fetchData: ${error.message}`); + } + } +} + +function mapDeals(deal: any): ZohoCRMDeal { + return { + Owner: deal.Owner, + Description: deal.Description, + $currency_symbol: deal.$currency_symbol, + Campaign_Source: deal.Campaign_Source, + $field_states: deal.$field_states, + $review_process: deal.$review_process, + Closing_Date: deal.Closing_Date, + Reason_For_Loss__s: deal.Reason_For_Loss__s, + Last_Activity_Time: deal.Last_Activity_Time, + Modified_By: deal.Modified_By, + $review: deal.$review, + Lead_Conversion_Time: deal.Lead_Conversion_Time, + $state: deal.$state, + $process_flow: deal.$process_flow, + Deal_Name: deal.Deal_Name, + Expected_Revenue: deal.Expected_Revenue, + Overall_Sales_Duration: deal.Overall_Sales_Duration, + Stage: deal.Stage, + $locked_for_me: deal.$locked_for_me, + Account_Name: deal.Account_Name, + id: deal.id as string, + $approved: deal.$approved, + $approval: deal.$approval, + Modified_Time: deal.Modified_Time, + Created_Time: deal.Created_Time, + Amount: deal.Amount, + Next_Step: deal.Next_Step, + Probability: deal.Probability, + $editable: deal.$editable, + $orchestration: deal.$orchestration, + Contact_Name: deal.Contact_Name, + Sales_Cycle_Duration: deal.Sales_Cycle_Duration, + Type: deal.Type, + $in_merge: deal.$in_merge, + Locked__s: deal.Locked__s, + Lead_Source: deal.Lead_Source, + Created_By: deal.Created_By, + Tag: deal.Tag, + $zia_owner_assignment: deal.$zia_owner_assignment, + $approval_state: deal.$approval_state + }; +} diff --git a/package-lock.json b/package-lock.json index 61d0622515..8c128c0e05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,8 @@ "packages/frontend", "packages/node-client", "packages/server", - "packages/worker" + "packages/runner", + "packages/jobs" ], "dependencies": { "@babel/parser": "^7.22.5", @@ -30,6 +31,7 @@ "onchange": "^7.1.0", "prettier": "^2.7.1", "testcontainers": "^9.12.0", + "tsx": "^4.6.2", "typescript": "^4.7.4", "vitest": "^0.33.0" } @@ -62,6 +64,19 @@ "node": ">=6.0.0" } }, + "node_modules/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==" + }, "node_modules/@aws-crypto/crc32": { "version": "3.0.0", "license": "Apache-2.0", @@ -1270,8 +1285,9 @@ } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "license": "MIT", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -2545,7 +2561,6 @@ }, "node_modules/@babel/runtime": { "version": "7.22.3", - "dev": true, "license": "MIT", "dependencies": { "regenerator-runtime": "^0.13.11" @@ -2804,18 +2819,6 @@ "node": ">=12.0.0" } }, - "node_modules/@datadog/native-appsec": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@datadog/native-appsec/-/native-appsec-4.0.0.tgz", - "integrity": "sha512-myTguXJ3VQHS2E1ylNsSF1avNpDmq5t+K4Q47wdzeakGc3sDIDDyEbvuFTujl9c9wBIkup94O1mZj5DR37ajzA==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^3.9.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@datadog/native-iast-rewriter": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@datadog/native-iast-rewriter/-/native-iast-rewriter-2.2.1.tgz", @@ -2868,22 +2871,6 @@ "node": ">=12" } }, - "node_modules/@datadog/pprof": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@datadog/pprof/-/pprof-4.0.1.tgz", - "integrity": "sha512-TavqyiyQZOaUM9eQB07r8+K/T1CqKyOdsUGxpN79+BF+eOQBpTj/Cte6KdlhcUSKL3h5hSjC+vlgA7uW2qtVhA==", - "hasInstallScript": true, - "dependencies": { - "delay": "^5.0.0", - "node-gyp-build": "<4.0", - "p-limit": "^3.1.0", - "pprof-format": "^2.0.7", - "source-map": "^0.7.4" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/@datadog/sketches-js": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@datadog/sketches-js/-/sketches-js-2.1.0.tgz", @@ -2897,1429 +2884,1582 @@ "node": ">=10.0.0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", "cpu": [ - "arm64" + "arm" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ - "darwin" + "android" ], "engines": { "node": ">=12" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=12" } }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.3", + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=12" } }, - "node_modules/@grpc/grpc-js": { - "version": "1.7.3", - "license": "Apache-2.0", - "dependencies": { - "@grpc/proto-loader": "^0.7.0", - "@types/node": ">=12.12.47" - }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^8.13.0 || >=10.10.0" + "node": ">=12" } }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.7", - "license": "Apache-2.0", - "dependencies": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.0.0", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/@grpc/proto-loader/node_modules/long": { - "version": "4.0.0", - "license": "Apache-2.0" - }, - "node_modules/@grpc/proto-loader/node_modules/yargs": { - "version": "17.7.2", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { "node": ">=12" } }, - "node_modules/@hapi/boom": { - "version": "10.0.1", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^11.0.2" + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@hapi/boom/node_modules/@hapi/hoek": { - "version": "11.0.2", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/bourne": { - "version": "3.0.0", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/hoek": { - "version": "10.0.1", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@hapi/topo/node_modules/@hapi/hoek": { - "version": "9.3.0", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/wreck": { - "version": "18.0.1", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/boom": "^10.0.1", - "@hapi/bourne": "^3.0.0", - "@hapi/hoek": "^11.0.2" + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@hapi/wreck/node_modules/@hapi/hoek": { - "version": "11.0.2", - "license": "BSD-3-Clause" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.7", + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.10.0" + "node": ">=12" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=12" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@inquirer/checkbox": { - "version": "1.3.3", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^2.3.0", - "@inquirer/type": "^1.1.0", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "figures": "^3.2.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.18.0" + "node": ">=12" } }, - "node_modules/@inquirer/confirm": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^2.3.0", - "@inquirer/type": "^1.1.0", - "chalk": "^4.1.2" - }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.18.0" + "node": ">=12" } }, - "node_modules/@inquirer/core": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@inquirer/type": "^1.1.0", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "cli-spinners": "^2.8.0", - "cli-width": "^4.0.0", - "figures": "^3.2.0", - "mute-stream": "^1.0.0", - "run-async": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.0.1" - }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.18.0" + "node": ">=12" } }, - "node_modules/@inquirer/core/node_modules/mute-stream": { - "version": "1.0.0", - "license": "ISC", + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@inquirer/core/node_modules/wrap-ansi": { - "version": "6.2.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@inquirer/editor": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^2.3.0", - "@inquirer/type": "^1.1.0", - "chalk": "^4.1.2", - "external-editor": "^3.0.3" - }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=14.18.0" + "node": ">=12" } }, - "node_modules/@inquirer/expand": { - "version": "1.1.3", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^2.3.0", - "@inquirer/type": "^1.1.0", - "chalk": "^4.1.2", - "figures": "^3.2.0" - }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=14.18.0" + "node": ">=12" } }, - "node_modules/@inquirer/input": { - "version": "1.2.3", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^2.3.0", - "@inquirer/type": "^1.1.0", - "chalk": "^4.1.2" - }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=14.18.0" + "node": ">=12" } }, - "node_modules/@inquirer/password": { - "version": "1.1.3", - "license": "MIT", - "dependencies": { - "@inquirer/input": "^1.2.3", - "@inquirer/type": "^1.1.0", - "chalk": "^4.1.2" - }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=14.18.0" + "node": ">=12" } }, - "node_modules/@inquirer/prompts": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@inquirer/checkbox": "^1.3.3", - "@inquirer/confirm": "^2.0.4", - "@inquirer/core": "^2.3.0", - "@inquirer/editor": "^1.2.2", - "@inquirer/expand": "^1.1.3", - "@inquirer/input": "^1.2.3", - "@inquirer/password": "^1.1.3", - "@inquirer/rawlist": "^1.2.3", - "@inquirer/select": "^1.2.3" - }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=14.18.0" + "node": ">=12" } }, - "node_modules/@inquirer/rawlist": { - "version": "1.2.3", + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^2.3.0", - "@inquirer/type": "^1.1.0", - "chalk": "^4.1.2" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=14.18.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@inquirer/select": { - "version": "1.2.3", + "node_modules/@eslint/eslintrc": { + "version": "1.3.3", + "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^2.3.0", - "@inquirer/type": "^1.1.0", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "figures": "^3.2.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=14.18.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@inquirer/type": { - "version": "1.1.0", - "license": "MIT", + "node_modules/@exodus/schemasafe": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", + "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==" + }, + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", "engines": { - "node": ">=14.18.0" + "node": ">=14" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "license": "ISC", + "node_modules/@grpc/grpc-js": { + "version": "1.7.3", + "license": "Apache-2.0", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" }, "engines": { - "node": ">=12" + "node": "^8.13.0 || >=10.10.0" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "license": "MIT", - "engines": { - "node": ">=12" + "node_modules/@grpc/proto-loader": { + "version": "0.7.7", + "license": "Apache-2.0", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^17.7.2" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "license": "MIT", - "engines": { - "node": ">=12" + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=6" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "license": "MIT" + "node_modules/@grpc/proto-loader/node_modules/long": { + "version": "4.0.0", + "license": "Apache-2.0" }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "17.7.2", "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "license": "MIT", + "node_modules/@hapi/boom": { + "version": "10.0.1", + "license": "BSD-3-Clause", "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "@hapi/hoek": "^11.0.2" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "license": "MIT", + "node_modules/@hapi/boom/node_modules/@hapi/hoek": { + "version": "11.0.2", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/bourne": { + "version": "3.0.0", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/hoek": { + "version": "10.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "license": "BSD-3-Clause", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "@hapi/hoek": "^9.0.0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.0", - "dev": true, - "license": "MIT", + "node_modules/@hapi/topo/node_modules/@hapi/hoek": { + "version": "9.3.0", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/wreck": { + "version": "18.0.1", + "license": "BSD-3-Clause", "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@hapi/boom": "^10.0.1", + "@hapi/bourne": "^3.0.0", + "@hapi/hoek": "^11.0.2" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "license": "MIT", + "node_modules/@hapi/wreck/node_modules/@hapi/hoek": { + "version": "11.0.2", + "license": "BSD-3-Clause" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.7", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">=6.0.0" + "node": ">=10.10.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "license": "MIT", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6.0.0" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "license": "MIT", + "node_modules/@humanwhocodes/momoa": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-2.0.4.tgz", + "integrity": "sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==", "engines": { - "node": ">=6.0.0" + "node": ">=10.10.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.3", + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@inquirer/checkbox": { + "version": "1.3.3", "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@inquirer/core": "^2.3.0", + "@inquirer/type": "^1.1.0", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "figures": "^3.2.0" + }, + "engines": { + "node": ">=14.18.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", + "node_modules/@inquirer/confirm": { + "version": "2.0.4", "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@inquirer/core": "^2.3.0", + "@inquirer/type": "^1.1.0", + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=14.18.0" } }, - "node_modules/@nangohq/frontend": { - "resolved": "packages/frontend", - "link": true - }, - "node_modules/@nangohq/nango-server": { - "resolved": "packages/server", - "link": true - }, - "node_modules/@nangohq/nango-worker": { - "resolved": "packages/worker", - "link": true - }, - "node_modules/@nangohq/node": { - "resolved": "packages/node-client", - "link": true - }, - "node_modules/@nangohq/shared": { - "resolved": "packages/shared", - "link": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, + "node_modules/@inquirer/core": { + "version": "2.3.0", "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@inquirer/type": "^1.1.0", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "cli-spinners": "^2.8.0", + "cli-width": "^4.0.0", + "figures": "^3.2.0", + "mute-stream": "^1.0.0", + "run-async": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.0.1" }, "engines": { - "node": ">= 8" + "node": ">=14.18.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true, - "license": "MIT", + "node_modules/@inquirer/core/node_modules/mute-stream": { + "version": "1.0.0", + "license": "ISC", "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/@octokit/auth-token": { - "version": "4.0.0", + "node_modules/@inquirer/editor": { + "version": "1.2.2", "license": "MIT", + "dependencies": { + "@inquirer/core": "^2.3.0", + "@inquirer/type": "^1.1.0", + "chalk": "^4.1.2", + "external-editor": "^3.0.3" + }, "engines": { - "node": ">= 18" + "node": ">=14.18.0" } }, - "node_modules/@octokit/core": { - "version": "5.0.0", + "node_modules/@inquirer/expand": { + "version": "1.1.3", "license": "MIT", "dependencies": { - "@octokit/auth-token": "^4.0.0", - "@octokit/graphql": "^7.0.0", - "@octokit/request": "^8.0.2", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" + "@inquirer/core": "^2.3.0", + "@inquirer/type": "^1.1.0", + "chalk": "^4.1.2", + "figures": "^3.2.0" }, "engines": { - "node": ">= 18" + "node": ">=14.18.0" } }, - "node_modules/@octokit/core/node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "license": "MIT" - }, - "node_modules/@octokit/core/node_modules/@octokit/types": { - "version": "11.1.0", + "node_modules/@inquirer/input": { + "version": "1.2.3", "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "@inquirer/core": "^2.3.0", + "@inquirer/type": "^1.1.0", + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=14.18.0" } }, - "node_modules/@octokit/endpoint": { - "version": "9.0.0", + "node_modules/@inquirer/password": { + "version": "1.1.3", "license": "MIT", "dependencies": { - "@octokit/types": "^11.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" + "@inquirer/input": "^1.2.3", + "@inquirer/type": "^1.1.0", + "chalk": "^4.1.2" }, "engines": { - "node": ">= 18" + "node": ">=14.18.0" } }, - "node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "license": "MIT" - }, - "node_modules/@octokit/endpoint/node_modules/@octokit/types": { - "version": "11.1.0", + "node_modules/@inquirer/prompts": { + "version": "2.3.0", "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "@inquirer/checkbox": "^1.3.3", + "@inquirer/confirm": "^2.0.4", + "@inquirer/core": "^2.3.0", + "@inquirer/editor": "^1.2.2", + "@inquirer/expand": "^1.1.3", + "@inquirer/input": "^1.2.3", + "@inquirer/password": "^1.1.3", + "@inquirer/rawlist": "^1.2.3", + "@inquirer/select": "^1.2.3" + }, + "engines": { + "node": ">=14.18.0" } }, - "node_modules/@octokit/graphql": { - "version": "7.0.1", + "node_modules/@inquirer/rawlist": { + "version": "1.2.3", "license": "MIT", "dependencies": { - "@octokit/request": "^8.0.1", - "@octokit/types": "^11.0.0", - "universal-user-agent": "^6.0.0" + "@inquirer/core": "^2.3.0", + "@inquirer/type": "^1.1.0", + "chalk": "^4.1.2" }, "engines": { - "node": ">= 18" + "node": ">=14.18.0" } }, - "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "license": "MIT" - }, - "node_modules/@octokit/graphql/node_modules/@octokit/types": { - "version": "11.1.0", + "node_modules/@inquirer/select": { + "version": "1.2.3", "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "@inquirer/core": "^2.3.0", + "@inquirer/type": "^1.1.0", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "figures": "^3.2.0" + }, + "engines": { + "node": ">=14.18.0" } }, - "node_modules/@octokit/openapi-types": { - "version": "17.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "8.0.0", + "node_modules/@inquirer/type": { + "version": "1.1.0", "license": "MIT", - "dependencies": { - "@octokit/types": "^11.0.0" - }, "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=5" + "node": ">=14.18.0" } }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "11.1.0", - "license": "MIT", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "license": "ISC", "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@octokit/plugin-request-log": { - "version": "4.0.0", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", "license": "MIT", "engines": { - "node": ">= 18" + "node": ">=12" }, - "peerDependencies": { - "@octokit/core": ">=5" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "9.0.0", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", "license": "MIT", - "dependencies": { - "@octokit/types": "^11.0.0" - }, "engines": { - "node": ">= 18" + "node": ">=12" }, - "peerDependencies": { - "@octokit/core": ">=5" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { - "version": "18.0.0", + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", "license": "MIT" }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "11.1.0", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, - "node_modules/@octokit/plugin-retry": { - "version": "6.0.0", + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", "license": "MIT", "dependencies": { - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.0.0", - "bottleneck": "^2.15.3" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">= 18" + "node": ">=12" }, - "peerDependencies": { - "@octokit/core": ">=5" - } - }, - "node_modules/@octokit/plugin-retry/node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "license": "MIT" - }, - "node_modules/@octokit/plugin-retry/node_modules/@octokit/types": { - "version": "11.1.0", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@octokit/plugin-throttling": { - "version": "7.0.0", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", "license": "MIT", "dependencies": { - "@octokit/types": "^11.0.0", - "bottleneck": "^2.15.3" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">= 18" + "node": ">=12" }, - "peerDependencies": { - "@octokit/core": "^5.0.0" + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@octokit/plugin-throttling/node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "license": "MIT" - }, - "node_modules/@octokit/plugin-throttling/node_modules/@octokit/types": { - "version": "11.1.0", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@octokit/request": { - "version": "8.1.1", + "node_modules/@jest/schemas": { + "version": "29.6.0", + "dev": true, "license": "MIT", "dependencies": { - "@octokit/endpoint": "^9.0.0", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.1.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">= 18" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@octokit/request-error": { - "version": "5.0.0", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", "license": "MIT", "dependencies": { - "@octokit/types": "^11.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { - "node": ">= 18" + "node": ">=6.0.0" } }, - "node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "license": "MIT" - }, - "node_modules/@octokit/request-error/node_modules/@octokit/types": { - "version": "11.1.0", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@octokit/request/node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "license": "MIT" - }, - "node_modules/@octokit/request/node_modules/@octokit/types": { - "version": "11.1.0", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, - "node_modules/@octokit/rest": { - "version": "20.0.1", + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", "license": "MIT", - "dependencies": { - "@octokit/core": "^5.0.0", - "@octokit/plugin-paginate-rest": "^8.0.0", - "@octokit/plugin-request-log": "^4.0.0", - "@octokit/plugin-rest-endpoint-methods": "^9.0.0" - }, "engines": { - "node": ">= 18" + "node": ">=6.0.0" } }, - "node_modules/@octokit/types": { - "version": "9.2.2", - "dev": true, + "node_modules/@jridgewell/source-map": { + "version": "0.3.3", "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^17.1.2" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, - "node_modules/@opentelemetry/api": { - "version": "1.4.1", - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "license": "MIT" }, - "node_modules/@opentelemetry/core": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.18.1.tgz", - "integrity": "sha512-kvnUqezHMhsQvdsnhnqTNfAJs3ox/isB0SVrM1dhVFw7SsB7TstuVa6fgWnN2GdPyilIFLUvvbTZoVRmx6eiRg==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "license": "MIT", "dependencies": { - "@opentelemetry/semantic-conventions": "1.18.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.8.0" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.18.1.tgz", - "integrity": "sha512-+NLGHr6VZwcgE/2lw8zDIufOCGnzsA5CbQIMleXZTrgkBd0TanCX+MiDYJ1TOS4KL/Tqk0nFRxawnaYr6pkZkA==", - "engines": { - "node": ">=14" - } + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } + "node_modules/@nangohq/frontend": { + "resolved": "packages/frontend", + "link": true }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "license": "BSD-3-Clause" + "node_modules/@nangohq/nango-jobs": { + "resolved": "packages/jobs", + "link": true }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "license": "BSD-3-Clause" + "node_modules/@nangohq/nango-runner": { + "resolved": "packages/runner", + "link": true }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "license": "BSD-3-Clause" + "node_modules/@nangohq/nango-server": { + "resolved": "packages/server", + "link": true }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "license": "BSD-3-Clause" + "node_modules/@nangohq/node": { + "resolved": "packages/node-client", + "link": true }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "license": "BSD-3-Clause", + "node_modules/@nangohq/shared": { + "resolved": "packages/shared", + "link": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "license": "MIT", "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@redis/bloom": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", - "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", - "peerDependencies": { - "@redis/client": "^1.0.0" + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" } }, - "node_modules/@redis/client": { - "version": "1.5.12", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.12.tgz", - "integrity": "sha512-/ZjE18HRzMd80eXIIUIPcH81UoZpwulbo8FmbElrjPqH0QC0SeIKu1BOU49bO5trM5g895kAjhvalt5h77q+4A==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", "dependencies": { - "cluster-key-slot": "1.1.2", - "generic-pool": "3.9.0", - "yallist": "4.0.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=14" - } - }, - "node_modules/@redis/graph": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", - "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", - "peerDependencies": { - "@redis/client": "^1.0.0" + "node": ">= 8" } }, - "node_modules/@redis/json": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.6.tgz", - "integrity": "sha512-rcZO3bfQbm2zPRpqo82XbW8zg4G/w4W3tI7X8Mqleq9goQjAGLL7q/1n1ZX4dXEAmORVZ4s1+uKLaUOg7LrUhw==", - "peerDependencies": { - "@redis/client": "^1.0.0" + "node_modules/@octokit/auth-token": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">= 18" } }, - "node_modules/@redis/search": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.6.tgz", - "integrity": "sha512-mZXCxbTYKBQ3M2lZnEddwEAks0Kc7nauire8q20oA0oA/LoA+E/b5Y5KZn232ztPb1FkIGqo12vh3Lf+Vw5iTw==", - "peerDependencies": { - "@redis/client": "^1.0.0" + "node_modules/@octokit/core": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.0.0", + "@octokit/request": "^8.0.2", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^11.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" } }, - "node_modules/@redis/time-series": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.5.tgz", - "integrity": "sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg==", - "peerDependencies": { - "@redis/client": "^1.0.0" - } + "node_modules/@octokit/core/node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "license": "MIT" }, - "node_modules/@sentry/core": { - "version": "7.39.0", + "node_modules/@octokit/core/node_modules/@octokit/types": { + "version": "11.1.0", "license": "MIT", "dependencies": { - "@sentry/types": "7.39.0", - "@sentry/utils": "7.39.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" + "@octokit/openapi-types": "^18.0.0" } }, - "node_modules/@sentry/node": { - "version": "7.39.0", + "node_modules/@octokit/endpoint": { + "version": "9.0.0", "license": "MIT", "dependencies": { - "@sentry/core": "7.39.0", - "@sentry/types": "7.39.0", - "@sentry/utils": "7.39.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" + "@octokit/types": "^11.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">=8" + "node": ">= 18" } }, - "node_modules/@sentry/types": { - "version": "7.39.0", + "node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "license": "MIT" + }, + "node_modules/@octokit/endpoint/node_modules/@octokit/types": { + "version": "11.1.0", "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@octokit/openapi-types": "^18.0.0" } }, - "node_modules/@sentry/utils": { - "version": "7.39.0", + "node_modules/@octokit/graphql": { + "version": "7.0.1", "license": "MIT", "dependencies": { - "@sentry/types": "7.39.0", - "tslib": "^1.9.3" + "@octokit/request": "^8.0.1", + "@octokit/types": "^11.0.0", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">=8" + "node": ">= 18" } }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "license": "BSD-3-Clause", + "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "license": "MIT" + }, + "node_modules/@octokit/graphql/node_modules/@octokit/types": { + "version": "11.1.0", + "license": "MIT", "dependencies": { - "@hapi/hoek": "^9.0.0" + "@octokit/openapi-types": "^18.0.0" } }, - "node_modules/@sideway/address/node_modules/@hapi/hoek": { - "version": "9.3.0", - "license": "BSD-3-Clause" - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "license": "BSD-3-Clause" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "license": "BSD-3-Clause" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", + "node_modules/@octokit/openapi-types": { + "version": "17.2.0", "dev": true, "license": "MIT" }, - "node_modules/@smithy/abort-controller": { - "version": "2.0.11", - "license": "Apache-2.0", + "node_modules/@octokit/plugin-paginate-rest": { + "version": "8.0.0", + "license": "MIT", "dependencies": { - "@smithy/types": "^2.3.5", - "tslib": "^2.5.0" + "@octokit/types": "^11.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=5" } }, - "node_modules/@smithy/abort-controller/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "license": "MIT" }, - "node_modules/@smithy/chunked-blob-reader": { - "version": "2.0.0", - "license": "Apache-2.0", + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "11.1.0", + "license": "MIT", "dependencies": { - "tslib": "^2.5.0" + "@octokit/openapi-types": "^18.0.0" } }, - "node_modules/@smithy/chunked-blob-reader-native": { - "version": "2.0.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-base64": "^2.0.0", - "tslib": "^2.5.0" + "node_modules/@octokit/plugin-request-log": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=5" } }, - "node_modules/@smithy/chunked-blob-reader-native/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" - }, - "node_modules/@smithy/chunked-blob-reader/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" - }, - "node_modules/@smithy/config-resolver": { - "version": "2.0.14", - "license": "Apache-2.0", + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "9.0.0", + "license": "MIT", "dependencies": { - "@smithy/node-config-provider": "^2.1.1", - "@smithy/types": "^2.3.5", - "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.4", - "tslib": "^2.5.0" + "@octokit/types": "^11.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=5" } }, - "node_modules/@smithy/config-resolver/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "license": "MIT" }, - "node_modules/@smithy/credential-provider-imds": { - "version": "2.0.16", - "license": "Apache-2.0", + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "11.1.0", + "license": "MIT", "dependencies": { - "@smithy/node-config-provider": "^2.1.1", - "@smithy/property-provider": "^2.0.12", - "@smithy/types": "^2.3.5", - "@smithy/url-parser": "^2.0.11", - "tslib": "^2.5.0" + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/@octokit/plugin-retry": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^11.0.0", + "bottleneck": "^2.15.3" }, "engines": { - "node": ">=14.0.0" + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=5" } }, - "node_modules/@smithy/credential-provider-imds/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@octokit/plugin-retry/node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "license": "MIT" }, - "node_modules/@smithy/eventstream-codec": { - "version": "2.0.11", - "license": "Apache-2.0", + "node_modules/@octokit/plugin-retry/node_modules/@octokit/types": { + "version": "11.1.0", + "license": "MIT", "dependencies": { - "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.3.5", - "@smithy/util-hex-encoding": "^2.0.0", - "tslib": "^2.5.0" + "@octokit/openapi-types": "^18.0.0" } }, - "node_modules/@smithy/eventstream-codec/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" - }, - "node_modules/@smithy/eventstream-serde-browser": { - "version": "2.0.11", - "license": "Apache-2.0", + "node_modules/@octokit/plugin-throttling": { + "version": "7.0.0", + "license": "MIT", "dependencies": { - "@smithy/eventstream-serde-universal": "^2.0.11", - "@smithy/types": "^2.3.5", - "tslib": "^2.5.0" + "@octokit/types": "^11.0.0", + "bottleneck": "^2.15.3" }, "engines": { - "node": ">=14.0.0" + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "^5.0.0" } }, - "node_modules/@smithy/eventstream-serde-browser/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@octokit/plugin-throttling/node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "license": "MIT" }, - "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "2.0.11", - "license": "Apache-2.0", + "node_modules/@octokit/plugin-throttling/node_modules/@octokit/types": { + "version": "11.1.0", + "license": "MIT", "dependencies": { - "@smithy/types": "^2.3.5", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" + "@octokit/openapi-types": "^18.0.0" } }, - "node_modules/@smithy/eventstream-serde-config-resolver/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" - }, - "node_modules/@smithy/eventstream-serde-node": { - "version": "2.0.11", - "license": "Apache-2.0", + "node_modules/@octokit/request": { + "version": "8.1.1", + "license": "MIT", "dependencies": { - "@smithy/eventstream-serde-universal": "^2.0.11", - "@smithy/types": "^2.3.5", - "tslib": "^2.5.0" + "@octokit/endpoint": "^9.0.0", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^11.1.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">= 18" } }, - "node_modules/@smithy/eventstream-serde-node/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" - }, - "node_modules/@smithy/eventstream-serde-universal": { - "version": "2.0.11", - "license": "Apache-2.0", + "node_modules/@octokit/request-error": { + "version": "5.0.0", + "license": "MIT", "dependencies": { - "@smithy/eventstream-codec": "^2.0.11", - "@smithy/types": "^2.3.5", - "tslib": "^2.5.0" + "@octokit/types": "^11.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" }, "engines": { - "node": ">=14.0.0" + "node": ">= 18" } }, - "node_modules/@smithy/eventstream-serde-universal/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "license": "MIT" }, - "node_modules/@smithy/fetch-http-handler": { - "version": "2.2.3", - "license": "Apache-2.0", + "node_modules/@octokit/request-error/node_modules/@octokit/types": { + "version": "11.1.0", + "license": "MIT", "dependencies": { - "@smithy/protocol-http": "^3.0.7", - "@smithy/querystring-builder": "^2.0.11", - "@smithy/types": "^2.3.5", - "@smithy/util-base64": "^2.0.0", - "tslib": "^2.5.0" + "@octokit/openapi-types": "^18.0.0" } }, - "node_modules/@smithy/fetch-http-handler/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@octokit/request/node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "license": "MIT" }, - "node_modules/@smithy/hash-blob-browser": { - "version": "2.0.11", - "license": "Apache-2.0", + "node_modules/@octokit/request/node_modules/@octokit/types": { + "version": "11.1.0", + "license": "MIT", "dependencies": { - "@smithy/chunked-blob-reader": "^2.0.0", - "@smithy/chunked-blob-reader-native": "^2.0.0", - "@smithy/types": "^2.3.5", - "tslib": "^2.5.0" + "@octokit/openapi-types": "^18.0.0" } }, - "node_modules/@smithy/hash-blob-browser/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" - }, - "node_modules/@smithy/hash-node": { - "version": "2.0.11", - "license": "Apache-2.0", + "node_modules/@octokit/rest": { + "version": "20.0.1", + "license": "MIT", "dependencies": { - "@smithy/types": "^2.3.5", - "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" + "@octokit/core": "^5.0.0", + "@octokit/plugin-paginate-rest": "^8.0.0", + "@octokit/plugin-request-log": "^4.0.0", + "@octokit/plugin-rest-endpoint-methods": "^9.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">= 18" } }, - "node_modules/@smithy/hash-node/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@octokit/types": { + "version": "9.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^17.1.2" + } }, - "node_modules/@smithy/hash-stream-node": { - "version": "2.0.11", + "node_modules/@opentelemetry/api": { + "version": "1.4.1", "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^2.3.5", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - }, "engines": { - "node": ">=14.0.0" + "node": ">=8.0.0" } }, - "node_modules/@smithy/hash-stream-node/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" - }, - "node_modules/@smithy/invalid-dependency": { - "version": "2.0.11", - "license": "Apache-2.0", + "node_modules/@opentelemetry/core": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.18.1.tgz", + "integrity": "sha512-kvnUqezHMhsQvdsnhnqTNfAJs3ox/isB0SVrM1dhVFw7SsB7TstuVa6fgWnN2GdPyilIFLUvvbTZoVRmx6eiRg==", "dependencies": { - "@smithy/types": "^2.3.5", - "tslib": "^2.5.0" + "@opentelemetry/semantic-conventions": "1.18.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" } }, - "node_modules/@smithy/invalid-dependency/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.18.1.tgz", + "integrity": "sha512-+NLGHr6VZwcgE/2lw8zDIufOCGnzsA5CbQIMleXZTrgkBd0TanCX+MiDYJ1TOS4KL/Tqk0nFRxawnaYr6pkZkA==", + "engines": { + "node": ">=14" + } }, - "node_modules/@smithy/is-array-buffer": { - "version": "2.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.5.0" - }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "license": "MIT", + "optional": true, "engines": { - "node": ">=14.0.0" + "node": ">=14" } }, - "node_modules/@smithy/is-array-buffer/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "license": "BSD-3-Clause" }, - "node_modules/@smithy/md5-js": { - "version": "2.0.11", - "license": "Apache-2.0", + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "license": "BSD-3-Clause", "dependencies": { - "@smithy/types": "^2.3.5", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, - "node_modules/@smithy/md5-js/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "license": "BSD-3-Clause" }, - "node_modules/@smithy/middleware-content-length": { - "version": "2.0.13", - "license": "Apache-2.0", + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@readme/better-ajv-errors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@readme/better-ajv-errors/-/better-ajv-errors-1.6.0.tgz", + "integrity": "sha512-9gO9rld84Jgu13kcbKRU+WHseNhaVt76wYMeRDGsUGYxwJtI3RmEJ9LY9dZCYQGI8eUZLuxb5qDja0nqklpFjQ==", "dependencies": { - "@smithy/protocol-http": "^3.0.7", - "@smithy/types": "^2.3.5", - "tslib": "^2.5.0" + "@babel/code-frame": "^7.16.0", + "@babel/runtime": "^7.21.0", + "@humanwhocodes/momoa": "^2.0.3", + "chalk": "^4.1.2", + "json-to-ast": "^2.0.3", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=14" + }, + "peerDependencies": { + "ajv": "4.11.8 - 8" } }, - "node_modules/@smithy/middleware-content-length/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "2.1.1", - "license": "Apache-2.0", + "node_modules/@readme/better-ajv-errors/node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dependencies": { - "@smithy/middleware-serde": "^2.0.11", - "@smithy/node-config-provider": "^2.1.1", - "@smithy/shared-ini-file-loader": "^2.2.0", - "@smithy/types": "^2.3.5", - "@smithy/url-parser": "^2.0.11", - "@smithy/util-middleware": "^2.0.4", - "tslib": "^2.5.0" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=6.9.0" } }, - "node_modules/@smithy/middleware-endpoint/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@readme/better-ajv-errors/node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/@smithy/middleware-retry": { - "version": "2.0.16", - "license": "Apache-2.0", + "node_modules/@readme/better-ajv-errors/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "@smithy/node-config-provider": "^2.1.1", - "@smithy/protocol-http": "^3.0.7", - "@smithy/service-error-classification": "^2.0.4", - "@smithy/types": "^2.3.5", - "@smithy/util-middleware": "^2.0.4", - "@smithy/util-retry": "^2.0.4", - "tslib": "^2.5.0", - "uuid": "^8.3.2" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=4" } }, - "node_modules/@smithy/middleware-retry/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@readme/better-ajv-errors/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } }, - "node_modules/@smithy/middleware-retry/node_modules/uuid": { - "version": "8.3.2", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/@readme/better-ajv-errors/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@readme/better-ajv-errors/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" } }, - "node_modules/@smithy/middleware-serde": { - "version": "2.0.11", - "license": "Apache-2.0", + "node_modules/@readme/better-ajv-errors/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@readme/better-ajv-errors/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { - "@smithy/types": "^2.3.5", - "tslib": "^2.5.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=4" } }, - "node_modules/@smithy/middleware-serde/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@readme/data-urls": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@readme/data-urls/-/data-urls-1.0.1.tgz", + "integrity": "sha512-FNP4ntG5rCgmrvQGoNH/Ljivc6jSWaaVeMuXneOyQ6oLuhm/NkysXJN3DnBrIsJUJbSae7qIs2QfPYnaropoHw==", + "engines": { + "node": ">=14" + } }, - "node_modules/@smithy/middleware-stack": { - "version": "2.0.5", - "license": "Apache-2.0", + "node_modules/@readme/http-status-codes": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@readme/http-status-codes/-/http-status-codes-7.2.0.tgz", + "integrity": "sha512-/dBh9qw3QhJYqlGwt2I+KUP/lQ6nytdCx3aq+GpMUhibLHF3O7fwoowNcTwlbnwtyJ+TJYTIIrp3oVUlRNx3fA==" + }, + "node_modules/@readme/json-schema-ref-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@readme/json-schema-ref-parser/-/json-schema-ref-parser-1.2.0.tgz", + "integrity": "sha512-Bt3QVovFSua4QmHa65EHUmh2xS0XJ3rgTEUPH998f4OW4VVJke3BuS16f+kM0ZLOGdvIrzrPRqwihuv5BAjtrA==", "dependencies": { - "@smithy/types": "^2.3.5", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" } }, - "node_modules/@smithy/middleware-stack/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@readme/oas-extensions": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/@readme/oas-extensions/-/oas-extensions-17.0.1.tgz", + "integrity": "sha512-PCU7WLz8TkbdxsiE4eQGvJYDYZQPiyLhXme3SvLboSmH+8G6AJPJ5OymzSAdlf5sXpSSoD2q3dTIou3Cb2DirQ==", + "deprecated": "The functionality for this library has been moved into `oas`.", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "oas": "^20.0.0" + } }, - "node_modules/@smithy/node-config-provider": { - "version": "2.1.1", - "license": "Apache-2.0", + "node_modules/@readme/oas-to-har": { + "version": "20.1.1", + "resolved": "https://registry.npmjs.org/@readme/oas-to-har/-/oas-to-har-20.1.1.tgz", + "integrity": "sha512-rz8YpdZw+Jqrd8VQhQaYrzctkCAYdBldoQ5qDQyF9vGvq2lpA1yMvQPgKCJXfPGXH8Cm+NjLbunxnYabKQeKeA==", "dependencies": { - "@smithy/property-provider": "^2.0.12", - "@smithy/shared-ini-file-loader": "^2.2.0", - "@smithy/types": "^2.3.5", - "tslib": "^2.5.0" + "@readme/data-urls": "^1.0.1", + "@readme/oas-extensions": "^17.0.1", + "oas": "^20.5.0", + "qs": "^6.10.5", + "remove-undefined-objects": "^2.0.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=14" } }, - "node_modules/@smithy/node-config-provider/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@readme/openapi-parser": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@readme/openapi-parser/-/openapi-parser-2.5.0.tgz", + "integrity": "sha512-IbymbOqRuUzoIgxfAAR7XJt2FWl6n2yqN09fF5adacGm7W03siA3bj1Emql0X9D2T+RpBYz3x9zDsMhuoMP62A==", + "dependencies": { + "@apidevtools/openapi-schemas": "^2.1.0", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "@readme/better-ajv-errors": "^1.6.0", + "@readme/json-schema-ref-parser": "^1.2.0", + "ajv": "^8.12.0", + "ajv-draft-04": "^1.0.0", + "call-me-maybe": "^1.0.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "openapi-types": ">=7" + } }, - "node_modules/@smithy/node-http-handler": { - "version": "2.1.7", - "license": "Apache-2.0", + "node_modules/@readme/openapi-parser/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { - "@smithy/abort-controller": "^2.0.11", - "@smithy/protocol-http": "^3.0.7", - "@smithy/querystring-builder": "^2.0.11", - "@smithy/types": "^2.3.5", - "tslib": "^2.5.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@readme/openapi-parser/node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@readme/openapi-parser/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/@readme/postman-to-openapi": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@readme/postman-to-openapi/-/postman-to-openapi-4.1.0.tgz", + "integrity": "sha512-VvV2Hzjskz01m8doSn7Ypt6cSZzgjnypVqXy1ipThbyYD6SGiM74VSePXykOODj/43Y2m6zeYedPk/ZLts/HvQ==", + "dependencies": { + "@readme/http-status-codes": "^7.2.0", + "js-yaml": "^4.1.0", + "jsonc-parser": "3.2.0", + "lodash.camelcase": "^4.3.0", + "marked": "^4.3.0", + "mustache": "^4.2.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=14" } }, - "node_modules/@smithy/node-http-handler/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@redis/bloom": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", + "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } }, - "node_modules/@smithy/property-provider": { - "version": "2.0.12", - "license": "Apache-2.0", + "node_modules/@redis/client": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.12.tgz", + "integrity": "sha512-/ZjE18HRzMd80eXIIUIPcH81UoZpwulbo8FmbElrjPqH0QC0SeIKu1BOU49bO5trM5g895kAjhvalt5h77q+4A==", "dependencies": { - "@smithy/types": "^2.3.5", - "tslib": "^2.5.0" + "cluster-key-slot": "1.1.2", + "generic-pool": "3.9.0", + "yallist": "4.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=14" } }, - "node_modules/@smithy/property-provider/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@redis/graph": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", + "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } }, - "node_modules/@smithy/protocol-http": { - "version": "3.0.7", - "license": "Apache-2.0", + "node_modules/@redis/json": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.6.tgz", + "integrity": "sha512-rcZO3bfQbm2zPRpqo82XbW8zg4G/w4W3tI7X8Mqleq9goQjAGLL7q/1n1ZX4dXEAmORVZ4s1+uKLaUOg7LrUhw==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/search": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.6.tgz", + "integrity": "sha512-mZXCxbTYKBQ3M2lZnEddwEAks0Kc7nauire8q20oA0oA/LoA+E/b5Y5KZn232ztPb1FkIGqo12vh3Lf+Vw5iTw==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/time-series": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.5.tgz", + "integrity": "sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@sentry/core": { + "version": "7.39.0", + "license": "MIT", "dependencies": { - "@smithy/types": "^2.3.5", - "tslib": "^2.5.0" + "@sentry/types": "7.39.0", + "@sentry/utils": "7.39.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=14.0.0" + "node": ">=8" } }, - "node_modules/@smithy/protocol-http/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@sentry/node": { + "version": "7.39.0", + "license": "MIT", + "dependencies": { + "@sentry/core": "7.39.0", + "@sentry/types": "7.39.0", + "@sentry/utils": "7.39.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/@smithy/querystring-builder": { - "version": "2.0.11", - "license": "Apache-2.0", + "node_modules/@sentry/types": { + "version": "7.39.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/utils": { + "version": "7.39.0", + "license": "MIT", "dependencies": { - "@smithy/types": "^2.3.5", - "@smithy/util-uri-escape": "^2.0.0", - "tslib": "^2.5.0" + "@sentry/types": "7.39.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=14.0.0" + "node": ">=8" } }, - "node_modules/@smithy/querystring-builder/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/@sideway/address": { + "version": "4.1.4", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } }, - "node_modules/@smithy/querystring-parser": { + "node_modules/@sideway/address/node_modules/@hapi/hoek": { + "version": "9.3.0", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@smithy/abort-controller": { "version": "2.0.11", "license": "Apache-2.0", "dependencies": { @@ -4330,307 +4470,365 @@ "node": ">=14.0.0" } }, - "node_modules/@smithy/querystring-parser/node_modules/tslib": { + "node_modules/@smithy/abort-controller/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/service-error-classification": { - "version": "2.0.4", + "node_modules/@smithy/chunked-blob-reader": { + "version": "2.0.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^2.3.5" - }, - "engines": { - "node": ">=14.0.0" + "tslib": "^2.5.0" } }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.2.0", + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "2.0.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/util-base64": "^2.0.0", "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" } }, - "node_modules/@smithy/shared-ini-file-loader/node_modules/tslib": { + "node_modules/@smithy/chunked-blob-reader-native/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/signature-v4": { - "version": "2.0.11", + "node_modules/@smithy/chunked-blob-reader/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/@smithy/config-resolver": { + "version": "2.0.14", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^2.0.11", - "@smithy/is-array-buffer": "^2.0.0", + "@smithy/node-config-provider": "^2.1.1", "@smithy/types": "^2.3.5", - "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-config-provider": "^2.0.0", "@smithy/util-middleware": "^2.0.4", - "@smithy/util-uri-escape": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@smithy/signature-v4/node_modules/tslib": { + "node_modules/@smithy/config-resolver/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/smithy-client": { - "version": "2.1.11", + "node_modules/@smithy/credential-provider-imds": { + "version": "2.0.16", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-stack": "^2.0.5", + "@smithy/node-config-provider": "^2.1.1", + "@smithy/property-provider": "^2.0.12", "@smithy/types": "^2.3.5", - "@smithy/util-stream": "^2.0.16", + "@smithy/url-parser": "^2.0.11", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@smithy/smithy-client/node_modules/tslib": { + "node_modules/@smithy/credential-provider-imds/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/types": { - "version": "2.3.5", + "node_modules/@smithy/eventstream-codec": { + "version": "2.0.11", "license": "Apache-2.0", "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.3.5", + "@smithy/util-hex-encoding": "^2.0.0", "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" } }, - "node_modules/@smithy/types/node_modules/tslib": { + "node_modules/@smithy/eventstream-codec/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/url-parser": { + "node_modules/@smithy/eventstream-serde-browser": { "version": "2.0.11", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^2.0.11", + "@smithy/eventstream-serde-universal": "^2.0.11", "@smithy/types": "^2.3.5", "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@smithy/url-parser/node_modules/tslib": { + "node_modules/@smithy/eventstream-serde-browser/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/util-base64": { - "version": "2.0.0", + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "2.0.11", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^2.0.0", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@smithy/util-base64/node_modules/tslib": { + "node_modules/@smithy/eventstream-serde-config-resolver/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/util-body-length-browser": { - "version": "2.0.0", + "node_modules/@smithy/eventstream-serde-node": { + "version": "2.0.11", "license": "Apache-2.0", "dependencies": { + "@smithy/eventstream-serde-universal": "^2.0.11", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@smithy/util-body-length-browser/node_modules/tslib": { + "node_modules/@smithy/eventstream-serde-node/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/util-body-length-node": { - "version": "2.1.0", + "node_modules/@smithy/eventstream-serde-universal": { + "version": "2.0.11", "license": "Apache-2.0", "dependencies": { + "@smithy/eventstream-codec": "^2.0.11", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@smithy/util-body-length-node/node_modules/tslib": { + "node_modules/@smithy/eventstream-serde-universal/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/util-buffer-from": { - "version": "2.0.0", + "node_modules/@smithy/fetch-http-handler": { + "version": "2.2.3", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^2.0.0", + "@smithy/protocol-http": "^3.0.7", + "@smithy/querystring-builder": "^2.0.11", + "@smithy/types": "^2.3.5", + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/fetch-http-handler/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/@smithy/hash-blob-browser": { + "version": "2.0.11", + "license": "Apache-2.0", + "dependencies": { + "@smithy/chunked-blob-reader": "^2.0.0", + "@smithy/chunked-blob-reader-native": "^2.0.0", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-blob-browser/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/@smithy/hash-node": { + "version": "2.0.11", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.3.5", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@smithy/util-buffer-from/node_modules/tslib": { + "node_modules/@smithy/hash-node/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/util-config-provider": { - "version": "2.0.0", + "node_modules/@smithy/hash-stream-node": { + "version": "2.0.11", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^2.3.5", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@smithy/util-config-provider/node_modules/tslib": { + "node_modules/@smithy/hash-stream-node/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.0.15", + "node_modules/@smithy/invalid-dependency": { + "version": "2.0.11", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^2.0.12", - "@smithy/smithy-client": "^2.1.11", "@smithy/types": "^2.3.5", - "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/invalid-dependency/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "license": "Apache-2.0", + "dependencies": { "tslib": "^2.5.0" }, "engines": { - "node": ">= 10.0.0" + "node": ">=14.0.0" } }, - "node_modules/@smithy/util-defaults-mode-browser/node_modules/tslib": { + "node_modules/@smithy/is-array-buffer/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.19", + "node_modules/@smithy/md5-js": { + "version": "2.0.11", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^2.0.14", - "@smithy/credential-provider-imds": "^2.0.16", - "@smithy/node-config-provider": "^2.1.1", - "@smithy/property-provider": "^2.0.12", - "@smithy/smithy-client": "^2.1.11", "@smithy/types": "^2.3.5", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" - }, - "engines": { - "node": ">= 10.0.0" } }, - "node_modules/@smithy/util-defaults-mode-node/node_modules/tslib": { + "node_modules/@smithy/md5-js/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/util-hex-encoding": { - "version": "2.0.0", + "node_modules/@smithy/middleware-content-length": { + "version": "2.0.13", "license": "Apache-2.0", "dependencies": { + "@smithy/protocol-http": "^3.0.7", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@smithy/util-hex-encoding/node_modules/tslib": { + "node_modules/@smithy/middleware-content-length/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/util-middleware": { - "version": "2.0.4", + "node_modules/@smithy/middleware-endpoint": { + "version": "2.1.1", "license": "Apache-2.0", "dependencies": { + "@smithy/middleware-serde": "^2.0.11", + "@smithy/node-config-provider": "^2.1.1", + "@smithy/shared-ini-file-loader": "^2.2.0", "@smithy/types": "^2.3.5", + "@smithy/url-parser": "^2.0.11", + "@smithy/util-middleware": "^2.0.4", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@smithy/util-middleware/node_modules/tslib": { + "node_modules/@smithy/middleware-endpoint/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/util-retry": { - "version": "2.0.4", + "node_modules/@smithy/middleware-retry": { + "version": "2.0.16", "license": "Apache-2.0", "dependencies": { + "@smithy/node-config-provider": "^2.1.1", + "@smithy/protocol-http": "^3.0.7", "@smithy/service-error-classification": "^2.0.4", "@smithy/types": "^2.3.5", - "tslib": "^2.5.0" + "@smithy/util-middleware": "^2.0.4", + "@smithy/util-retry": "^2.0.4", + "tslib": "^2.5.0", + "uuid": "^8.3.2" }, "engines": { - "node": ">= 14.0.0" + "node": ">=14.0.0" } }, - "node_modules/@smithy/util-retry/node_modules/tslib": { + "node_modules/@smithy/middleware-retry/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/util-stream": { - "version": "2.0.16", + "node_modules/@smithy/middleware-retry/node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.0.11", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^2.2.3", - "@smithy/node-http-handler": "^2.1.7", "@smithy/types": "^2.3.5", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@smithy/util-stream/node_modules/tslib": { + "node_modules/@smithy/middleware-serde/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/util-uri-escape": { - "version": "2.0.0", + "node_modules/@smithy/middleware-stack": { + "version": "2.0.5", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@smithy/util-uri-escape/node_modules/tslib": { + "node_modules/@smithy/middleware-stack/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/util-utf8": { - "version": "2.0.0", + "node_modules/@smithy/node-config-provider": { + "version": "2.1.1", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^2.0.0", + "@smithy/property-provider": "^2.0.12", + "@smithy/shared-ini-file-loader": "^2.2.0", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@smithy/util-utf8/node_modules/tslib": { + "node_modules/@smithy/node-config-provider/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@smithy/util-waiter": { - "version": "2.0.11", + "node_modules/@smithy/node-http-handler": { + "version": "2.1.7", "license": "Apache-2.0", "dependencies": { "@smithy/abort-controller": "^2.0.11", + "@smithy/protocol-http": "^3.0.7", + "@smithy/querystring-builder": "^2.0.11", "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, @@ -4638,1636 +4836,1774 @@ "node": ">=14.0.0" } }, - "node_modules/@smithy/util-waiter/node_modules/tslib": { + "node_modules/@smithy/node-http-handler/node_modules/tslib": { "version": "2.6.2", "license": "0BSD" }, - "node_modules/@swc/core": { - "version": "1.3.58", - "hasInstallScript": true, + "node_modules/@smithy/property-provider": { + "version": "2.0.12", "license": "Apache-2.0", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.3.58", - "@swc/core-darwin-x64": "1.3.58", - "@swc/core-linux-arm-gnueabihf": "1.3.58", - "@swc/core-linux-arm64-gnu": "1.3.58", - "@swc/core-linux-arm64-musl": "1.3.58", - "@swc/core-linux-x64-gnu": "1.3.58", - "@swc/core-linux-x64-musl": "1.3.58", - "@swc/core-win32-arm64-msvc": "1.3.58", - "@swc/core-win32-ia32-msvc": "1.3.58", - "@swc/core-win32-x64-msvc": "1.3.58" - }, - "peerDependencies": { - "@swc/helpers": "^0.5.0" + "dependencies": { + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.3.58", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=10" + "node": ">=14.0.0" } }, - "node_modules/@temporalio/activity": { - "version": "1.7.4", - "license": "MIT", + "node_modules/@smithy/property-provider/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/@smithy/protocol-http": { + "version": "3.0.7", + "license": "Apache-2.0", "dependencies": { - "@temporalio/common": "1.7.4", - "abort-controller": "^3.0.0" + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@temporalio/client": { - "version": "1.7.4", - "license": "MIT", - "dependencies": { - "@grpc/grpc-js": "~1.7.3", - "@temporalio/common": "1.7.4", - "@temporalio/proto": "1.7.4", - "abort-controller": "^3.0.0", - "long": "^5.2.0", - "uuid": "^8.3.2" - } - }, - "node_modules/@temporalio/client/node_modules/uuid": { - "version": "8.3.2", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } + "node_modules/@smithy/protocol-http/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" }, - "node_modules/@temporalio/common": { - "version": "1.7.4", - "license": "MIT", + "node_modules/@smithy/querystring-builder": { + "version": "2.0.11", + "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api": "^1.4.1", - "@temporalio/proto": "1.7.4", - "long": "^5.2.0", - "ms": "^2.1.3", - "proto3-json-serializer": "^1.0.3", - "protobufjs": "^7.0.0" + "@smithy/types": "^2.3.5", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@temporalio/common/node_modules/ms": { - "version": "2.1.3", - "license": "MIT" + "node_modules/@smithy/querystring-builder/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" }, - "node_modules/@temporalio/core-bridge": { - "version": "1.7.4", - "hasInstallScript": true, - "license": "MIT", + "node_modules/@smithy/querystring-parser": { + "version": "2.0.11", + "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api": "^1.4.1", - "@temporalio/common": "1.7.4", - "arg": "^5.0.2", - "cargo-cp-artifact": "^0.1.6", - "which": "^2.0.2" + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@temporalio/core-bridge/node_modules/arg": { - "version": "5.0.2", - "license": "MIT" + "node_modules/@smithy/querystring-parser/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" }, - "node_modules/@temporalio/proto": { - "version": "1.7.4", - "license": "MIT", + "node_modules/@smithy/service-error-classification": { + "version": "2.0.4", + "license": "Apache-2.0", "dependencies": { - "long": "^5.2.0", - "protobufjs": "^7.0.0" + "@smithy/types": "^2.3.5" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@temporalio/worker": { - "version": "1.7.4", - "license": "MIT", + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.2.0", + "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api": "^1.4.1", - "@swc/core": "^1.2.204", - "@temporalio/activity": "1.7.4", - "@temporalio/client": "1.7.4", - "@temporalio/common": "1.7.4", - "@temporalio/core-bridge": "1.7.4", - "@temporalio/proto": "1.7.4", - "@temporalio/workflow": "1.7.4", - "abort-controller": "^3.0.0", - "cargo-cp-artifact": "^0.1.6", - "heap-js": "^2.2.0", - "memfs": "^3.4.6", - "ms": "^2.1.3", - "rxjs": "^7.5.5", - "source-map": "^0.7.4", - "source-map-loader": "^4.0.0", - "swc-loader": "^0.2.3", - "unionfs": "^4.4.0", - "webpack": "^5.75.0" + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" }, "engines": { - "node": ">= 14.18.0" + "node": ">=14.0.0" } }, - "node_modules/@temporalio/worker/node_modules/ms": { - "version": "2.1.3", - "license": "MIT" + "node_modules/@smithy/shared-ini-file-loader/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" }, - "node_modules/@temporalio/workflow": { - "version": "1.7.4", - "license": "MIT", + "node_modules/@smithy/signature-v4": { + "version": "2.0.11", + "license": "Apache-2.0", "dependencies": { - "@temporalio/common": "1.7.4", - "@temporalio/proto": "1.7.4" + "@smithy/eventstream-codec": "^2.0.11", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.3.5", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.4", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/@tsconfig/node18-strictest-esm": { - "version": "1.0.1", - "dev": true, - "license": "MIT" + "node_modules/@smithy/signature-v4/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" }, - "node_modules/@types/amqplib": { - "version": "0.8.2", - "dev": true, - "license": "MIT", + "node_modules/@smithy/smithy-client": { + "version": "2.1.11", + "license": "Apache-2.0", "dependencies": { - "@types/bluebird": "*", - "@types/node": "*" + "@smithy/middleware-stack": "^2.0.5", + "@smithy/types": "^2.3.5", + "@smithy/util-stream": "^2.0.16", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@types/archiver": { - "version": "5.3.2", - "dev": true, - "license": "MIT", + "node_modules/@smithy/smithy-client/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/@smithy/types": { + "version": "2.3.5", + "license": "Apache-2.0", "dependencies": { - "@types/readdir-glob": "*" + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.20.1", - "dev": true, - "license": "MIT", + "node_modules/@smithy/types/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/@smithy/url-parser": { + "version": "2.0.11", + "license": "Apache-2.0", "dependencies": { - "@babel/types": "^7.20.7" + "@smithy/querystring-parser": "^2.0.11", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" } }, - "node_modules/@types/babel-traverse": { - "version": "6.25.7", - "dev": true, - "license": "MIT", + "node_modules/@smithy/url-parser/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/@smithy/util-base64": { + "version": "2.0.0", + "license": "Apache-2.0", "dependencies": { - "@types/babel-types": "*" + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@types/babel-types": { - "version": "7.0.11", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/bluebird": { - "version": "3.5.38", - "dev": true, - "license": "MIT" + "node_modules/@smithy/util-base64/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "license": "Apache-2.0", "dependencies": { - "@types/connect": "*", - "@types/node": "*" + "tslib": "^2.5.0" } }, - "node_modules/@types/braintree": { - "version": "3.3.6", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-body-length-browser/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/@smithy/util-body-length-node": { + "version": "2.1.0", + "license": "Apache-2.0", "dependencies": { - "@types/node": "*" + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@types/buffer-from": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/chai": { - "version": "4.3.5", - "dev": true, - "license": "MIT" + "node_modules/@smithy/util-body-length-node/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" }, - "node_modules/@types/chai-subset": { - "version": "1.3.3", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "license": "Apache-2.0", "dependencies": { - "@types/chai": "*" + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@types/commander": { - "version": "2.12.2", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "*" - } + "node_modules/@smithy/util-buffer-from/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" }, - "node_modules/@types/connect": { - "version": "3.4.35", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "license": "Apache-2.0", "dependencies": { - "@types/node": "*" + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@types/cookie-parser": { - "version": "1.4.3", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-config-provider/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.15", + "license": "Apache-2.0", "dependencies": { - "@types/express": "*" + "@smithy/property-provider": "^2.0.12", + "@smithy/smithy-client": "^2.1.11", + "@smithy/types": "^2.3.5", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/@types/cors": { - "version": "2.8.12", - "dev": true, - "license": "MIT" + "node_modules/@smithy/util-defaults-mode-browser/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" }, - "node_modules/@types/debug": { - "version": "4.1.7", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.19", + "license": "Apache-2.0", "dependencies": { - "@types/ms": "*" + "@smithy/config-resolver": "^2.0.14", + "@smithy/credential-provider-imds": "^2.0.16", + "@smithy/node-config-provider": "^2.1.1", + "@smithy/property-provider": "^2.0.12", + "@smithy/smithy-client": "^2.1.11", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/@types/docker-modem": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/ssh2": "*" - } + "node_modules/@smithy/util-defaults-mode-node/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" }, - "node_modules/@types/dockerode": { - "version": "3.3.19", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "license": "Apache-2.0", "dependencies": { - "@types/docker-modem": "*", - "@types/node": "*" + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@types/ejs": { - "version": "3.1.2", - "dev": true, - "license": "MIT" + "node_modules/@smithy/util-hex-encoding/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" }, - "node_modules/@types/eslint": { - "version": "8.37.0", - "license": "MIT", + "node_modules/@smithy/util-middleware": { + "version": "2.0.4", + "license": "Apache-2.0", "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "license": "MIT", + "node_modules/@smithy/util-middleware/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/@smithy/util-retry": { + "version": "2.0.4", + "license": "Apache-2.0", "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "@smithy/service-error-classification": "^2.0.4", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@types/estree": { - "version": "1.0.1", - "license": "MIT" + "node_modules/@smithy/util-retry/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" }, - "node_modules/@types/express": { - "version": "4.17.14", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-stream": { + "version": "2.0.16", + "license": "Apache-2.0", "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" + "@smithy/fetch-http-handler": "^2.2.3", + "@smithy/node-http-handler": "^2.1.7", + "@smithy/types": "^2.3.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.31", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } + "node_modules/@smithy/util-stream/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" }, - "node_modules/@types/express-session": { - "version": "1.17.6", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "license": "Apache-2.0", "dependencies": { - "@types/express": "*" + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@types/figlet": { - "version": "1.5.6", - "dev": true, - "license": "MIT" + "node_modules/@smithy/util-uri-escape/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" }, - "node_modules/@types/fs-extra": { - "version": "11.0.1", - "license": "MIT", + "node_modules/@smithy/util-utf8": { + "version": "2.0.0", + "license": "Apache-2.0", "dependencies": { - "@types/jsonfile": "*", - "@types/node": "*" + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@types/glob": { - "version": "8.1.0", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-utf8/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/@smithy/util-waiter": { + "version": "2.0.11", + "license": "Apache-2.0", "dependencies": { - "@types/minimatch": "^5.1.2", - "@types/node": "*" + "@smithy/abort-controller": "^2.0.11", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@types/human-to-cron": { - "version": "0.3.0", - "dev": true, - "license": "MIT" + "node_modules/@smithy/util-waiter/node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" }, - "node_modules/@types/ip": { - "version": "1.1.0", - "dev": true, + "node_modules/@swc/core": { + "version": "1.3.58", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.3.58", + "@swc/core-darwin-x64": "1.3.58", + "@swc/core-linux-arm-gnueabihf": "1.3.58", + "@swc/core-linux-arm64-gnu": "1.3.58", + "@swc/core-linux-arm64-musl": "1.3.58", + "@swc/core-linux-x64-gnu": "1.3.58", + "@swc/core-linux-x64-musl": "1.3.58", + "@swc/core-win32-arm64-msvc": "1.3.58", + "@swc/core-win32-ia32-msvc": "1.3.58", + "@swc/core-win32-x64-msvc": "1.3.58" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.3.58", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@temporalio/activity": { + "version": "1.7.4", "license": "MIT", "dependencies": { - "@types/node": "*" + "@temporalio/common": "1.7.4", + "abort-controller": "^3.0.0" } }, - "node_modules/@types/js-yaml": { - "version": "4.0.5", - "dev": true, + "node_modules/@temporalio/client": { + "version": "1.7.4", + "license": "MIT", + "dependencies": { + "@grpc/grpc-js": "~1.7.3", + "@temporalio/common": "1.7.4", + "@temporalio/proto": "1.7.4", + "abort-controller": "^3.0.0", + "long": "^5.2.0", + "uuid": "^8.3.2" + } + }, + "node_modules/@temporalio/client/node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@temporalio/common": { + "version": "1.7.4", + "license": "MIT", + "dependencies": { + "@opentelemetry/api": "^1.4.1", + "@temporalio/proto": "1.7.4", + "long": "^5.2.0", + "ms": "^2.1.3", + "proto3-json-serializer": "^1.0.3", + "protobufjs": "^7.0.0" + } + }, + "node_modules/@temporalio/common/node_modules/ms": { + "version": "2.1.3", "license": "MIT" }, - "node_modules/@types/json-schema": { - "version": "7.0.11", + "node_modules/@temporalio/core-bridge": { + "version": "1.7.4", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@opentelemetry/api": "^1.4.1", + "@temporalio/common": "1.7.4", + "arg": "^5.0.2", + "cargo-cp-artifact": "^0.1.6", + "which": "^2.0.2" + } + }, + "node_modules/@temporalio/core-bridge/node_modules/arg": { + "version": "5.0.2", "license": "MIT" }, - "node_modules/@types/jsonfile": { - "version": "6.1.1", + "node_modules/@temporalio/proto": { + "version": "1.7.4", "license": "MIT", "dependencies": { - "@types/node": "*" + "long": "^5.2.0", + "protobufjs": "^7.0.0" } }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.1", - "dev": true, + "node_modules/@temporalio/worker": { + "version": "1.7.4", "license": "MIT", "dependencies": { - "@types/node": "*" + "@opentelemetry/api": "^1.4.1", + "@swc/core": "^1.2.204", + "@temporalio/activity": "1.7.4", + "@temporalio/client": "1.7.4", + "@temporalio/common": "1.7.4", + "@temporalio/core-bridge": "1.7.4", + "@temporalio/proto": "1.7.4", + "@temporalio/workflow": "1.7.4", + "abort-controller": "^3.0.0", + "cargo-cp-artifact": "^0.1.6", + "heap-js": "^2.2.0", + "memfs": "^3.4.6", + "ms": "^2.1.3", + "rxjs": "^7.5.5", + "source-map": "^0.7.4", + "source-map-loader": "^4.0.0", + "swc-loader": "^0.2.3", + "unionfs": "^4.4.0", + "webpack": "^5.75.0" + }, + "engines": { + "node": ">= 14.18.0" } }, - "node_modules/@types/lodash": { - "version": "4.14.195", - "dev": true, + "node_modules/@temporalio/worker/node_modules/ms": { + "version": "2.1.3", "license": "MIT" }, - "node_modules/@types/lodash-es": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.10.tgz", - "integrity": "sha512-YJP+w/2khSBwbUSFdGsSqmDvmnN3cCKoPOL7Zjle6s30ZtemkkqhjVfFqGwPN7ASil5VyjE2GtyU/yqYY6mC0A==", - "dev": true, + "node_modules/@temporalio/workflow": { + "version": "1.7.4", + "license": "MIT", "dependencies": { - "@types/lodash": "*" + "@temporalio/common": "1.7.4", + "@temporalio/proto": "1.7.4" } }, - "node_modules/@types/long": { - "version": "4.0.2", - "license": "MIT" + "node_modules/@trpc/client": { + "version": "10.44.1", + "resolved": "https://registry.npmjs.org/@trpc/client/-/client-10.44.1.tgz", + "integrity": "sha512-vTWsykNcgz1LnwePVl2fKZnhvzP9N3GaaLYPkfGINo314ZOS0OBqe9x0ytB2LLUnRVTAAZ2WoONzARd8nHiqrA==", + "funding": [ + "https://trpc.io/sponsor" + ], + "peerDependencies": { + "@trpc/server": "10.44.1" + } }, - "node_modules/@types/md5": { - "version": "2.3.2", - "dev": true, - "license": "MIT" + "node_modules/@trpc/server": { + "version": "10.44.1", + "resolved": "https://registry.npmjs.org/@trpc/server/-/server-10.44.1.tgz", + "integrity": "sha512-mF7B+K6LjuboX8I1RZgKE5GA/fJhsJ8tKGK2UBt3Bwik7hepEPb4NJgNr7vO6BK5IYwPdBLRLTctRw6XZx0sRg==", + "funding": [ + "https://trpc.io/sponsor" + ], + "engines": { + "node": ">=18.0.0" + } }, - "node_modules/@types/mime": { - "version": "3.0.1", - "dev": true, - "license": "MIT" + "node_modules/@ts-morph/common": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.18.1.tgz", + "integrity": "sha512-RVE+zSRICWRsfrkAw5qCAK+4ZH9kwEFv5h0+/YeHTLieWP7F4wWq4JsKFuNWG+fYh/KF+8rAtgdj5zb2mm+DVA==", + "dependencies": { + "fast-glob": "^3.2.12", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + } }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "dev": true, - "license": "MIT" + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } }, - "node_modules/@types/ms": { - "version": "0.7.31", - "dev": true, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", "license": "MIT" }, - "node_modules/@types/node": { - "version": "18.17.1", + "node_modules/@tsconfig/node12": { + "version": "1.0.11", "license": "MIT" }, - "node_modules/@types/node-cron": { - "version": "3.0.7", - "dev": true, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", "license": "MIT" }, - "node_modules/@types/npm-package-arg": { - "version": "6.1.1", - "dev": true, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", "license": "MIT" }, - "node_modules/@types/oauth": { - "version": "0.9.1", + "node_modules/@tsconfig/node18-strictest-esm": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node18-strictest-esm/-/node18-strictest-esm-1.0.1.tgz", + "integrity": "sha512-cHzmAqw7CMbyqROWeBgVhard3F2V6zxOSJnQ4E6SJWruXD5ypuP9/QKekwBdfXQ4oUTaizIICKIwb+v3v33t0w==", + "deprecated": "TypeScript 5.0 supports combining TSConfigs using array syntax in extends", + "dev": true + }, + "node_modules/@types/amqplib": { + "version": "0.8.2", "dev": true, "license": "MIT", "dependencies": { + "@types/bluebird": "*", "@types/node": "*" } }, - "node_modules/@types/pako": { - "version": "1.0.4", - "license": "MIT" - }, - "node_modules/@types/parse-link-header": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-link-header/-/parse-link-header-2.0.2.tgz", - "integrity": "sha512-RKU5SIF0oyM2ZI0ubw66FkM/0RJUv/r84I7vJcXkcICcfeOpd1WXfpcqkFJPaWli5z3YdxMsfWojyU5uofT6sA==", - "dev": true - }, - "node_modules/@types/passport": { - "version": "1.0.12", + "node_modules/@types/archiver": { + "version": "5.3.2", "dev": true, "license": "MIT", "dependencies": { - "@types/express": "*" + "@types/readdir-glob": "*" } }, - "node_modules/@types/passport-http": { - "version": "0.3.9", + "node_modules/@types/babel__traverse": { + "version": "7.20.1", "dev": true, "license": "MIT", "dependencies": { - "@types/express": "*", - "@types/passport": "*" + "@babel/types": "^7.20.7" } }, - "node_modules/@types/passport-local": { - "version": "1.0.35", + "node_modules/@types/babel-traverse": { + "version": "6.25.7", "dev": true, "license": "MIT", "dependencies": { - "@types/express": "*", - "@types/passport": "*", - "@types/passport-strategy": "*" + "@types/babel-types": "*" } }, - "node_modules/@types/passport-strategy": { - "version": "0.2.35", + "node_modules/@types/babel-types": { + "version": "7.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/bluebird": { + "version": "3.5.38", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", "dev": true, "license": "MIT", "dependencies": { - "@types/express": "*", - "@types/passport": "*" + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/@types/promptly": { - "version": "3.0.2", + "node_modules/@types/braintree": { + "version": "3.3.6", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" } }, - "node_modules/@types/qs": { - "version": "6.9.7", - "dev": true, - "license": "MIT" + "node_modules/@types/buffer-from": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } }, - "node_modules/@types/range-parser": { - "version": "1.2.4", + "node_modules/@types/chai": { + "version": "4.3.5", "dev": true, "license": "MIT" }, - "node_modules/@types/readdir-glob": { - "version": "1.1.1", + "node_modules/@types/chai-subset": { + "version": "1.3.3", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@types/chai": "*" } }, - "node_modules/@types/semver": { - "version": "7.3.13", + "node_modules/@types/commander": { + "version": "2.12.2", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "commander": "*" + } }, - "node_modules/@types/serve-static": { - "version": "1.15.0", + "node_modules/@types/connect": { + "version": "3.4.35", "dev": true, "license": "MIT", "dependencies": { - "@types/mime": "*", "@types/node": "*" } }, - "node_modules/@types/simple-oauth2": { - "version": "4.1.1", + "node_modules/@types/connect-timeout": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/connect-timeout/-/connect-timeout-0.0.39.tgz", + "integrity": "sha512-PHUX9yixjm4qjQ27Uz+F5cyG9Fio9iY7e6eWHvNT0wbA8eu9JaDqxRRiXn5uYnd09zx1fM+wEHnuBHMm9gwOuQ==", "dev": true, - "license": "MIT" + "dependencies": { + "@types/express": "*" + } }, - "node_modules/@types/ssh2": { - "version": "1.11.13", + "node_modules/@types/cookie-parser": { + "version": "1.4.3", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "^18.11.18" + "@types/express": "*" } }, - "node_modules/@types/ssh2-streams": { - "version": "0.1.9", + "node_modules/@types/cors": { + "version": "2.8.12", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.7", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@types/ms": "*" } }, - "node_modules/@types/triple-beam": { - "version": "1.3.2", - "license": "MIT" - }, - "node_modules/@types/uuid": { - "version": "8.3.4", + "node_modules/@types/docker-modem": { + "version": "3.0.2", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/ssh2": "*" + } }, - "node_modules/@types/ws": { - "version": "8.5.4", + "node_modules/@types/dockerode": { + "version": "3.3.19", "dev": true, "license": "MIT", "dependencies": { + "@types/docker-modem": "*", "@types/node": "*" } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.44.0", + "node_modules/@types/ejs": { + "version": "3.1.2", "dev": true, + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "8.37.0", "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "5.44.0", - "@typescript-eslint/type-utils": "5.44.0", - "@typescript-eslint/utils": "5.44.0", - "debug": "^4.3.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.44.0", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "5.44.0", - "@typescript-eslint/types": "5.44.0", - "@typescript-eslint/typescript-estree": "5.44.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@types/eslint": "*", + "@types/estree": "*" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.44.0", + "node_modules/@types/estree": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.14", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.44.0", - "@typescript-eslint/visitor-keys": "5.44.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.44.0", + "node_modules/@types/express-serve-static-core": { + "version": "4.17.31", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.44.0", - "@typescript-eslint/utils": "5.44.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.44.0", + "node_modules/@types/express-session": { + "version": "1.17.6", "dev": true, "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "dependencies": { + "@types/express": "*" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.44.0", + "node_modules/@types/figlet": { + "version": "1.5.6", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT" + }, + "node_modules/@types/fs-extra": { + "version": "11.0.1", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.44.0", - "@typescript-eslint/visitor-keys": "5.44.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@types/jsonfile": "*", + "@types/node": "*" } }, - "node_modules/@typescript-eslint/utils": { - "version": "5.44.0", + "node_modules/@types/glob": { + "version": "8.1.0", "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.44.0", - "@typescript-eslint/types": "5.44.0", - "@typescript-eslint/typescript-estree": "5.44.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@types/minimatch": "^5.1.2", + "@types/node": "*" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.44.0", + "node_modules/@types/har-format": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.15.tgz", + "integrity": "sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==" + }, + "node_modules/@types/human-to-cron": { + "version": "0.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ip": { + "version": "1.1.0", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.44.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@types/node": "*" } }, - "node_modules/@vercel/ncc": { - "version": "0.36.1", + "node_modules/@types/js-yaml": { + "version": "4.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "license": "MIT" + }, + "node_modules/@types/jsonfile": { + "version": "6.1.1", "license": "MIT", - "bin": { - "ncc": "dist/ncc/cli.js" + "dependencies": { + "@types/node": "*" } }, - "node_modules/@vitest/expect": { - "version": "0.33.0", + "node_modules/@types/jsonwebtoken": { + "version": "9.0.1", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "0.33.0", - "@vitest/utils": "0.33.0", - "chai": "^4.3.7" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "@types/node": "*" } }, - "node_modules/@vitest/runner": { - "version": "0.33.0", + "node_modules/@types/lodash": { + "version": "4.14.195", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.10.tgz", + "integrity": "sha512-YJP+w/2khSBwbUSFdGsSqmDvmnN3cCKoPOL7Zjle6s30ZtemkkqhjVfFqGwPN7ASil5VyjE2GtyU/yqYY6mC0A==", "dev": true, - "license": "MIT", "dependencies": { - "@vitest/utils": "0.33.0", - "p-limit": "^4.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "@types/lodash": "*" } }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "4.0.0", + "node_modules/@types/long": { + "version": "4.0.2", + "license": "MIT" + }, + "node_modules/@types/md5": { + "version": "2.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "0.7.31", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.17.1", + "license": "MIT" + }, + "node_modules/@types/node-cron": { + "version": "3.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/npm-package-arg": { + "version": "6.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/oauth": { + "version": "0.9.1", "dev": true, "license": "MIT", "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/node": "*" } }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", + "node_modules/@types/pako": { + "version": "1.0.4", + "license": "MIT" + }, + "node_modules/@types/parse-link-header": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-link-header/-/parse-link-header-2.0.2.tgz", + "integrity": "sha512-RKU5SIF0oyM2ZI0ubw66FkM/0RJUv/r84I7vJcXkcICcfeOpd1WXfpcqkFJPaWli5z3YdxMsfWojyU5uofT6sA==", + "dev": true + }, + "node_modules/@types/passport": { + "version": "1.0.12", "dev": true, "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "@types/express": "*" } }, - "node_modules/@vitest/snapshot": { - "version": "0.33.0", + "node_modules/@types/passport-http": { + "version": "0.3.9", "dev": true, "license": "MIT", "dependencies": { - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "pretty-format": "^29.5.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "@types/express": "*", + "@types/passport": "*" } }, - "node_modules/@vitest/spy": { - "version": "0.33.0", + "node_modules/@types/passport-local": { + "version": "1.0.35", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^2.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "@types/express": "*", + "@types/passport": "*", + "@types/passport-strategy": "*" } }, - "node_modules/@vitest/utils": { - "version": "0.33.0", + "node_modules/@types/passport-strategy": { + "version": "0.2.35", "dev": true, "license": "MIT", "dependencies": { - "diff-sequences": "^29.4.3", - "loupe": "^2.3.6", - "pretty-format": "^29.5.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "@types/express": "*", + "@types/passport": "*" } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", + "node_modules/@types/promptly": { + "version": "3.0.2", + "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@types/node": "*" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", + "node_modules/@types/qs": { + "version": "6.9.7", + "dev": true, "license": "MIT" }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", + "node_modules/@types/range-parser": { + "version": "1.2.4", + "dev": true, "license": "MIT" }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", + "node_modules/@types/readdir-glob": { + "version": "1.1.1", + "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" + "@types/node": "*" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", + "node_modules/@types/semver": { + "version": "7.3.13", + "dev": true, "license": "MIT" }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", + "node_modules/@types/serve-static": { + "version": "1.15.0", + "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@types/mime": "*", + "@types/node": "*" } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", + "node_modules/@types/simple-oauth2": { + "version": "4.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ssh2": { + "version": "1.11.13", + "dev": true, "license": "MIT", "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "@types/node": "^18.11.18" } }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "license": "Apache-2.0", + "node_modules/@types/ssh2-streams": { + "version": "0.1.9", + "dev": true, + "license": "MIT", "dependencies": { - "@xtuc/long": "4.2.2" + "@types/node": "*" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", + "node_modules/@types/triple-beam": { + "version": "1.3.2", "license": "MIT" }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } + "node_modules/@types/uuid": { + "version": "8.3.4", + "dev": true, + "license": "MIT" }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", + "node_modules/@types/ws": { + "version": "8.5.4", + "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@types/node": "*" } }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.44.0", + "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@typescript-eslint/scope-manager": "5.44.0", + "@typescript-eslint/type-utils": "5.44.0", + "@typescript-eslint/utils": "5.44.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "license": "MIT", + "node_modules/@typescript-eslint/parser": { + "version": "5.44.0", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@typescript-eslint/scope-manager": "5.44.0", + "@typescript-eslint/types": "5.44.0", + "@typescript-eslint/typescript-estree": "5.44.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.44.0", + "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" + "@typescript-eslint/types": "5.44.0", + "@typescript-eslint/visitor-keys": "5.44.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@webpack-cli/configtest": { - "version": "2.1.1", + "node_modules/@typescript-eslint/type-utils": { + "version": "5.44.0", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.44.0", + "@typescript-eslint/utils": "5.44.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, "engines": { - "node": ">=14.15.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@webpack-cli/info": { - "version": "2.0.2", + "node_modules/@typescript-eslint/types": { + "version": "5.44.0", "dev": true, "license": "MIT", "engines": { - "node": ">=14.15.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.5", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.44.0", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.44.0", + "@typescript-eslint/visitor-keys": "5.44.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, "engines": { - "node": ">=14.15.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { - "webpack-dev-server": { + "typescript": { "optional": true } } }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "license": "Apache-2.0" - }, - "node_modules/abab": { - "version": "2.0.6", - "license": "BSD-3-Clause" - }, - "node_modules/abbrev": { - "version": "1.1.1", + "node_modules/@typescript-eslint/utils": { + "version": "5.44.0", "dev": true, - "license": "ISC" - }, - "node_modules/abort-controller": { - "version": "3.0.0", "license": "MIT", "dependencies": { - "event-target-shim": "^5.0.0" + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.44.0", + "@typescript-eslint/types": "5.44.0", + "@typescript-eslint/typescript-estree": "5.44.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" }, "engines": { - "node": ">=6.5" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/accepts": { - "version": "1.3.8", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.44.0", + "dev": true, "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "@typescript-eslint/types": "5.44.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">= 0.6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/acorn": { - "version": "8.10.0", + "node_modules/@vercel/ncc": { + "version": "0.36.1", "license": "MIT", "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "ncc": "dist/ncc/cli.js" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", + "node_modules/@vitest/expect": { + "version": "0.33.0", + "dev": true, "license": "MIT", - "peerDependencies": { - "acorn": "^8" + "dependencies": { + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "chai": "^4.3.7" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", + "node_modules/@vitest/runner": { + "version": "0.33.0", "dev": true, "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "dependencies": { + "@vitest/utils": "0.33.0", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/acorn-walk": { - "version": "8.2.0", + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "dev": true, "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, "engines": { - "node": ">=0.4.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/agent-base": { - "version": "6.0.2", + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "debug": "4" - }, "engines": { - "node": ">= 6.0.0" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ajv": { - "version": "6.12.6", + "node_modules/@vitest/snapshot": { + "version": "0.33.0", + "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://opencollective.com/vitest" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", + "node_modules/@vitest/spy": { + "version": "0.33.0", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" + "tinyspy": "^2.1.1" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", + "node_modules/@vitest/utils": { + "version": "0.33.0", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://opencollective.com/vitest" } }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", "license": "MIT" }, - "node_modules/ajv-keywords": { - "version": "3.5.2", + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" } }, - "node_modules/amqplib": { - "version": "0.10.3", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", "license": "MIT", "dependencies": { - "@acuminous/bitsyntax": "^0.1.2", - "buffer-more-ints": "~1.0.0", - "readable-stream": "1.x >=1.1.9", - "url-parse": "~1.5.10" - }, - "engines": { - "node": ">=10" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, - "node_modules/amqplib/node_modules/readable-stream": { - "version": "1.1.14", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/amqplib/node_modules/string_decoder": { - "version": "0.10.31", + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", "license": "MIT" }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "dev": true, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14.15.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, - "node_modules/any-promise": { - "version": "1.3.0", + "node_modules/@webpack-cli/info": { + "version": "2.0.2", "dev": true, - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, - "node_modules/archiver": { - "version": "5.3.1", + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", "dev": true, "license": "MIT", - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.3", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, "engines": { - "node": ">= 10" + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } } }, - "node_modules/archiver-utils": { - "version": "2.1.0", + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "license": "Apache-2.0" + }, + "node_modules/abab": { + "version": "2.0.6", + "license": "BSD-3-Clause" + }, + "node_modules/abbrev": { + "version": "1.1.1", "dev": true, + "license": "ISC" + }, + "node_modules/abort-controller": { + "version": "3.0.0", "license": "MIT", "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" + "event-target-shim": "^5.0.0" }, "engines": { - "node": ">= 6" + "node": ">=6.5" } }, - "node_modules/archiver-utils/node_modules/isarray": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "2.3.8", - "dev": true, + "node_modules/accepts": { + "version": "1.3.8", "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/archiver-utils/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/archiver-utils/node_modules/string_decoder": { - "version": "1.1.1", - "dev": true, + "node_modules/acorn": { + "version": "8.10.0", "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "node_modules/arg": { - "version": "4.1.3", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "license": "Python-2.0" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/array-union": { - "version": "2.1.0", - "dev": true, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", "license": "MIT", - "engines": { - "node": ">=8" + "peerDependencies": { + "acorn": "^8" } }, - "node_modules/asn1": { - "version": "0.2.6", + "node_modules/acorn-jsx": { + "version": "5.3.2", "dev": true, "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/assertion-error": { - "version": "1.1.0", - "dev": true, + "node_modules/acorn-walk": { + "version": "8.2.0", "license": "MIT", "engines": { - "node": "*" + "node": ">=0.4.0" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "dev": true, + "node_modules/agent-base": { + "version": "6.0.2", "license": "MIT", + "dependencies": { + "debug": "4" + }, "engines": { - "node": ">=8" + "node": ">= 6.0.0" } }, - "node_modules/async": { - "version": "3.2.4", - "license": "MIT" - }, - "node_modules/async-lock": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", - "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", + "node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/b4a": { - "version": "1.6.4", - "license": "ISC" - }, - "node_modules/babel-loader": { - "version": "9.1.2", + "node_modules/ajv-formats": { + "version": "2.1.1", "dev": true, "license": "MIT", "dependencies": { - "find-cache-dir": "^3.3.2", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" + "ajv": "^8.0.0" }, "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.3", + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.4.0", - "semver": "^6.1.1" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } + "license": "MIT" }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.1", - "dev": true, + "node_modules/ajv-keywords": { + "version": "3.5.2", "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.0", - "core-js-compat": "^3.30.1" - }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "ajv": "^6.9.1" } }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.0", - "dev": true, + "node_modules/amqplib": { + "version": "0.10.3", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.0" + "@acuminous/bitsyntax": "^0.1.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "url-parse": "~1.5.10" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=10" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "license": "MIT" + "node_modules/amqplib/node_modules/readable-stream": { + "version": "1.1.14", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } }, - "node_modules/base-64": { - "version": "1.0.0", + "node_modules/amqplib/node_modules/string_decoder": { + "version": "0.10.31", "license": "MIT" }, - "node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", + "node_modules/ansi-colors": { + "version": "4.1.3", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "license": "Apache-2.0" - }, - "node_modules/binary-extensions": { - "version": "2.2.0", "license": "MIT", "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "5.1.0", - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "node": ">=6" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.1", + "node_modules/ansi-escapes": { + "version": "4.3.2", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "type-fest": "^0.21.3" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "license": "MIT" - }, - "node_modules/bowser": { - "version": "2.11.0", - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", + "node_modules/ansi-regex": { + "version": "5.0.1", "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=8" } }, - "node_modules/braces": { - "version": "3.0.2", + "node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/braintree": { - "version": "3.15.0", - "license": "MIT", + "node_modules/any-promise": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "license": "ISC", "dependencies": { - "@braintree/wrap-promise": "2.1.0", - "dateformat": "4.5.1", - "xml2js": "0.5.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=10.0", - "npm": ">=6" + "node": ">= 8" } }, - "node_modules/browserslist": { - "version": "4.21.5", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "license": "MIT", + "node_modules/api": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/api/-/api-6.1.1.tgz", + "integrity": "sha512-we3fnLinpYWlKOHdX4S/Ky9gZvColCnht/qhtv04K2jQbrC/z4SxvZVAT8W8PCC5NLLU4H35r3u4Lt77ZaiY9w==", "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "@readme/oas-to-har": "^20.0.2", + "@readme/openapi-parser": "^2.4.0", + "caseless": "^0.12.0", + "chalk": "^4.1.2", + "commander": "^10.0.0", + "datauri": "^4.1.0", + "execa": "^5.1.1", + "fetch-har": "^8.1.5", + "figures": "^3.2.0", + "find-cache-dir": "^3.3.1", + "form-data-encoder": "^1.7.2", + "formdata-node": "^4.3.2", + "get-stream": "^6.0.1", + "isomorphic-fetch": "^3.0.0", + "js-yaml": "^4.1.0", + "json-schema-to-ts": "^2.6.2-beta.0", + "json-schema-traverse": "^1.0.0", + "lodash.camelcase": "^4.3.0", + "lodash.deburr": "^4.1.0", + "lodash.merge": "^4.6.2", + "lodash.setwith": "^4.3.2", + "lodash.startcase": "^4.4.0", + "make-dir": "^3.1.0", + "node-abort-controller": "^3.1.1", + "oas": "^20.4.0", + "ora": "^5.4.1", + "prompts": "^2.4.2", + "remove-undefined-objects": "^2.0.2", + "semver": "^7.3.8", + "ssri": "^10.0.1", + "ts-morph": "^17.0.1", + "validate-npm-package-name": "^5.0.0" }, "bin": { - "browserslist": "cli.js" + "api": "bin/api" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=16" } }, - "node_modules/buffer": { - "version": "6.0.3", + "node_modules/api/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/api/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -6282,2021 +6618,1995 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "ieee754": "^1.1.13" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "license": "MIT", + "node_modules/api/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "license": "BSD-3-Clause" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "license": "MIT" + "node_modules/api/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } }, - "node_modules/buffer-more-ints": { + "node_modules/api/node_modules/is-interactive": { "version": "1.0.0", - "license": "MIT" - }, - "node_modules/buffer-writer": { - "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/buildcheck": { - "version": "0.0.6", - "dev": true, - "optional": true, + "node_modules/api/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "engines": { - "node": ">=10.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/builtins": { - "version": "5.0.1", - "license": "MIT", + "node_modules/api/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/api/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dependencies": { - "semver": "^7.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bundle-require": { - "version": "4.0.1", - "dev": true, - "license": "MIT", + "node_modules/api/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dependencies": { - "load-tsconfig": "^0.2.3" + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, - "peerDependencies": { - "esbuild": ">=0.17" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/byline": { - "version": "5.0.0", - "dev": true, - "license": "MIT", + "node_modules/api/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/byots": { - "version": "5.0.0-dev.20221103.1.34", - "license": "MIT", - "peerDependencies": { - "typescript": "*" - } - }, - "node_modules/bytes": { - "version": "3.1.2", + "node_modules/archiver": { + "version": "5.3.1", + "dev": true, "license": "MIT", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, "engines": { - "node": ">= 0.8" + "node": ">= 10" } }, - "node_modules/cac": { - "version": "6.7.14", + "node_modules/archiver-utils": { + "version": "2.1.0", "dev": true, "license": "MIT", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/call-bind": { - "version": "1.0.2", + "node_modules/archiver-utils/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/callsites": { - "version": "3.1.0", + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001488", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" + "node_modules/arg": { + "version": "4.1.3", + "license": "MIT" }, - "node_modules/cargo-cp-artifact": { - "version": "0.1.8", - "license": "MIT", - "bin": { - "cargo-cp-artifact": "bin/cargo-cp-artifact.js" - } + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" }, - "node_modules/chai": { - "version": "4.3.7", + "node_modules/array-flatten": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", "dev": true, "license": "MIT", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/chalk": { - "version": "4.1.2", + "node_modules/asn1": { + "version": "0.2.6", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "license": "MIT" - }, - "node_modules/charenc": { - "version": "0.0.2", - "license": "BSD-3-Clause", - "engines": { - "node": "*" + "safer-buffer": "~2.1.0" } }, - "node_modules/check-error": { - "version": "1.0.2", + "node_modules/assertion-error": { + "version": "1.1.0", "dev": true, "license": "MIT", "engines": { "node": "*" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "node_modules/astral-regex": { + "version": "2.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=8" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } + "node_modules/async": { + "version": "3.2.4", + "license": "MIT" }, - "node_modules/chownr": { - "version": "1.1.4", + "node_modules/async-lock": { + "version": "1.4.0", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "license": "MIT", - "engines": { - "node": ">=6.0" + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + "node_modules/b4a": { + "version": "1.6.4", + "license": "ISC" }, - "node_modules/cli-cursor": { - "version": "4.0.0", + "node_modules/babel-loader": { + "version": "9.1.2", + "dev": true, "license": "MIT", "dependencies": { - "restore-cursor": "^4.0.0" + "find-cache-dir": "^3.3.2", + "schema-utils": "^4.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 14.15.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" } }, - "node_modules/cli-spinners": { - "version": "2.9.0", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.3", + "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.4.0", + "semver": "^6.1.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/cli-width": { - "version": "4.0.0", + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "dev": true, "license": "ISC", - "engines": { - "node": ">= 12" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/cliui": { - "version": "8.0.1", - "license": "ISC", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.1", + "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "@babel/helper-define-polyfill-provider": "^0.4.0", + "core-js-compat": "^3.30.1" }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "node": ">=0.8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/clone-deep": { - "version": "4.0.1", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.0", "dev": true, "license": "MIT", "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" + "@babel/helper-define-polyfill-provider": "^0.4.0" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/clone-deep/node_modules/is-plain-object": { - "version": "2.0.4", + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base-64": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "tweetnacl": "^0.14.3" } }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/before-after-hook": { + "version": "2.2.3", + "license": "Apache-2.0" }, - "node_modules/color": { - "version": "3.2.1", + "node_modules/binary-extensions": { + "version": "2.2.0", "license": "MIT", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" + "engines": { + "node": ">=8" } }, - "node_modules/color-convert": { - "version": "2.0.1", + "node_modules/bl": { + "version": "5.1.0", "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/color-name": { - "version": "1.1.4", + "node_modules/bluebird": { + "version": "3.7.2", "license": "MIT" }, - "node_modules/color-string": { - "version": "1.9.1", + "node_modules/body-parser": { + "version": "1.20.1", "license": "MIT", "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "ms": "2.0.0" } }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", "license": "MIT" }, - "node_modules/colorette": { - "version": "2.0.19", + "node_modules/bottleneck": { + "version": "2.19.5", "license": "MIT" }, - "node_modules/colorspace": { - "version": "1.1.4", + "node_modules/bowser": { + "version": "2.11.0", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", "license": "MIT", "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/combined-stream": { - "version": "1.0.8", + "node_modules/braces": { + "version": "3.0.2", "license": "MIT", "dependencies": { - "delayed-stream": "~1.0.0" + "fill-range": "^7.0.1" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "9.4.1", - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" + "node": ">=8" } }, - "node_modules/commondir": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/compress-commons": { - "version": "4.1.1", - "dev": true, + "node_modules/braintree": { + "version": "3.15.0", "license": "MIT", "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" + "@braintree/wrap-promise": "2.1.0", + "dateformat": "4.5.1", + "xml2js": "0.5.0" }, "engines": { - "node": ">= 10" + "node": ">=10.0", + "npm": ">=6" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/concurrently": { - "version": "8.0.1", - "dev": true, + "node_modules/browserslist": { + "version": "4.21.5", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "license": "MIT", "dependencies": { - "chalk": "^4.1.2", - "date-fns": "^2.29.3", - "lodash": "^4.17.21", - "rxjs": "^7.8.0", - "shell-quote": "^1.8.0", - "spawn-command": "0.0.2-1", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.1" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" }, "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" + "browserslist": "cli.js" }, "engines": { - "node": "^14.13.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/concurrently/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, + "node_modules/buffer": { + "version": "6.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/connect-session-knex": { - "version": "3.0.1", - "license": "ISC", - "dependencies": { - "bluebird": "^3.7.2", - "knex": "^2.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", + "node_modules/buffer-crc32": { + "version": "0.2.13", "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": "*" } }, - "node_modules/content-type": { - "version": "1.0.5", + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/buffer-more-ints": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/buffer-writer": { + "version": "2.0.0", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", + "node_modules/buildcheck": { + "version": "0.0.6", "dev": true, - "license": "MIT" + "optional": true, + "engines": { + "node": ">=10.0.0" + } }, - "node_modules/cookie": { - "version": "0.4.2", + "node_modules/builtins": { + "version": "5.0.1", "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "semver": "^7.0.0" } }, - "node_modules/cookie-parser": { - "version": "1.4.6", + "node_modules/bundle-require": { + "version": "4.0.1", + "dev": true, "license": "MIT", "dependencies": { - "cookie": "0.4.1", - "cookie-signature": "1.0.6" + "load-tsconfig": "^0.2.3" }, "engines": { - "node": ">= 0.8.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.17" } }, - "node_modules/cookie-parser/node_modules/cookie": { - "version": "0.4.1", + "node_modules/byline": { + "version": "5.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "license": "MIT" - }, - "node_modules/copyfiles": { - "version": "2.4.1", + "node_modules/byots": { + "version": "5.0.0-dev.20221103.1.34", "license": "MIT", - "dependencies": { - "glob": "^7.0.5", - "minimatch": "^3.0.3", - "mkdirp": "^1.0.4", - "noms": "0.0.0", - "through2": "^2.0.1", - "untildify": "^4.0.0", - "yargs": "^16.1.0" - }, - "bin": { - "copyfiles": "copyfiles", - "copyup": "copyfiles" - } - }, - "node_modules/copyfiles/node_modules/cliui": { - "version": "7.0.4", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "peerDependencies": { + "typescript": "*" } }, - "node_modules/copyfiles/node_modules/yargs": { - "version": "16.2.0", + "node_modules/bytes": { + "version": "3.1.2", "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, "engines": { - "node": ">=10" + "node": ">= 0.8" } }, - "node_modules/copyfiles/node_modules/yargs-parser": { - "version": "20.2.9", - "license": "ISC", + "node_modules/cac": { + "version": "6.7.14", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/core-js-compat": { - "version": "3.30.2", - "dev": true, + "node_modules/call-bind": { + "version": "1.0.2", "license": "MIT", "dependencies": { - "browserslist": "^4.21.5" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "license": "MIT" + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" }, - "node_modules/cors": { - "version": "2.8.5", + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, "engines": { - "node": ">= 0.10" + "node": ">=6" } }, - "node_modules/cpu-features": { - "version": "0.0.8", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "buildcheck": "~0.0.6", - "nan": "^2.17.0" - }, - "engines": { - "node": ">=10.0.0" - } + "node_modules/caniuse-lite": { + "version": "1.0.30001488", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" }, - "node_modules/crc-32": { - "version": "1.2.2", - "license": "Apache-2.0", + "node_modules/cargo-cp-artifact": { + "version": "0.1.8", + "license": "MIT", "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" + "cargo-cp-artifact": "bin/cargo-cp-artifact.js" } }, - "node_modules/crc32-stream": { - "version": "4.0.2", + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chai": { + "version": "4.3.7", "dev": true, "license": "MIT", "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" }, "engines": { - "node": ">= 10" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/cross-fetch": { - "version": "3.1.8", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.12" + "node": ">=4" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", + "node_modules/chalk": { + "version": "4.1.2", "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/crypt": { + "node_modules/chardet": { + "version": "0.7.0", + "license": "MIT" + }, + "node_modules/charenc": { "version": "0.0.2", "license": "BSD-3-Clause", "engines": { "node": "*" } }, - "node_modules/crypto-randomuuid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-randomuuid/-/crypto-randomuuid-1.0.0.tgz", - "integrity": "sha512-/RC5F4l1SCqD/jazwUF6+t34Cd8zTSAGZ7rvvZu1whZUhD2a5MOGKjSGowoGcpj/cbVZk1ZODIooJEQQq3nNAA==" - }, - "node_modules/date-fns": { - "version": "2.29.3", + "node_modules/check-error": { + "version": "1.0.2", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/dateformat": { - "version": "4.5.1", - "license": "MIT", "engines": { "node": "*" } }, - "node_modules/dayjs": { - "version": "1.11.7", - "license": "MIT" - }, - "node_modules/dc-polyfill": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/dc-polyfill/-/dc-polyfill-0.1.3.tgz", - "integrity": "sha512-Wyk5n/5KUj3GfVKV2jtDbtChC/Ff9fjKsBcg4ZtYW1yQe3DXNHcGURvmoxhqQdfOQ9TwyMjnfyv1lyYcOkFkFA==", + "node_modules/chokidar": { + "version": "3.5.3", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, "engines": { - "node": ">=12.17" + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/dd-trace": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/dd-trace/-/dd-trace-4.19.0.tgz", - "integrity": "sha512-fmWqrAlQk1xnKzgPEM8RpQPTalxCa+F8Q/6JQQ1M3AczYrvwmJ45ljw2mB1F4iXeDEj0ycYFH3BRtdywspBLLQ==", - "hasInstallScript": true, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", "dependencies": { - "@datadog/native-appsec": "4.0.0", - "@datadog/native-iast-rewriter": "2.2.1", - "@datadog/native-iast-taint-tracking": "1.6.4", - "@datadog/native-metrics": "^2.0.0", - "@datadog/pprof": "4.0.1", - "@datadog/sketches-js": "^2.1.0", - "@opentelemetry/api": "^1.0.0", - "@opentelemetry/core": "^1.14.0", - "crypto-randomuuid": "^1.0.0", - "dc-polyfill": "^0.1.2", - "ignore": "^5.2.4", - "import-in-the-middle": "^1.4.2", - "int64-buffer": "^0.1.9", - "ipaddr.js": "^2.1.0", - "istanbul-lib-coverage": "3.2.0", - "jest-docblock": "^29.7.0", - "koalas": "^1.0.2", - "limiter": "^1.1.4", - "lodash.kebabcase": "^4.1.1", - "lodash.pick": "^4.4.0", - "lodash.sortby": "^4.7.0", - "lodash.uniq": "^4.5.0", - "lru-cache": "^7.14.0", - "methods": "^1.1.2", - "module-details-from-path": "^1.0.3", - "msgpack-lite": "^0.1.26", - "node-abort-controller": "^3.1.1", - "opentracing": ">=0.12.1", - "path-to-regexp": "^0.1.2", - "pprof-format": "^2.0.7", - "protobufjs": "^7.2.4", - "retry": "^0.13.1", - "semver": "^7.5.4" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=16" + "node": ">= 6" } }, - "node_modules/dd-trace/node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", - "engines": { - "node": ">= 10" - } + "node_modules/chownr": { + "version": "1.1.4", + "dev": true, + "license": "ISC" }, - "node_modules/dd-trace/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6.0" } }, - "node_modules/dd-trace/node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "engines": { - "node": ">= 4" - } + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" }, - "node_modules/debug": { - "version": "4.3.4", + "node_modules/cli-cursor": { + "version": "4.0.0", "license": "MIT", "dependencies": { - "ms": "2.1.2" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=6.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-eql": { - "version": "4.1.3", - "dev": true, + "node_modules/cli-spinners": { + "version": "2.9.0", "license": "MIT", - "dependencies": { - "type-detect": "^4.0.0" - }, "engines": { "node": ">=6" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/defaults": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/delay": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", - "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "node_modules/cli-width": { + "version": "4.0.0", + "license": "ISC", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 12" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", + "node_modules/cliui": { + "version": "8.0.1", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, "engines": { - "node": ">=0.4.0" + "node": ">=12" } }, - "node_modules/depd": { - "version": "2.0.0", + "node_modules/clone": { + "version": "1.0.4", "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=0.8" } }, - "node_modules/deprecation": { - "version": "2.3.1", - "license": "ISC" - }, - "node_modules/destroy": { - "version": "1.2.0", + "node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=6" } }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/diff": { - "version": "4.0.2", - "license": "BSD-3-Clause", + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", "engines": { - "node": ">=0.3.1" + "node": ">=0.10.0" } }, - "node_modules/diff-sequences": { - "version": "29.4.3", - "dev": true, - "license": "MIT", + "node_modules/code-block-writer": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.3.tgz", + "integrity": "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==" + }, + "node_modules/code-error-fragment": { + "version": "0.0.230", + "resolved": "https://registry.npmjs.org/code-error-fragment/-/code-error-fragment-0.0.230.tgz", + "integrity": "sha512-cadkfKp6932H8UkhzE/gcUqhRMNf8jHzkAN7+5Myabswaghu4xABTgPHDCjW+dBAJxj/SpkTYokpzDqY4pCzQw==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 4" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "dev": true, + "node_modules/color": { + "version": "3.2.1", "license": "MIT", "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, - "node_modules/docker-compose": { - "version": "0.24.2", - "dev": true, + "node_modules/color-convert": { + "version": "2.0.1", "license": "MIT", "dependencies": { - "yaml": "^2.2.2" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 6.0.0" + "node": ">=7.0.0" } }, - "node_modules/docker-modem": { - "version": "3.0.8", - "dev": true, - "license": "Apache-2.0", + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "license": "MIT", "dependencies": { - "debug": "^4.1.1", - "readable-stream": "^3.5.0", - "split-ca": "^1.0.1", - "ssh2": "^1.11.0" - }, - "engines": { - "node": ">= 8.0" + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, - "node_modules/dockerode": { - "version": "3.3.5", - "dev": true, - "license": "Apache-2.0", + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", "dependencies": { - "@balena/dockerignore": "^1.0.2", - "docker-modem": "^3.0.0", - "tar-fs": "~2.0.1" - }, - "engines": { - "node": ">= 8.0" + "color-name": "1.1.3" } }, - "node_modules/dockerode/node_modules/tar-fs": { - "version": "2.0.1", - "dev": true, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.19", + "license": "MIT" + }, + "node_modules/colorspace": { + "version": "1.1.4", "license": "MIT", "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" + "color": "^3.1.3", + "text-hex": "1.0.x" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "dev": true, - "license": "Apache-2.0", + "node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">= 0.8" } }, - "node_modules/dotenv": { - "version": "16.0.3", - "license": "BSD-2-Clause", + "node_modules/commander": { + "version": "9.4.1", + "license": "MIT", "engines": { - "node": ">=12" + "node": "^12.20.0 || >=14" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", + "node_modules/commondir": { + "version": "1.0.1", "license": "MIT" }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "license": "Apache-2.0", + "node_modules/compress-commons": { + "version": "4.1.1", + "dev": true, + "license": "MIT", "dependencies": { - "safe-buffer": "^5.0.1" + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" } }, - "node_modules/ee-first": { - "version": "1.1.1", + "node_modules/compute-gcd": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", + "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==", + "dependencies": { + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" + } + }, + "node_modules/compute-lcm": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz", + "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==", + "dependencies": { + "compute-gcd": "^1.2.1", + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", "license": "MIT" }, - "node_modules/ejs": { - "version": "3.1.9", - "license": "Apache-2.0", + "node_modules/concurrently": { + "version": "8.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "jake": "^10.8.5" + "chalk": "^4.1.2", + "date-fns": "^2.29.3", + "lodash": "^4.17.21", + "rxjs": "^7.8.0", + "shell-quote": "^1.8.0", + "spawn-command": "0.0.2-1", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.1" }, "bin": { - "ejs": "bin/cli.js" + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" }, "engines": { - "node": ">=0.10.0" + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, - "node_modules/electron-to-chromium": { - "version": "1.4.397", - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "node_modules/enabled": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "1.0.2", + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "dev": true, - "license": "MIT", + "node_modules/connect-session-knex": { + "version": "3.0.1", + "license": "ISC", "dependencies": { - "once": "^1.4.0" + "bluebird": "^3.7.2", + "knex": "^2.3.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/enhanced-resolve": { - "version": "5.14.1", - "license": "MIT", + "node_modules/connect-timeout": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/connect-timeout/-/connect-timeout-1.9.0.tgz", + "integrity": "sha512-q4bsBIPd+eSGtnh/u6EBOKfuG+4YvwsN0idlOsg6KAw71Qpi0DCf2eCc/Va63QU9qdOeYC8katxoC+rHMNygZg==", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "http-errors": "~1.6.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 0.8" } }, - "node_modules/enquirer": { - "version": "2.3.6", - "dev": true, - "license": "MIT", + "node_modules/connect-timeout/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/connect-timeout/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dependencies": { - "ansi-colors": "^4.1.1" + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" }, "engines": { - "node": ">=8.6" + "node": ">= 0.6" } }, - "node_modules/envinfo": { - "version": "7.8.1", - "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" + "node_modules/connect-timeout/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/connect-timeout/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/connect-timeout/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" }, "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/es-module-lexer": { - "version": "1.2.1", - "license": "MIT" + "node_modules/connect-timeout/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, - "node_modules/es6-promise": { - "version": "4.2.8", - "license": "MIT" + "node_modules/connect-timeout/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/esbuild": { - "version": "0.17.19", - "hasInstallScript": true, + "node_modules/content-disposition": { + "version": "0.5.4", "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "safe-buffer": "5.2.1" }, "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "node": ">= 0.6" } }, - "node_modules/escalade": { - "version": "3.1.1", + "node_modules/content-type": { + "version": "1.0.5", "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/escape-html": { - "version": "1.0.3", + "node_modules/convert-source-map": { + "version": "1.9.0", + "dev": true, "license": "MIT" }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, + "node_modules/cookie": { + "version": "0.4.2", "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/eslint": { - "version": "8.28.0", - "dev": true, + "node_modules/cookie-parser": { + "version": "1.4.6", "license": "MIT", "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.15.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" + "cookie": "0.4.1", + "cookie-signature": "1.0.6" }, - "bin": { - "eslint": "bin/eslint.js" + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-parser/node_modules/cookie": { + "version": "0.4.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dependencies": { + "is-what": "^4.1.8" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12.13" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/mesqueeb" } }, - "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "dev": true, + "node_modules/copyfiles": { + "version": "2.4.1", "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" + "dependencies": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" }, - "peerDependencies": { - "eslint": ">=7.0.0" + "bin": { + "copyfiles": "copyfiles", + "copyup": "copyfiles" } }, - "node_modules/eslint-plugin-deprecation": { - "version": "1.4.1", - "dev": true, - "license": "LGPL-3.0-or-later", + "node_modules/copyfiles/node_modules/cliui": { + "version": "7.0.4", + "license": "ISC", "dependencies": { - "@typescript-eslint/utils": "^5.57.0", - "tslib": "^2.3.1", - "tsutils": "^3.21.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0", - "typescript": "^3.7.5 || ^4.0.0 || ^5.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.6", - "dev": true, + "node_modules/copyfiles/node_modules/yargs": { + "version": "16.2.0", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=10" } }, - "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/types": { - "version": "5.59.6", - "dev": true, - "license": "MIT", + "node_modules/copyfiles/node_modules/yargs-parser": { + "version": "20.2.9", + "license": "ISC", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=10" } }, - "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.6", + "node_modules/core-js-compat": { + "version": "3.30.2", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "browserslist": "^4.21.5" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://opencollective.com/core-js" } }, - "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/utils": { - "version": "5.59.6", - "dev": true, + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/typescript-estree": "5.59.6", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "object-assign": "^4", + "vary": "^1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "node": ">= 0.10" } }, - "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.6", + "node_modules/cpu-features": { + "version": "0.0.8", "dev": true, - "license": "MIT", + "hasInstallScript": true, + "optional": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", - "eslint-visitor-keys": "^3.3.0" + "buildcheck": "~0.0.6", + "nan": "^2.17.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=10.0.0" } }, - "node_modules/eslint-plugin-deprecation/node_modules/tslib": { - "version": "2.5.0", - "dev": true, - "license": "0BSD" + "node_modules/crc-32": { + "version": "1.2.2", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", + "node_modules/crc32-stream": { + "version": "4.0.2", "dev": true, "license": "MIT", "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } + "node": ">= 10" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "license": "BSD-2-Clause", + "node_modules/create-require": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" + "node-fetch": "^2.6.12" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "dev": true, + "node_modules/cross-spawn": { + "version": "7.0.3", "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "node": ">= 8" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", + "node_modules/crypt": { + "version": "0.0.2", + "license": "BSD-3-Clause", "engines": { - "node": ">=10" + "node": "*" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node_modules/crypto-randomuuid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-randomuuid/-/crypto-randomuuid-1.0.0.tgz", + "integrity": "sha512-/RC5F4l1SCqD/jazwUF6+t34Cd8zTSAGZ7rvvZu1whZUhD2a5MOGKjSGowoGcpj/cbVZk1ZODIooJEQQq3nNAA==" + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/datauri": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/datauri/-/datauri-4.1.0.tgz", + "integrity": "sha512-y17kh32+I82G+ED9MNWFkZiP/Cq/vO1hN9+tSZsT9C9qn3NrvcBnh7crSepg0AQPge1hXx2Ca44s1FRdv0gFWA==", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "image-size": "1.0.0", + "mimer": "^2.0.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 10" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", + "node_modules/date-fns": { + "version": "2.29.3", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" } }, - "node_modules/esm": { - "version": "3.2.25", + "node_modules/dateformat": { + "version": "4.5.1", "license": "MIT", "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/espree": { - "version": "9.4.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, + "node_modules/dayjs": { + "version": "1.11.7", + "license": "MIT" + }, + "node_modules/dc-polyfill": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/dc-polyfill/-/dc-polyfill-0.1.3.tgz", + "integrity": "sha512-Wyk5n/5KUj3GfVKV2jtDbtChC/Ff9fjKsBcg4ZtYW1yQe3DXNHcGURvmoxhqQdfOQ9TwyMjnfyv1lyYcOkFkFA==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=12.17" } }, - "node_modules/esprima": { - "version": "4.0.1", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" }, "engines": { - "node": ">=4" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/esquery": { - "version": "1.4.0", + "node_modules/deep-eql": { + "version": "4.1.3", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "estraverse": "^5.1.0" + "type-detect": "^4.0.0" }, "engines": { - "node": ">=0.10" + "node": ">=6" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", + "node_modules/deep-is": { + "version": "0.1.4", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } + "license": "MIT" }, - "node_modules/esrecurse": { - "version": "4.3.0", - "license": "BSD-2-Clause", + "node_modules/defaults": { + "version": "1.0.4", + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "clone": "^1.0.2" }, - "engines": { - "node": ">=4.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "license": "BSD-2-Clause", + "node_modules/delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", "engines": { - "node": ">=4.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "license": "BSD-2-Clause", + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">=0.4.0" } }, - "node_modules/esutils": { - "version": "2.0.3", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/depd": { + "version": "2.0.0", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/etag": { - "version": "1.8.1", + "node_modules/deprecation": { + "version": "2.3.1", + "license": "ISC" + }, + "node_modules/destroy": { + "version": "1.2.0", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/event-lite": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/event-lite/-/event-lite-0.1.3.tgz", - "integrity": "sha512-8qz9nOz5VeD2z96elrEKD2U433+L3DWdUdDkOINLGOJvx1GsMBbMn0aCeu28y8/e85A6mCigBiFlYMnTBEGlSw==" + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "engines": { + "node": ">=8" + } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "license": "MIT", + "node_modules/diff": { + "version": "4.0.2", + "license": "BSD-3-Clause", "engines": { - "node": ">=6" + "node": ">=0.3.1" } }, - "node_modules/events": { - "version": "3.3.0", + "node_modules/diff-sequences": { + "version": "29.4.3", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.x" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/execa": { - "version": "5.1.1", + "node_modules/dir-glob": { + "version": "3.0.1", "dev": true, "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "path-type": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">=8" } }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "license": "Apache-2.0" - }, - "node_modules/express": { - "version": "4.18.2", + "node_modules/docker-compose": { + "version": "0.24.2", + "dev": true, "license": "MIT", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "yaml": "^2.2.2" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 6.0.0" } }, - "node_modules/express-session": { - "version": "1.17.3", - "license": "MIT", + "node_modules/docker-modem": { + "version": "3.0.8", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "cookie": "0.4.2", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-headers": "~1.0.2", - "parseurl": "~1.3.3", - "safe-buffer": "5.2.1", - "uid-safe": "~2.1.5" + "debug": "^4.1.1", + "readable-stream": "^3.5.0", + "split-ca": "^1.0.1", + "ssh2": "^1.11.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 8.0" } }, - "node_modules/express-session/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", + "node_modules/dockerode": { + "version": "3.3.5", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express-session/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "license": "MIT", + "@balena/dockerignore": "^1.0.2", + "docker-modem": "^3.0.0", + "tar-fs": "~2.0.1" + }, "engines": { - "node": ">= 0.6" + "node": ">= 8.0" } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", + "node_modules/dockerode/node_modules/tar-fs": { + "version": "2.0.1", + "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "license": "MIT", + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "esutils": "^2.0.2" }, "engines": { - "node": ">=4" + "node": ">=6.0.0" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "dev": true, - "license": "Apache-2.0" + "node_modules/dotenv": { + "version": "16.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } }, - "node_modules/fast-fifo": { - "version": "1.3.2", + "node_modules/eastasianwidth": { + "version": "0.2.0", "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.2.12", - "dev": true, - "license": "MIT", + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "license": "Apache-2.0", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" + "safe-buffer": "^5.0.1" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", + "node_modules/ee-first": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.9", + "license": "Apache-2.0", "dependencies": { - "is-glob": "^4.0.1" + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" }, "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "license": "MIT" + "node_modules/electron-to-chromium": { + "version": "1.4.397", + "license": "ISC" }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "dev": true, + "node_modules/emoji-regex": { + "version": "8.0.0", "license": "MIT" }, - "node_modules/fast-xml-parser": { - "version": "4.2.5", - "funding": [ - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - }, - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } + "node_modules/enabled": { + "version": "2.0.0", + "license": "MIT" }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "dev": true, + "node_modules/encodeurl": { + "version": "1.0.2", "license": "MIT", "engines": { - "node": ">= 4.9.1" + "node": ">= 0.8" } }, - "node_modules/fastq": { - "version": "1.13.0", + "node_modules/end-of-stream": { + "version": "1.4.4", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "reusify": "^1.0.4" + "once": "^1.4.0" } }, - "node_modules/fecha": { - "version": "4.2.3", - "license": "MIT" - }, - "node_modules/figlet": { - "version": "1.6.0", + "node_modules/enhanced-resolve": { + "version": "5.14.1", "license": "MIT", - "bin": { - "figlet": "bin/index.js" + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">= 0.4.0" + "node": ">=10.13.0" } }, - "node_modules/figures": { - "version": "3.2.0", + "node_modules/enquirer": { + "version": "2.3.6", + "dev": true, "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5" + "ansi-colors": "^4.1.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.6" } }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", + "node_modules/envinfo": { + "version": "7.8.1", + "dev": true, "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, "engines": { - "node": ">=0.8.0" + "node": ">=4" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "dev": true, - "license": "MIT", + "node_modules/es-module-lexer": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, "dependencies": { - "flat-cache": "^3.0.4" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=0.10" } }, - "node_modules/file-stream-rotator": { - "version": "0.6.1", - "license": "MIT", + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "dependencies": { - "moment": "^2.29.1" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, - "node_modules/filelist": { - "version": "1.0.4", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } + "node_modules/es6-promise": { + "version": "4.2.8", + "license": "MIT" }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "dependencies": { - "balanced-match": "^1.0.0" + "d": "^1.0.1", + "ext": "^1.1.2" } }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "license": "ISC", + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" } }, - "node_modules/fill-range": { - "version": "7.0.1", + "node_modules/esbuild": { + "version": "0.17.19", + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "node": ">=12" }, - "engines": { - "node": ">= 0.8" + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, + "node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "node": ">=12" } }, - "node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, + "node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/flat-cache": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, + "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12" } }, - "node_modules/flatted": { - "version": "3.2.7", - "dev": true, - "license": "ISC" - }, - "node_modules/fn.name": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } + "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" ], - "license": "MIT", "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node": ">=12" } }, - "node_modules/foreground-child": { - "version": "3.1.1", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, + "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=12" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.0.2", - "license": "ISC", + "node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=12" } }, - "node_modules/form-data": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, + "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 6" + "node": ">=12" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "license": "MIT", + "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/fresh": { - "version": "0.5.2", - "license": "MIT", + "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fs-extra": { - "version": "11.1.1", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, + "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.14" + "node": ">=12" } }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "license": "Unlicense" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "license": "MIT", + "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], "optional": true, "os": [ - "darwin" + "linux" ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=12" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "dev": true, - "license": "MIT" + "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/generic-pool": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", - "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 4" + "node": ">=12" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "dev": true, - "license": "MIT", + "node_modules/esbuild/node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "license": "ISC", + "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=12" } }, - "node_modules/get-func-name": { - "version": "2.0.2", - "dev": true, - "license": "MIT", + "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": "*" + "node": ">=12" } }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "license": "MIT", + "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8.0.0" + "node": ">=12" } }, - "node_modules/get-port": { - "version": "5.1.1", - "dev": true, + "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/get-stream": { - "version": "6.0.1", + "node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", "dev": true, "license": "MIT", "engines": { @@ -8306,1036 +8616,1052 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/getopts": { - "version": "2.3.0", - "license": "MIT" - }, - "node_modules/glob": { - "version": "7.2.3", - "license": "ISC", + "node_modules/eslint": { + "version": "8.28.0", + "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@eslint/eslintrc": "^1.3.3", + "@humanwhocodes/config-array": "^0.11.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.15.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": "*" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://opencollective.com/eslint" } }, - "node_modules/glob-parent": { - "version": "6.0.2", + "node_modules/eslint-config-prettier": { + "version": "8.5.0", "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" }, - "engines": { - "node": ">=10.13.0" + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "license": "BSD-2-Clause" + "node_modules/eslint-plugin-deprecation": { + "version": "1.4.1", + "dev": true, + "license": "LGPL-3.0-or-later", + "dependencies": { + "@typescript-eslint/utils": "^5.57.0", + "tslib": "^2.3.1", + "tsutils": "^3.21.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0", + "typescript": "^3.7.5 || ^4.0.0 || ^5.0.0" + } }, - "node_modules/globals": { - "version": "13.18.0", + "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.6", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/globby": { - "version": "11.1.0", + "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/types": { + "version": "5.59.6", "dev": true, "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "license": "ISC" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/has": { - "version": "1.0.3", - "license": "MIT", + "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.6", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "function-bind": "^1.1.1" + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": ">= 0.4.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/has-flag": { - "version": "4.0.0", + "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/utils": { + "version": "5.59.6", + "dev": true, "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/has-symbols": { - "version": "1.0.3", + "node_modules/eslint-plugin-deprecation/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.6", + "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.59.6", + "eslint-visitor-keys": "^3.3.0" + }, "engines": { - "node": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/heap-js": { - "version": "2.2.0", - "license": "BSD-3-Clause", - "engines": { - "node": ">=10.0.0" - } + "node_modules/eslint-plugin-deprecation/node_modules/tslib": { + "version": "2.5.0", + "dev": true, + "license": "0BSD" }, - "node_modules/hosted-git-info": { - "version": "6.1.1", - "license": "ISC", + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^7.5.1" + "prettier-linter-helpers": "^1.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", - "license": "ISC", - "engines": { - "node": ">=12" + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/http-errors": { - "version": "2.0.0", - "license": "MIT", + "node_modules/eslint-scope": { + "version": "5.1.1", + "license": "BSD-2-Clause", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">= 0.8" + "node": ">=8.0.0" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", + "node_modules/eslint-utils": { + "version": "3.0.0", + "dev": true, "license": "MIT", "dependencies": { - "agent-base": "6", - "debug": "4" + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">= 6" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "node_modules/human-signals": { + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "2.1.0", "dev": true, "license": "Apache-2.0", "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/human-to-cron": { - "version": "0.3.1", - "license": "ISC", - "dependencies": { - "commander": "^2.9.0" - }, - "bin": { - "human-to-cron": "bin/human-to-cron" + "node": ">=10" } }, - "node_modules/human-to-cron/node_modules/commander": { - "version": "2.20.3", - "license": "MIT" - }, - "node_modules/husky": { - "version": "8.0.3", + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", "dev": true, - "license": "MIT", - "bin": { - "husky": "lib/bin.js" - }, + "license": "Apache-2.0", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "license": "MIT", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=0.10.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { + "node_modules/eslint/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">= 4" + "node": ">=4.0" } }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "dev": true, + "node_modules/esm": { + "version": "3.2.25", "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-in-the-middle": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz", - "integrity": "sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==", - "dependencies": { - "acorn": "^8.8.2", - "acorn-import-assertions": "^1.9.0", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" } }, - "node_modules/import-local": { - "version": "3.1.0", + "node_modules/espree": { + "version": "9.4.1", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", + "node_modules/esprima": { + "version": "4.0.1", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" } }, - "node_modules/inflight": { - "version": "1.0.6", - "license": "ISC", + "node_modules/esquery": { + "version": "1.4.0", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/int64-buffer": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-0.1.10.tgz", - "integrity": "sha512-v7cSY1J8ydZ0GyjUHqF+1bshJ6cnEVLo9EnjB8p+4HDRPZc9N5jjmvUV7NvEsqQOKyH0pmIBFWXVQbiS0+OBbA==" + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } }, - "node_modules/interpret": { - "version": "2.2.0", - "license": "MIT", + "node_modules/esrecurse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, "engines": { - "node": ">= 0.10" + "node": ">=4.0" } }, - "node_modules/ip": { - "version": "1.1.8", - "license": "MIT" + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "license": "MIT", + "node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", "engines": { - "node": ">= 0.10" + "node": ">=4.0" } }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "license": "MIT" + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/is-binary-path": { - "version": "2.1.0", + "node_modules/etag": { + "version": "1.8.1", "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "license": "MIT", + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "d": "1", + "es5-ext": "~0.10.14" } }, - "node_modules/is-extglob": { - "version": "2.1.1", + "node_modules/event-lite": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/event-lite/-/event-lite-0.1.3.tgz", + "integrity": "sha512-8qz9nOz5VeD2z96elrEKD2U433+L3DWdUdDkOINLGOJvx1GsMBbMn0aCeu28y8/e85A6mCigBiFlYMnTBEGlSw==" + }, + "node_modules/event-target-shim": { + "version": "5.0.1", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", + "node_modules/events": { + "version": "3.3.0", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.8.x" } }, - "node_modules/is-glob": { - "version": "4.0.3", + "node_modules/execa": { + "version": "5.1.1", "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/is-number": { - "version": "7.0.0", - "license": "MIT", + "node_modules/exponential-backoff": { + "version": "3.1.1", + "license": "Apache-2.0" + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, "engines": { - "node": ">=0.12.0" + "node": ">= 0.10.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "dev": true, + "node_modules/express-session": { + "version": "1.17.3", "license": "MIT", + "dependencies": { + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", + "node_modules/express-session/node_modules/debug": { + "version": "2.6.9", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/is-stream": { - "version": "2.0.1", + "node_modules/express-session/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/is-unicode-supported": { - "version": "1.3.0", + "node_modules/express/node_modules/debug": { + "version": "2.6.9", "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/isarray": { - "version": "0.0.1", + "node_modules/express/node_modules/ms": { + "version": "2.0.0", "license": "MIT" }, - "node_modules/isexe": { - "version": "2.0.0", - "license": "ISC" + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } }, - "node_modules/isobject": { - "version": "3.0.1", - "dev": true, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/external-editor": { + "version": "3.1.0", "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "engines": { - "node": ">=8" - } + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" }, - "node_modules/jackspeak": { - "version": "2.3.6", - "license": "BlueOak-1.0.0", + "node_modules/fast-diff": { + "version": "1.2.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^8.0.2" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "engines": { + "node": ">= 6" } }, - "node_modules/jake": { - "version": "10.8.5", - "license": "Apache-2.0", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" + "strnum": "^1.0.5" }, "bin": { - "jake": "bin/cli.js" - }, + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 4.9.1" } }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "node_modules/fastq": { + "version": "1.13.0", + "license": "ISC", "dependencies": { - "detect-newline": "^3.0.0" + "reusify": "^1.0.4" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "license": "MIT" + }, + "node_modules/fetch-har": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/fetch-har/-/fetch-har-8.1.5.tgz", + "integrity": "sha512-c9WDro4RWC+suOVRJFNW21cgqTOELRZpvFJgfENvOM7Yt/VA4QeFtRax795SyOpTisdpcl5XNQlQZdAE6HERDA==", + "dependencies": { + "@readme/data-urls": "^1.0.1", + "@types/har-format": "^1.2.8", + "readable-stream": "^3.6.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=14" + }, + "optionalDependencies": { + "formdata-node": "^4.3.2" } }, - "node_modules/jest-worker": { - "version": "27.5.1", + "node_modules/figlet": { + "version": "1.6.0", "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "bin": { + "figlet": "bin/index.js" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 0.4.0" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", + "node_modules/figures": { + "version": "3.2.0", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "escape-string-regexp": "^1.0.5" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/joi": { - "version": "17.8.3", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" } }, - "node_modules/joi/node_modules/@hapi/hoek": { - "version": "9.3.0", - "license": "BSD-3-Clause" - }, - "node_modules/joycon": { - "version": "3.1.1", + "node_modules/file-entry-cache": { + "version": "6.0.1", "dev": true, "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, "engines": { - "node": ">=10" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/js-sdsl": { - "version": "4.2.0", - "dev": true, + "node_modules/file-stream-rotator": { + "version": "0.6.1", "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "dependencies": { + "moment": "^2.29.1" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" + "node_modules/filelist": { + "version": "1.0.4", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } }, - "node_modules/js-yaml": { - "version": "4.1.0", + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=10" } }, - "node_modules/jsesc": { - "version": "2.5.2", + "node_modules/fill-range": { + "version": "7.0.1", "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" + "dependencies": { + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "dev": true, + "node_modules/finalhandler": { + "version": "1.2.0", "license": "MIT", - "bin": { - "json5": "lib/cli.js" + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/jsonfile": { - "version": "6.1.0", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", "license": "MIT", "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "ms": "2.0.0" } }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", "license": "MIT", "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "engines": { - "node": ">=12", - "npm": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/jwa": { - "version": "1.4.1", + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, "license": "MIT", "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jws": { - "version": "3.2.2", + "node_modules/flat-cache": { + "version": "3.0.4", + "dev": true, "license": "MIT", "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/kind-of": { - "version": "6.0.3", + "node_modules/flatted": { + "version": "3.2.7", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "license": "ISC" }, - "node_modules/knex": { - "version": "2.4.2", + "node_modules/fn.name": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "license": "MIT", - "dependencies": { - "colorette": "2.0.19", - "commander": "^9.1.0", - "debug": "4.3.4", - "escalade": "^3.1.1", - "esm": "^3.2.25", - "get-package-type": "^0.1.0", - "getopts": "2.3.0", - "interpret": "^2.2.0", - "lodash": "^4.17.21", - "pg-connection-string": "2.5.0", - "rechoir": "^0.8.0", - "resolve-from": "^5.0.0", - "tarn": "^3.0.2", - "tildify": "2.0.0" - }, - "bin": { - "knex": "bin/cli.js" - }, "engines": { - "node": ">=12" + "node": ">=4.0" }, "peerDependenciesMeta": { - "better-sqlite3": { - "optional": true - }, - "mysql": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-native": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "tedious": { + "debug": { "optional": true } } }, - "node_modules/knex/node_modules/resolve-from": { - "version": "5.0.0", - "license": "MIT", + "node_modules/foreground-child": { + "version": "3.1.1", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/koalas": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/koalas/-/koalas-1.0.2.tgz", - "integrity": "sha512-RYhBbYaTTTHId3l6fnMZc3eGQNW6FVCqMG6AMwA5I1Mafr6AflaXeoi6x3xQuATRotGYRLk6+1ELZH4dstFNOA==", + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.0.2", + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/kuler": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/lazystream": { - "version": "1.0.1", + "node_modules/form-data": { + "version": "4.0.0", "license": "MIT", "dependencies": { - "readable-stream": "^2.0.5" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.6.3" + "node": ">= 6" } }, - "node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "license": "MIT" + "node_modules/form-data-encoder": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.9.0.tgz", + "integrity": "sha512-rahaRMkN8P8d/tgK/BLPX+WBVM27NbvdXBxqQujBtkDAIFspaRqN7Od7lfdGQA6KAD+f82fYCLBq1ipvcu8qLw==" }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "license": "MIT", + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" } }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" + "node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", + "node_modules/fresh": { + "version": "0.5.2", "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/levn": { - "version": "0.4.1", + "node_modules/fs-constants": { + "version": "1.0.0", "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "11.1.1", "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=14.14" } }, - "node_modules/lilconfig": { - "version": "2.1.0", - "dev": true, - "license": "MIT", + "node_modules/fs-monkey": { + "version": "1.0.3", + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + "node_modules/function-bind": { + "version": "1.1.1", + "license": "MIT" }, - "node_modules/lines-and-columns": { - "version": "1.2.4", + "node_modules/functional-red-black-tree": { + "version": "1.0.1", "dev": true, "license": "MIT" }, - "node_modules/load-tsconfig": { - "version": "0.2.5", + "node_modules/generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/loader-runner": { - "version": "4.3.0", - "license": "MIT", + "node_modules/get-caller-file": { + "version": "2.0.5", + "license": "ISC", "engines": { - "node": ">=6.11.5" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/local-pkg": { - "version": "0.4.3", + "node_modules/get-func-name": { + "version": "2.0.2", "dev": true, "license": "MIT", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "node": "*" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "dev": true, + "node_modules/get-intrinsic": { + "version": "1.2.0", "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lodash": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "license": "MIT" - }, - "node_modules/lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "license": "MIT" - }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "license": "MIT" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "node_modules/log-symbols": { - "version": "5.1.0", + "node_modules/get-package-type": { + "version": "0.1.0", "license": "MIT", - "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.0.0" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "5.2.0", + "node_modules/get-port": { + "version": "5.1.1", + "dev": true, "license": "MIT", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/logform": { - "version": "2.5.1", - "license": "MIT", - "dependencies": { - "@colors/colors": "1.5.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/loglevel": { - "version": "1.8.1", + "node_modules/get-stream": { + "version": "6.0.1", "license": "MIT", "engines": { - "node": ">= 0.6.0" + "node": ">=10" }, "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/long": { - "version": "5.2.3", - "license": "Apache-2.0" - }, - "node_modules/loupe": { - "version": "2.3.6", + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", "dev": true, - "license": "MIT", "dependencies": { - "get-func-name": "^2.0.0" + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/lru_map": { - "version": "0.3.3", + "node_modules/getopts": { + "version": "2.3.0", "license": "MIT" }, - "node_modules/lru-cache": { - "version": "6.0.0", + "node_modules/glob": { + "version": "7.2.3", "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=10" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/magic-string": { - "version": "0.30.1", + "node_modules/glob-parent": { + "version": "6.0.2", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=12" + "node": ">=10.13.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", - "dependencies": { - "axios": "^1.3.3", - "base-64": "^1.0.0", - "url-join": "^4.0.1" - } + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "license": "BSD-2-Clause" }, - "node_modules/make-dir": { - "version": "3.1.0", + "node_modules/globals": { + "version": "13.18.0", "dev": true, "license": "MIT", "dependencies": { - "semver": "^6.0.0" + "type-fest": "^0.20.2" }, "engines": { "node": ">=8" @@ -9344,3857 +9670,6348 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", + "node_modules/globby": { + "version": "11.1.0", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-error": { - "version": "1.3.6", + "node_modules/graceful-fs": { + "version": "4.2.11", "license": "ISC" }, - "node_modules/md5": { - "version": "2.3.0", - "license": "BSD-3-Clause", - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "license": "MIT" }, - "node_modules/media-typer": { - "version": "0.3.0", + "node_modules/has": { + "version": "1.0.3", "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.1", - "license": "Unlicense", "dependencies": { - "fs-monkey": "^1.0.3" + "function-bind": "^1.1.1" }, "engines": { - "node": ">= 4.0.0" + "node": ">= 0.4.0" } }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "dev": true, + "node_modules/has-flag": { + "version": "4.0.0", "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/methods": { - "version": "1.1.2", + "node_modules/has-symbols": { + "version": "1.0.3", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/micromatch": { - "version": "4.0.5", - "dev": true, - "license": "MIT", + "node_modules/heap-js": { + "version": "2.2.0", + "license": "BSD-3-Clause", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/hosted-git-info": { + "version": "6.1.1", + "license": "ISC", "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "lru-cache": "^7.5.1" }, "engines": { - "node": ">=8.6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/mime": { - "version": "1.6.0", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.3", + "license": "ISC", "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/mime-db": { - "version": "1.52.0", + "node_modules/http-errors": { + "version": "2.0.0", "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/mime-types": { - "version": "2.1.35", + "node_modules/http2-client": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">= 0.6" + "node": ">= 6" } }, - "node_modules/mimic-fn": { + "node_modules/human-signals": { "version": "2.1.0", - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=6" + "node": ">=10.17.0" } }, - "node_modules/minimatch": { - "version": "3.1.2", + "node_modules/human-to-cron": { + "version": "0.3.1", "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "commander": "^2.9.0" }, - "engines": { - "node": "*" + "bin": { + "human-to-cron": "bin/human-to-cron" } }, - "node_modules/minipass": { - "version": "6.0.2", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } + "node_modules/human-to-cron/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" }, - "node_modules/mkdirp": { - "version": "1.0.4", + "node_modules/husky": { + "version": "8.0.3", + "dev": true, "license": "MIT", "bin": { - "mkdirp": "bin/cmd.js" + "husky": "lib/bin.js" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "dev": true, - "license": "MIT" - }, - "node_modules/mlly": { - "version": "1.4.0", - "dev": true, + "node_modules/iconv-lite": { + "version": "0.4.24", "license": "MIT", "dependencies": { - "acorn": "^8.9.0", - "pathe": "^1.1.1", - "pkg-types": "^1.0.3", - "ufo": "^1.1.2" + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" }, - "node_modules/moment": { - "version": "2.29.4", - "license": "MIT", + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "engines": { - "node": "*" + "node": ">= 4" } }, - "node_modules/ms": { - "version": "2.1.2", - "license": "MIT" + "node_modules/ignore-by-default": { + "version": "1.0.1", + "dev": true, + "license": "ISC" }, - "node_modules/msgpack-lite": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/msgpack-lite/-/msgpack-lite-0.1.26.tgz", - "integrity": "sha512-SZ2IxeqZ1oRFGo0xFGbvBJWMp3yLIY9rlIJyxy8CGrwZn1f0ZK4r6jV/AM1r0FZMDUkWkglOk/eeKIL9g77Nxw==", + "node_modules/image-size": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz", + "integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==", "dependencies": { - "event-lite": "^0.1.1", - "ieee754": "^1.1.8", - "int64-buffer": "^0.1.9", - "isarray": "^1.0.0" + "queue": "6.0.2" }, "bin": { - "msgpack": "bin/msgpack" + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=12.0.0" } }, - "node_modules/msgpack-lite/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "license": "ISC" - }, - "node_modules/mz": { - "version": "2.7.0", + "node_modules/import-fresh": { + "version": "3.3.0", "dev": true, "license": "MIT", "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nan": { - "version": "2.17.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/nango": { - "resolved": "packages/cli", - "link": true + "node_modules/import-in-the-middle": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz", + "integrity": "sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } }, - "node_modules/nanoid": { - "version": "3.3.6", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/import-local": { + "version": "3.1.0", + "dev": true, "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, "bin": { - "nanoid": "bin/nanoid.cjs" + "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", + "node_modules/imurmurhash": { + "version": "0.1.4", "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=0.8.19" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "license": "MIT" + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" }, - "node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" + "node_modules/int64-buffer": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-0.1.10.tgz", + "integrity": "sha512-v7cSY1J8ydZ0GyjUHqF+1bshJ6cnEVLo9EnjB8p+4HDRPZc9N5jjmvUV7NvEsqQOKyH0pmIBFWXVQbiS0+OBbA==" }, - "node_modules/node-cron": { - "version": "3.0.2", - "license": "ISC", - "dependencies": { - "uuid": "8.3.2" - }, + "node_modules/interpret": { + "version": "2.2.0", + "license": "MIT", "engines": { - "node": ">=6.0.0" + "node": ">= 0.10" } }, - "node_modules/node-cron/node_modules/uuid": { - "version": "8.3.2", + "node_modules/ip": { + "version": "1.1.8", + "license": "MIT" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "engines": { + "node": ">= 0.10" } }, - "node_modules/node-fetch": { - "version": "2.6.12", + "node_modules/is-arrayish": { + "version": "0.3.2", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" + "binary-extensions": "^2.0.0" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.9.0.tgz", - "integrity": "sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "node": ">=8" } }, - "node_modules/node-releases": { - "version": "2.0.10", + "node_modules/is-buffer": { + "version": "1.1.6", "license": "MIT" }, - "node_modules/nodemon": { - "version": "3.0.1", - "dev": true, + "node_modules/is-core-module": { + "version": "2.11.0", "license": "MIT", "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" + "has": "^1.0.3" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "dev": true, + "node_modules/is-extglob": { + "version": "2.1.1", "license": "MIT", - "dependencies": { - "ms": "^2.1.1" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/nodemon/node_modules/has-flag": { + "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/nodemon/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, + "node_modules/is-glob": { + "version": "4.0.3", "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/noms": { - "version": "0.0.0", - "license": "ISC", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "~1.0.31" + "node_modules/is-interactive": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/noms/node_modules/readable-stream": { - "version": "1.0.34", + "node_modules/is-number": { + "version": "7.0.0", "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "engines": { + "node": ">=0.12.0" } }, - "node_modules/noms/node_modules/string_decoder": { - "version": "0.10.31", - "license": "MIT" - }, - "node_modules/nopt": { - "version": "1.0.10", + "node_modules/is-path-inside": { + "version": "3.0.3", "dev": true, "license": "MIT", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "engines": { + "node": ">=8" } }, - "node_modules/normalize-path": { - "version": "3.0.0", + "node_modules/is-plain-object": { + "version": "5.0.0", "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/npm-package-arg": { - "version": "10.1.0", - "license": "ISC", - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, + "node_modules/is-unicode-supported": { + "version": "1.3.0", "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", "engines": { - "node": ">=8" + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" } }, - "node_modules/oauth": { - "version": "0.10.0", + "node_modules/isarray": { + "version": "0.0.1", "license": "MIT" }, - "node_modules/object-assign": { - "version": "4.1.1", + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/object-hash": { - "version": "2.2.0", - "license": "MIT", + "node_modules/isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "dependencies": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/object-inspect": { - "version": "1.12.3", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "license": "MIT", + "node_modules/jackspeak": { + "version": "2.3.6", + "license": "BlueOak-1.0.0", "dependencies": { - "ee-first": "1.1.1" + "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/once": { - "version": "1.4.0", - "license": "ISC", + "node_modules/jake": { + "version": "10.8.5", + "license": "Apache-2.0", "dependencies": { - "wrappy": "1" + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/onchange": { - "version": "7.1.0", - "dev": true, - "license": "MIT", + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dependencies": { - "@blakeembrey/deque": "^1.0.5", - "@blakeembrey/template": "^1.0.0", - "arg": "^4.1.3", - "chokidar": "^3.3.1", - "cross-spawn": "^7.0.1", - "ignore": "^5.1.4", - "tree-kill": "^1.2.2" + "detect-newline": "^3.0.0" }, - "bin": { - "onchange": "dist/bin.js" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/one-time": { - "version": "1.0.0", + "node_modules/jest-worker": { + "version": "27.5.1", "license": "MIT", "dependencies": { - "fn.name": "1.x.x" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" } }, - "node_modules/onetime": { - "version": "5.1.2", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/openapi3-ts": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-4.1.2.tgz", - "integrity": "sha512-B7gOkwsYMZO7BZXwJzXCuVagym2xhqsrilVvV0dnq2Di4+iLUXKVX9gOK23ZqaAHZOwABXN0QTdW8QnkUTX6DA==", + "node_modules/joi": { + "version": "17.8.3", + "license": "BSD-3-Clause", "dependencies": { - "yaml": "^2.2.2" + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" } }, - "node_modules/opentracing": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/opentracing/-/opentracing-0.14.7.tgz", - "integrity": "sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==", - "engines": { - "node": ">=0.10" - } + "node_modules/joi/node_modules/@hapi/hoek": { + "version": "9.3.0", + "license": "BSD-3-Clause" }, - "node_modules/optionator": { - "version": "0.9.1", + "node_modules/joycon": { + "version": "3.1.1", "dev": true, "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" } }, - "node_modules/ora": { - "version": "6.3.1", + "node_modules/js-sdsl": { + "version": "4.2.0", + "dev": true, "license": "MIT", - "dependencies": { - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" } }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "6.0.1", + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "argparse": "^2.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/ora/node_modules/chalk": { - "version": "5.2.0", + "node_modules/jsesc": { + "version": "2.5.2", "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "bin": { + "jsesc": "bin/jsesc" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=4" } }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "7.0.1", - "license": "MIT", + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/json-schema-compare": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", + "integrity": "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==", "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "lodash": "^4.17.4" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "license": "MIT", + "node_modules/json-schema-merge-allof": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz", + "integrity": "sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==", + "dependencies": { + "compute-lcm": "^1.1.2", + "json-schema-compare": "^0.2.2", + "lodash": "^4.17.20" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12.0.0" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "license": "MIT", + "node_modules/json-schema-to-ts": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-2.9.2.tgz", + "integrity": "sha512-h9WqLkTVpBbiaPb5OmeUpz/FBLS/kvIJw4oRCPiEisIu2WjMh+aai0QIY2LoOhRFx5r92taGLcerIrzxKBAP6g==", "dependencies": { - "yocto-queue": "^0.1.0" + "@babel/runtime": "^7.18.3", + "@types/json-schema": "^7.0.9", + "ts-algebra": "^1.2.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16" } }, - "node_modules/p-locate": { - "version": "5.0.0", + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/json-to-ast": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json-to-ast/-/json-to-ast-2.1.0.tgz", + "integrity": "sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==", "dependencies": { - "p-limit": "^3.0.2" + "code-error-fragment": "0.0.230", + "grapheme-splitter": "^1.0.4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4" } }, - "node_modules/p-try": { - "version": "2.2.0", + "node_modules/json5": { + "version": "2.2.3", "dev": true, "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, "engines": { "node": ">=6" } }, - "node_modules/packet-reader": { - "version": "1.0.0", + "node_modules/jsonc-parser": { + "version": "3.2.0", "license": "MIT" }, - "node_modules/pako": { - "version": "2.1.0", - "license": "(MIT AND Zlib)" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "dev": true, + "node_modules/jsonfile": { + "version": "6.1.0", "license": "MIT", "dependencies": { - "callsites": "^3.0.0" + "universalify": "^2.0.0" }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpath-plus": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", + "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==", "engines": { - "node": ">=6" + "node": ">=12.0.0" } }, - "node_modules/parse-link-header": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-link-header/-/parse-link-header-2.0.0.tgz", - "integrity": "sha512-xjU87V0VyHZybn2RrCX5TIFGxTVZE6zqqZWMPlIKiSKuWh/X5WZdt+w1Ki1nXB+8L/KtL+nZ4iq+sfI6MrhhMw==", - "dependencies": { - "xtend": "~4.0.1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "license": "MIT", + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/passport": { - "version": "0.6.0", + "node_modules/jsonwebtoken": { + "version": "9.0.2", "license": "MIT", "dependencies": { - "passport-strategy": "1.x.x", - "pause": "0.0.1", - "utils-merge": "^1.0.1" + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" }, "engines": { - "node": ">= 0.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jaredhanson" + "node": ">=12", + "npm": ">=6" } }, - "node_modules/passport-http": { - "version": "0.3.0", + "node_modules/jwa": { + "version": "1.4.1", + "license": "MIT", "dependencies": { - "passport-strategy": "1.x.x" - }, - "engines": { - "node": ">= 0.4.0" + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" } }, - "node_modules/passport-local": { - "version": "1.0.0", + "node_modules/jws": { + "version": "3.2.2", + "license": "MIT", "dependencies": { - "passport-strategy": "1.x.x" - }, - "engines": { - "node": ">= 0.4.0" + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/passport-strategy": { - "version": "1.0.0", + "node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4.0" + "node": ">=0.10.0" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", + "node_modules/knex": { + "version": "2.4.2", "license": "MIT", + "dependencies": { + "colorette": "2.0.19", + "commander": "^9.1.0", + "debug": "4.3.4", + "escalade": "^3.1.1", + "esm": "^3.2.25", + "get-package-type": "^0.1.0", + "getopts": "2.3.0", + "interpret": "^2.2.0", + "lodash": "^4.17.21", + "pg-connection-string": "2.5.0", + "rechoir": "^0.8.0", + "resolve-from": "^5.0.0", + "tarn": "^3.0.2", + "tildify": "2.0.0" + }, + "bin": { + "knex": "bin/cli.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "peerDependenciesMeta": { + "better-sqlite3": { + "optional": true + }, + "mysql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-native": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } } }, - "node_modules/path-key": { - "version": "3.1.1", + "node_modules/knex/node_modules/resolve-from": { + "version": "5.0.0", "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", + "node_modules/koalas": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/koalas/-/koalas-1.0.2.tgz", + "integrity": "sha512-RYhBbYaTTTHId3l6fnMZc3eGQNW6FVCqMG6AMwA5I1Mafr6AflaXeoi6x3xQuATRotGYRLk6+1ELZH4dstFNOA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kuler": { + "version": "2.0.0", "license": "MIT" }, - "node_modules/path-scurry": { - "version": "1.10.1", - "license": "BlueOak-1.0.0", + "node_modules/lazystream": { + "version": "1.0.1", + "license": "MIT", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" + "readable-stream": "^2.0.5" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.2", - "license": "ISC", "engines": { - "node": "14 || >=16.14" + "node": ">= 0.6.3" } }, - "node_modules/path-to-regexp": { - "version": "0.1.7", + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", "license": "MIT" }, - "node_modules/path-type": { - "version": "4.0.0", - "dev": true, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/pathe": { - "version": "1.1.1", - "dev": true, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", "license": "MIT" }, - "node_modules/pathval": { + "node_modules/lazystream/node_modules/string_decoder": { "version": "1.1.1", - "dev": true, "license": "MIT", - "engines": { - "node": "*" + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/pause": { - "version": "0.0.1" + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } }, - "node_modules/pg": { - "version": "8.9.0", + "node_modules/levn": { + "version": "0.4.1", + "dev": true, "license": "MIT", "dependencies": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-connection-string": "^2.5.0", - "pg-pool": "^3.5.2", - "pg-protocol": "^1.6.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } + "node": ">= 0.8.0" } }, - "node_modules/pg-connection-string": { - "version": "2.5.0", + "node_modules/lilconfig": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true, "license": "MIT" }, - "node_modules/pg-int8": { - "version": "1.0.1", - "license": "ISC", + "node_modules/load-tsconfig": { + "version": "0.2.5", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/pg-pool": { - "version": "3.5.2", + "node_modules/loader-runner": { + "version": "4.3.0", "license": "MIT", - "peerDependencies": { - "pg": ">=8.0" + "engines": { + "node": ">=6.11.5" } }, - "node_modules/pg-protocol": { - "version": "1.6.0", - "license": "MIT" - }, - "node_modules/pg-types": { - "version": "2.2.0", + "node_modules/local-pkg": { + "version": "0.4.3", + "dev": true, "license": "MIT", - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, "engines": { - "node": ">=4" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/pgpass": { - "version": "1.0.5", + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, "license": "MIT", "dependencies": { - "split2": "^4.1.0" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "license": "MIT", + "p-locate": "^5.0.0" + }, "engines": { - "node": ">=8.6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pirates": { - "version": "4.0.6", + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } + "license": "MIT" }, - "node_modules/pkg-dir": { + "node_modules/lodash.deburr": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", + "integrity": "sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==" + }, + "node_modules/lodash.defaults": { "version": "4.2.0", "dev": true, + "license": "MIT" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "license": "MIT" + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "license": "MIT" + }, + "node_modules/lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==" + }, + "node_modules/lodash.setwith": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.setwith/-/lodash.setwith-4.3.2.tgz", + "integrity": "sha512-Cv2pndcuNDaqDMJ0gbLm5qNG5jyfsL6f8+f5PfZVVNhQCv+y+P5gAKkCdZbtiQlux7nsnWF7UmZd8JEFIo/4tg==" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "license": "MIT" + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/log-symbols": { + "version": "5.1.0", "license": "MIT", "dependencies": { - "find-up": "^4.0.0" + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "dev": true, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.2.0", "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, + "node_modules/logform": { + "version": "2.5.1", "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "@colors/colors": "1.5.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, + "node_modules/loglevel": { + "version": "1.8.1", "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, "engines": { - "node": ">=6" + "node": ">= 0.6.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/long": { + "version": "5.2.3", + "license": "Apache-2.0" + }, + "node_modules/loupe": { + "version": "2.3.6", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru_map": { + "version": "0.3.3", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/pkg-types": { - "version": "1.0.3", - "dev": true, - "license": "MIT", + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" + "es5-ext": "~0.10.2" } }, - "node_modules/postcss": { - "version": "8.4.31", + "node_modules/magic-string": { + "version": "0.30.1", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=12" } }, - "node_modules/postcss-load-config": { - "version": "4.0.1", + "node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", "dev": true, - "license": "MIT", - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" + "license": "MIT" + }, + "node_modules/mailgun.js": { + "version": "8.2.1", + "license": "MIT", + "dependencies": { + "axios": "^1.3.3", + "base-64": "^1.0.0", + "url-join": "^4.0.1" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postgres-array": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "license": "MIT", + "node_modules/make-error": { + "version": "1.3.6", + "license": "ISC" + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "bin": { + "marked": "bin/marked.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 12" } }, - "node_modules/postgres-date": { - "version": "1.0.7", + "node_modules/md5": { + "version": "2.3.0", + "license": "BSD-3-Clause", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "license": "MIT", + "node_modules/memfs": { + "version": "3.5.1", + "license": "Unlicense", "dependencies": { - "xtend": "^4.0.0" + "fs-monkey": "^1.0.3" }, "engines": { - "node": ">=0.10.0" + "node": ">= 4.0.0" } }, - "node_modules/posthog-node": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-3.1.3.tgz", - "integrity": "sha512-UaOOoWEUYTcaaDe1w0fgHW/sXvFr3RO0l7yI7RUDzkZNZCfwXNO9r3pc14d1EtNppF/SHBrV5hNiZZATpf/vUw==", + "node_modules/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", "dependencies": { - "axios": "^1.6.0", - "rusha": "^0.8.14" - }, - "engines": { - "node": ">=15.0.0" + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" } }, - "node_modules/pprof-format": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/pprof-format/-/pprof-format-2.0.7.tgz", - "integrity": "sha512-1qWaGAzwMpaXJP9opRa23nPnt2Egi7RMNoNBptEE/XwHbcn4fC2b/4U4bKc5arkGkIh2ZabpF2bEb+c5GNHEKA==" + "node_modules/merge-descriptors": { + "version": "1.0.1", + "license": "MIT" }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } + "node_modules/merge-stream": { + "version": "2.0.0", + "license": "MIT" }, - "node_modules/prettier": { - "version": "2.8.0", - "dev": true, + "node_modules/merge2": { + "version": "1.4.1", "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">= 8" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "dev": true, + "node_modules/methods": { + "version": "1.1.2", "license": "MIT", - "dependencies": { - "fast-diff": "^1.1.2" - }, "engines": { - "node": ">=6.0.0" + "node": ">= 0.6" } }, - "node_modules/pretty-format": { - "version": "29.6.1", - "dev": true, + "node_modules/micromatch": { + "version": "4.0.5", "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8.6" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, + "node_modules/mime": { + "version": "1.6.0", "license": "MIT", - "engines": { - "node": ">=10" + "bin": { + "mime": "cli.js" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/proc-log": { - "version": "3.0.0", - "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/progress": { - "version": "2.0.3", - "dev": true, + "node_modules/mime-db": { + "version": "1.52.0", "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": ">= 0.6" } }, - "node_modules/promptly": { - "version": "3.2.0", + "node_modules/mime-types": { + "version": "2.1.35", "license": "MIT", "dependencies": { - "read": "^1.0.4" + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" + "node_modules/mimer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mimer/-/mimer-2.0.2.tgz", + "integrity": "sha512-izxvjsB7Ur5HrTbPu6VKTrzxSMBFBqyZQc6dWlZNQ4/wAvf886fD4lrjtFd8IQ8/WmZKdxKjUtqFFNaj3hQ52g==", + "bin": { + "mimer": "bin/mimer" + }, + "engines": { + "node": ">= 12" } }, - "node_modules/properties-reader": { - "version": "2.2.0", - "dev": true, + "node_modules/mimic-fn": { + "version": "2.1.0", "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4" - }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/proto3-json-serializer": { - "version": "1.1.1", - "license": "Apache-2.0", + "node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", "dependencies": { - "protobufjs": "^7.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=12.0.0" + "node": "*" } }, - "node_modules/protobufjs": { - "version": "7.2.5", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, + "node_modules/minipass": { + "version": "6.0.2", + "license": "ISC", "engines": { - "node": ">=12.0.0" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", + "node_modules/mkdirp": { + "version": "1.0.4", "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">= 0.10" + "node": ">=10" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/pstree.remy": { - "version": "1.1.8", + "node_modules/mkdirp-classic": { + "version": "0.5.3", "dev": true, "license": "MIT" }, - "node_modules/pump": { - "version": "3.0.0", + "node_modules/mlly": { + "version": "1.4.0", "dev": true, "license": "MIT", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" } }, - "node_modules/punycode": { - "version": "2.1.1", + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, + "node_modules/moment": { + "version": "2.29.4", "license": "MIT", "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/qs": { - "version": "6.11.0", - "license": "BSD-3-Clause", + "node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/msgpack-lite": { + "version": "0.1.26", + "resolved": "https://registry.npmjs.org/msgpack-lite/-/msgpack-lite-0.1.26.tgz", + "integrity": "sha512-SZ2IxeqZ1oRFGo0xFGbvBJWMp3yLIY9rlIJyxy8CGrwZn1f0ZK4r6jV/AM1r0FZMDUkWkglOk/eeKIL9g77Nxw==", "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" + "event-lite": "^0.1.1", + "ieee754": "^1.1.8", + "int64-buffer": "^0.1.9", + "isarray": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "msgpack": "bin/msgpack" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "license": "MIT" + "node_modules/msgpack-lite/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, - "node_modules/queue-microtask": { - "version": "1.2.3", + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "license": "ISC" + }, + "node_modules/mz": { + "version": "2.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.17.0", "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/nango": { + "resolved": "packages/cli", + "link": true + }, + "node_modules/nanoid": { + "version": "3.3.6", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT" - }, - "node_modules/queue-tick": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/random-bytes": { - "version": "1.0.0", "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, "engines": { - "node": ">= 0.8" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" }, - "node_modules/range-parser": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "dev": true, + "license": "MIT" }, - "node_modules/raw-body": { - "version": "2.5.1", + "node_modules/negotiator": { + "version": "0.6.3", "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, - "node_modules/react-is": { - "version": "18.2.0", - "dev": true, + "node_modules/neo-async": { + "version": "2.6.2", "license": "MIT" }, - "node_modules/read": { - "version": "1.0.7", + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" + }, + "node_modules/node-cron": { + "version": "3.0.2", "license": "ISC", "dependencies": { - "mute-stream": "~0.0.4" + "uuid": "8.3.2" }, "engines": { - "node": ">=0.8" + "node": ">=6.0.0" } }, - "node_modules/readable-stream": { - "version": "3.6.1", + "node_modules/node-cron/node_modules/uuid": { + "version": "8.3.2", "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" } }, - "node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", + "node_modules/node-fetch": { + "version": "2.6.12", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">=10" + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/readdirp": { - "version": "3.6.0", - "license": "MIT", + "node_modules/node-fetch-h2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", + "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", "dependencies": { - "picomatch": "^2.2.1" + "http2-client": "^1.2.5" }, "engines": { - "node": ">=8.10.0" + "node": "4.x || >=6.0.0" } }, - "node_modules/rechoir": { - "version": "0.8.0", - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" + "node_modules/node-gyp-build": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.9.0.tgz", + "integrity": "sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/redis": { - "version": "4.6.11", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.11.tgz", - "integrity": "sha512-kg1Lt4NZLYkAjPOj/WcyIGWfZfnyfKo1Wg9YKVSlzhFwxpFIl3LYI8BWy1Ab963LLDsTz2+OwdsesHKljB3WMQ==", + "node_modules/node-readfiles": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", + "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", "dependencies": { - "@redis/bloom": "1.2.0", - "@redis/client": "1.5.12", - "@redis/graph": "1.1.1", - "@redis/json": "1.0.6", - "@redis/search": "1.1.6", - "@redis/time-series": "1.0.5" + "es6-promise": "^3.2.1" } }, - "node_modules/regenerate": { - "version": "1.4.2", - "dev": true, + "node_modules/node-readfiles/node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==" + }, + "node_modules/node-releases": { + "version": "2.0.10", "license": "MIT" }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", + "node_modules/nodemon": { + "version": "3.0.1", "dev": true, "license": "MIT", "dependencies": { - "regenerate": "^1.4.2" + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "dev": true, - "license": "MIT" - }, - "node_modules/regenerator-transform": { - "version": "0.15.1", + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.8.4" + "ms": "^2.1.1" } }, - "node_modules/regexpp": { - "version": "3.2.0", + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "node": ">=4" } }, - "node_modules/regexpu-core": { - "version": "5.3.2", + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/regjsparser": { - "version": "0.9.1", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/noms": { + "version": "0.0.0", + "license": "ISC", "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" } }, - "node_modules/require-from-string": { - "version": "2.0.2", + "node_modules/noms/node_modules/readable-stream": { + "version": "1.0.34", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/requires-port": { - "version": "1.0.0", + "node_modules/noms/node_modules/string_decoder": { + "version": "0.10.31", "license": "MIT" }, - "node_modules/resolve": { - "version": "1.22.1", + "node_modules/nopt": { + "version": "1.0.10", + "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "abbrev": "1" }, "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "nopt": "bin/nopt.js" } }, - "node_modules/resolve-cwd": { + "node_modules/normalize-path": { "version": "3.0.0", - "dev": true, "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-package-arg": { + "version": "10.1.0", + "license": "ISC", "dependencies": { - "resolve-from": "^5.0.0" + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, + "node_modules/npm-run-path": { + "version": "4.0.1", "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", + "node_modules/oas": { + "version": "20.10.3", + "resolved": "https://registry.npmjs.org/oas/-/oas-20.10.3.tgz", + "integrity": "sha512-dBxDuwn2ssggPMOqEKEzT4sjCqbkol8JozuWrpwD7chcmbKbverj5vpk2kmsczeyguFkLcKUOMcqUUimf9h+IQ==", + "dependencies": { + "@readme/json-schema-ref-parser": "^1.2.0", + "@types/json-schema": "^7.0.11", + "json-schema-merge-allof": "^0.8.1", + "jsonpath-plus": "^7.2.0", + "jsonpointer": "^5.0.0", + "memoizee": "^0.4.14", + "oas-normalize": "^8.4.0", + "openapi-types": "^12.1.1", + "path-to-regexp": "^6.2.0", + "remove-undefined-objects": "^3.0.0" + }, "engines": { - "node": ">=4" + "node": ">=14" } }, - "node_modules/restore-cursor": { - "version": "4.0.0", - "license": "MIT", + "node_modules/oas-kit-common": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", + "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/oas-linter": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", + "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", + "dependencies": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/Mermade/oas-kit?sponsor=1" } }, - "node_modules/retry": { - "version": "0.12.0", - "dev": true, - "license": "MIT", + "node_modules/oas-linter/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "engines": { - "node": ">= 4" + "node": ">= 6" } }, - "node_modules/reusify": { - "version": "1.0.4", - "dev": true, - "license": "MIT", + "node_modules/oas-normalize": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/oas-normalize/-/oas-normalize-8.4.1.tgz", + "integrity": "sha512-cGODg+AntZteJRHBiYDWKtcO2svWGMXuFWYu2I8b4hOrNiwB3hgDs/ScX3O9mYm6RpLsUIftt6rDHGc8eYG8aA==", + "dependencies": { + "@readme/openapi-parser": "^2.5.0", + "@readme/postman-to-openapi": "^4.1.0", + "js-yaml": "^4.1.0", + "node-fetch": "^2.6.1", + "openapi-types": "^12.1.0", + "swagger2openapi": "^7.0.8" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=14" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", + "node_modules/oas-resolver": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", + "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", "dependencies": { - "glob": "^7.1.3" + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" }, "bin": { - "rimraf": "bin.js" + "resolve": "resolve.js" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/Mermade/oas-kit?sponsor=1" } }, - "node_modules/rollup": { - "version": "3.26.2", - "dev": true, - "license": "MIT", - "bin": { - "rollup": "dist/bin/rollup" - }, + "node_modules/oas-resolver/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" + "node": ">= 6" + } + }, + "node_modules/oas-schema-walker": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", + "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", + "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", + "dependencies": { + "call-me-maybe": "^1.0.1", + "oas-kit-common": "^1.0.8", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "reftools": "^1.1.9", + "should": "^13.2.1", + "yaml": "^1.10.0" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" } }, - "node_modules/run-async": { + "node_modules/oas-validator/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/oas/node_modules/path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" + }, + "node_modules/oas/node_modules/remove-undefined-objects": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/remove-undefined-objects/-/remove-undefined-objects-3.0.0.tgz", + "integrity": "sha512-nxG1yYfc/Jxi+bNCBiqKhxVJPE+QvziIOKbD+Dxc93Uisz92v/ZYpo4WR0TJuf+dk2xE8lW2WPJsA3mDFzXy8w==", "engines": { - "node": ">=0.12.0" + "node": ">=16" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/oauth": { + "version": "0.10.0", + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/rusha": { - "version": "0.8.14", - "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.14.tgz", - "integrity": "sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==" + "node_modules/object-hash": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">= 6" + } }, - "node_modules/rxjs": { - "version": "7.8.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" + "node_modules/object-inspect": { + "version": "1.12.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rxjs/node_modules/tslib": { - "version": "2.5.0", - "license": "0BSD" - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-stable-stringify": { - "version": "2.4.2", + "node_modules/on-finished": { + "version": "2.4.1", "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, "engines": { - "node": ">=10" + "node": ">= 0.8" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/sax": { - "version": "1.2.4", - "license": "ISC" - }, - "node_modules/schema-utils": { - "version": "4.0.1", - "dev": true, + "node_modules/on-headers": { + "version": "1.0.2", "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">= 0.8" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "wrappy": "1" } }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", + "node_modules/onchange": { + "version": "7.1.0", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3" + "@blakeembrey/deque": "^1.0.5", + "@blakeembrey/template": "^1.0.0", + "arg": "^4.1.3", + "chokidar": "^3.3.1", + "cross-spawn": "^7.0.1", + "ignore": "^5.1.4", + "tree-kill": "^1.2.2" }, - "peerDependencies": { - "ajv": "^8.8.2" + "bin": { + "onchange": "dist/bin.js" } }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { + "node_modules/one-time": { "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.5.4", - "license": "ISC", + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "fn.name": "1.x.x" } }, - "node_modules/send": { - "version": "0.18.0", + "node_modules/onetime": { + "version": "5.1.2", "license": "MIT", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==" + }, + "node_modules/openapi3-ts": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-4.1.2.tgz", + "integrity": "sha512-B7gOkwsYMZO7BZXwJzXCuVagym2xhqsrilVvV0dnq2Di4+iLUXKVX9gOK23ZqaAHZOwABXN0QTdW8QnkUTX6DA==", "dependencies": { - "ms": "2.0.0" + "yaml": "^2.2.2" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "license": "MIT" - }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" + "node_modules/opentracing": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/opentracing/-/opentracing-0.14.7.tgz", + "integrity": "sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==", + "engines": { + "node": ">=0.10" } }, - "node_modules/serve-static": { - "version": "1.15.0", + "node_modules/optionator": { + "version": "0.9.1", + "dev": true, "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "license": "ISC" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "dev": true, + "node_modules/ora": { + "version": "6.3.1", "license": "MIT", "dependencies": { - "kind-of": "^6.0.2" + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shebang-command": { - "version": "2.0.0", + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.0.1", "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", + "node_modules/ora/node_modules/chalk": { + "version": "5.2.0", "license": "MIT", "engines": { - "node": ">=8" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/shell-quote": { - "version": "1.8.1", - "dev": true, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.0.1", "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/side-channel": { - "version": "1.0.4", + "node_modules/os-tmpdir": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/siginfo": { - "version": "2.0.0", + "node_modules/p-locate": { + "version": "5.0.0", "dev": true, - "license": "ISC" - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" - }, - "node_modules/simple-oauth2": { - "version": "5.0.0", - "license": "Apache-2.0", - "dependencies": { - "@hapi/hoek": "^10.0.1", - "@hapi/wreck": "^18.0.0", - "debug": "^4.3.4", - "joi": "^17.6.4" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", "license": "MIT", "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" + "p-limit": "^3.0.2" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/slash": { - "version": "3.0.0", - "dev": true, + "node_modules/p-try": { + "version": "2.2.0", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/slice-ansi": { - "version": "4.0.0", + "node_modules/packet-reader": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/pako": { + "version": "2.1.0", + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "callsites": "^3.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "node": ">=6" } }, - "node_modules/source-map": { - "version": "0.7.4", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" + "node_modules/parse-link-header": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-link-header/-/parse-link-header-2.0.0.tgz", + "integrity": "sha512-xjU87V0VyHZybn2RrCX5TIFGxTVZE6zqqZWMPlIKiSKuWh/X5WZdt+w1Ki1nXB+8L/KtL+nZ4iq+sfI6MrhhMw==", + "dependencies": { + "xtend": "~4.0.1" } }, - "node_modules/source-map-js": { - "version": "1.0.2", - "license": "BSD-3-Clause", + "node_modules/parseurl": { + "version": "1.3.3", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/source-map-loader": { - "version": "4.0.1", + "node_modules/passport": { + "version": "0.6.0", "license": "MIT", "dependencies": { - "abab": "^2.0.6", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.2" + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 0.4.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.72.1" + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" } }, - "node_modules/source-map-loader/node_modules/iconv-lite": { - "version": "0.6.3", - "license": "MIT", + "node_modules/passport-http": { + "version": "0.3.0", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "passport-strategy": "1.x.x" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "license": "MIT", + "node_modules/passport-local": { + "version": "1.0.0", "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "passport-strategy": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", + "node_modules/passport-strategy": { + "version": "1.0.0", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4.0" } }, - "node_modules/spawn-command": { - "version": "0.0.2-1", - "dev": true, - "license": "MIT" - }, - "node_modules/split-ca": { + "node_modules/path-browserify": { "version": "1.0.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, - "node_modules/split2": { - "version": "4.1.0", - "license": "ISC", + "node_modules/path-exists": { + "version": "4.0.0", + "license": "MIT", "engines": { - "node": ">= 10.x" + "node": ">=8" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/ssh-remote-port-forward": { - "version": "1.0.4", - "dev": true, + "node_modules/path-is-absolute": { + "version": "1.0.1", "license": "MIT", - "dependencies": { - "@types/ssh2": "^0.5.48", - "ssh2": "^1.4.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ssh-remote-port-forward/node_modules/@types/ssh2": { - "version": "0.5.52", - "dev": true, + "node_modules/path-key": { + "version": "3.1.1", "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/ssh2-streams": "*" + "engines": { + "node": ">=8" } }, - "node_modules/ssh2": { - "version": "1.14.0", - "dev": true, - "hasInstallScript": true, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "license": "BlueOak-1.0.0", "dependencies": { - "asn1": "^0.2.6", - "bcrypt-pbkdf": "^1.0.2" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=10.16.0" + "node": ">=16 || 14 >=14.17" }, - "optionalDependencies": { - "cpu-features": "~0.0.8", - "nan": "^2.17.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/stack-trace": { - "version": "0.0.10", - "license": "MIT", + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "9.1.2", + "license": "ISC", "engines": { - "node": "*" + "node": "14 || >=16.14" } }, - "node_modules/stackback": { - "version": "0.0.2", - "dev": true, + "node_modules/path-to-regexp": { + "version": "0.1.7", "license": "MIT" }, - "node_modules/statuses": { - "version": "2.0.1", + "node_modules/path-type": { + "version": "4.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/std-env": { - "version": "3.3.3", + "node_modules/pathe": { + "version": "1.1.1", "dev": true, "license": "MIT" }, - "node_modules/stdin-discarder": { - "version": "0.1.0", + "node_modules/pathval": { + "version": "1.1.1", + "dev": true, "license": "MIT", - "dependencies": { - "bl": "^5.0.0" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/streamx": { - "version": "2.15.1", - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" + "node": "*" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } + "node_modules/pause": { + "version": "0.0.1" }, - "node_modules/string-width": { - "version": "4.2.3", + "node_modules/pg": { + "version": "8.9.0", "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.5.2", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" }, "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "node": ">= 8.0.0" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" + "peerDependencies": { + "pg-native": ">=3.0.1" }, - "engines": { - "node": ">=8" + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "node_modules/pg-connection-string": { + "version": "2.5.0", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "license": "ISC", "engines": { - "node": ">=8" + "node": ">=4.0.0" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, + "node_modules/pg-pool": { + "version": "3.5.2", "license": "MIT", - "engines": { - "node": ">=6" + "peerDependencies": { + "pg": ">=8.0" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "dev": true, + "node_modules/pg-protocol": { + "version": "1.6.0", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, - "node_modules/strip-literal": { - "version": "1.0.1", - "dev": true, + "node_modules/pgpass": { + "version": "1.0.5", "license": "MIT", "dependencies": { - "acorn": "^8.8.2" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "split2": "^4.1.0" } }, - "node_modules/strnum": { - "version": "1.0.5", - "license": "MIT" + "node_modules/picocolors": { + "version": "1.0.0", + "license": "ISC" }, - "node_modules/sucrase": { - "version": "3.34.0", - "dev": true, + "node_modules/picomatch": { + "version": "2.3.1", "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, "engines": { - "node": ">=8" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", + "node_modules/pirates": { + "version": "4.0.6", "dev": true, "license": "MIT", "engines": { "node": ">= 6" } }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "dev": true, - "license": "ISC", + "node_modules/pkg-dir": { + "version": "4.2.0", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "find-up": "^4.0.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/supports-color": { - "version": "7.2.0", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/swc-loader": { - "version": "0.2.3", + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", "license": "MIT", - "peerDependencies": { - "@swc/core": "^1.2.147", - "webpack": ">=2" - } - }, - "node_modules/table": { - "version": "6.8.1", - "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=8" } }, - "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "dev": true, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "p-try": "^2.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.2.1", - "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tar-fs": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "dev": true, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", "license": "MIT", "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/tar-stream/node_modules/bl": { - "version": "4.1.0", + "node_modules/pkg-types": { + "version": "1.0.3", "dev": true, "license": "MIT", "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" } }, - "node_modules/tar-stream/node_modules/buffer": { - "version": "5.7.1", + "node_modules/postcss": { + "version": "8.4.31", "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "opencollective", + "url": "https://opencollective.com/postcss/" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "node_modules/tarn": { - "version": "3.0.2", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/terser": { - "version": "5.17.4", - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.8", + "node_modules/postcss-load-config": { + "version": "4.0.1", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 14" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://opencollective.com/postcss/" }, "peerDependencies": { - "webpack": "^5.1.0" + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { + "postcss": { "optional": true }, - "uglify-js": { + "ts-node": { "optional": true } } }, - "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", + "node_modules/postgres-array": { + "version": "2.0.0", "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "engines": { + "node": ">=4" } }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.2", + "node_modules/postgres-bytea": { + "version": "1.0.0", "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=0.10.0" } }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "license": "MIT" + "node_modules/postgres-date": { + "version": "1.0.7", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/testcontainers": { - "version": "9.12.0", - "dev": true, + "node_modules/postgres-interval": { + "version": "1.2.0", "license": "MIT", "dependencies": { - "@balena/dockerignore": "^1.0.2", - "@types/archiver": "^5.3.2", - "@types/dockerode": "^3.3.19", - "archiver": "^5.3.1", - "async-lock": "^1.4.0", - "byline": "^5.0.0", - "debug": "^4.3.4", - "docker-compose": "^0.24.1", - "dockerode": "^3.3.5", - "get-port": "^5.1.1", - "node-fetch": "^2.6.12", - "proper-lockfile": "^4.1.2", - "properties-reader": "^2.2.0", - "ssh-remote-port-forward": "^1.0.4", - "tar-fs": "^2.1.1", - "tmp": "^0.2.1" + "xtend": "^4.0.0" }, "engines": { - "node": ">= 10.16" + "node": ">=0.10.0" } }, - "node_modules/testcontainers/node_modules/tmp": { - "version": "0.2.1", - "dev": true, - "license": "MIT", + "node_modules/posthog-node": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-3.1.3.tgz", + "integrity": "sha512-UaOOoWEUYTcaaDe1w0fgHW/sXvFr3RO0l7yI7RUDzkZNZCfwXNO9r3pc14d1EtNppF/SHBrV5hNiZZATpf/vUw==", "dependencies": { - "rimraf": "^3.0.0" + "axios": "^1.6.0", + "rusha": "^0.8.14" }, "engines": { - "node": ">=8.17.0" + "node": ">=15.0.0" } }, - "node_modules/text-hex": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "license": "MIT" + "node_modules/pprof-format": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/pprof-format/-/pprof-format-2.0.7.tgz", + "integrity": "sha512-1qWaGAzwMpaXJP9opRa23nPnt2Egi7RMNoNBptEE/XwHbcn4fC2b/4U4bKc5arkGkIh2ZabpF2bEb+c5GNHEKA==" }, - "node_modules/thenify": { - "version": "3.3.1", + "node_modules/prelude-ls": { + "version": "1.2.1", "dev": true, "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/thenify-all": { - "version": "1.6.0", + "node_modules/prettier": { + "version": "2.8.0", "dev": true, "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" + "bin": { + "prettier": "bin-prettier.js" }, "engines": { - "node": ">=0.8" + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/through2": { - "version": "2.0.5", + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "dev": true, "license": "MIT", "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/through2/node_modules/isarray": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.8", + "node_modules/pretty-format": { + "version": "29.6.1", + "dev": true, "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/through2/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/tildify": { - "version": "2.0.0", - "license": "MIT", + "node_modules/proc-log": { + "version": "3.0.0", + "license": "ISC", "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/tinybench": { - "version": "2.5.0", - "dev": true, + "node_modules/process-nextick-args": { + "version": "2.0.1", "license": "MIT" }, - "node_modules/tinypool": { - "version": "0.6.0", + "node_modules/progress": { + "version": "2.0.3", "dev": true, "license": "MIT", "engines": { - "node": ">=14.0.0" + "node": ">=0.4.0" } }, - "node_modules/tinyspy": { - "version": "2.1.1", - "dev": true, + "node_modules/promptly": { + "version": "3.2.0", "license": "MIT", - "engines": { - "node": ">=14.0.0" + "dependencies": { + "read": "^1.0.4" } }, - "node_modules/tmp": { - "version": "0.0.33", - "license": "MIT", + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dependencies": { - "os-tmpdir": "~1.0.2" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" }, "engines": { - "node": ">=0.6.0" + "node": ">= 6" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", + "node_modules/proper-lockfile": { + "version": "4.1.2", + "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", + "node_modules/properties-reader": { + "version": "2.2.0", + "dev": true, "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "mkdirp": "^1.0.4" }, "engines": { - "node": ">=8.0" + "node": ">=10" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "license": "MIT", + "node_modules/proto3-json-serializer": { + "version": "1.1.1", + "license": "Apache-2.0", + "dependencies": { + "protobufjs": "^7.0.0" + }, "engines": { - "node": ">=0.6" + "node": ">=12.0.0" } }, - "node_modules/touch": { - "version": "3.1.0", - "dev": true, - "license": "ISC", + "node_modules/protobufjs": { + "version": "7.2.5", + "hasInstallScript": true, + "license": "BSD-3-Clause", "dependencies": { - "nopt": "~1.0.10" + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" }, - "bin": { - "nodetouch": "bin/nodetouch.js" + "engines": { + "node": ">=12.0.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "license": "MIT" - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "dev": true, + "node_modules/proxy-addr": { + "version": "2.0.7", "license": "MIT", - "bin": { - "tree-kill": "cli.js" + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/triple-beam": { - "version": "1.3.0", + "node_modules/proxy-from-env": { + "version": "1.1.0", "license": "MIT" }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", + "node_modules/pstree.remy": { + "version": "1.1.8", "dev": true, - "license": "Apache-2.0" + "license": "MIT" }, - "node_modules/ts-node": { - "version": "10.9.1", + "node_modules/pump": { + "version": "3.0.0", + "dev": true, "license": "MIT", "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/tsup": { - "version": "7.2.0", - "dev": true, + "node_modules/punycode": { + "version": "2.1.1", "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "license": "BSD-3-Clause", "dependencies": { - "bundle-require": "^4.0.0", - "cac": "^6.7.12", - "chokidar": "^3.5.1", - "debug": "^4.3.1", - "esbuild": "^0.18.2", - "execa": "^5.0.0", - "globby": "^11.0.3", - "joycon": "^3.0.1", - "postcss-load-config": "^4.0.1", - "resolve-from": "^5.0.0", - "rollup": "^3.2.5", - "source-map": "0.8.0-beta.0", - "sucrase": "^3.20.3", - "tree-kill": "^1.2.2" - }, - "bin": { - "tsup": "dist/cli-default.js", - "tsup-node": "dist/cli-node.js" + "side-channel": "^1.0.4" }, "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "@swc/core": "^1", - "postcss": "^8.4.12", - "typescript": ">=4.1.0" + "node": ">=0.6" }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "license": "MIT" + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "postcss": { - "optional": true + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "typescript": { - "optional": true + { + "type": "consulting", + "url": "https://feross.org/support" } - } - }, - "node_modules/tsup/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "cpu": [ - "arm64" ], - "dev": true, + "license": "MIT" + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/random-bytes": { + "version": "1.0.0", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/tsup/node_modules/esbuild": { - "version": "0.18.20", - "dev": true, - "hasInstallScript": true, + "node_modules/randombytes": { + "version": "2.1.0", "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" + "dependencies": { + "safe-buffer": "^5.1.0" } }, - "node_modules/tsup/node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, + "node_modules/range-parser": { + "version": "1.2.1", "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/tsup/node_modules/source-map": { - "version": "0.8.0-beta.0", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/raw-body": { + "version": "2.5.1", + "license": "MIT", "dependencies": { - "whatwg-url": "^7.0.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 8" + "node": ">= 0.8" } }, - "node_modules/tsup/node_modules/tr46": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/tsup/node_modules/webidl-conversions": { - "version": "4.0.2", + "node_modules/react-is": { + "version": "18.2.0", "dev": true, - "license": "BSD-2-Clause" + "license": "MIT" }, - "node_modules/tsup/node_modules/whatwg-url": { - "version": "7.1.0", - "dev": true, - "license": "MIT", + "node_modules/read": { + "version": "1.0.7", + "license": "ISC", "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" } }, - "node_modules/tsutils": { - "version": "3.21.0", - "dev": true, + "node_modules/readable-stream": { + "version": "3.6.1", "license": "MIT", "dependencies": { - "tslib": "^1.8.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "dev": true, - "license": "Unlicense" - }, - "node_modules/type-check": { - "version": "0.4.0", - "dev": true, - "license": "MIT", + "node_modules/readdir-glob": { + "version": "1.1.3", + "license": "Apache-2.0", "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" + "minimatch": "^5.1.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "dev": true, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-is": { - "version": "1.6.18", + "node_modules/readdirp": { + "version": "3.6.0", "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "picomatch": "^2.2.1" }, "engines": { - "node": ">= 0.6" + "node": ">=8.10.0" } }, - "node_modules/typescript": { - "version": "4.9.3", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node_modules/rechoir": { + "version": "0.8.0", + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" }, "engines": { - "node": ">=4.2.0" + "node": ">= 10.13.0" } }, - "node_modules/ufo": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/uid-safe": { - "version": "2.1.5", - "license": "MIT", + "node_modules/redis": { + "version": "4.6.11", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.11.tgz", + "integrity": "sha512-kg1Lt4NZLYkAjPOj/WcyIGWfZfnyfKo1Wg9YKVSlzhFwxpFIl3LYI8BWy1Ab963LLDsTz2+OwdsesHKljB3WMQ==", "dependencies": { - "random-bytes": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" + "@redis/bloom": "1.2.0", + "@redis/client": "1.5.12", + "@redis/graph": "1.1.1", + "@redis/json": "1.0.6", + "@redis/search": "1.1.6", + "@redis/time-series": "1.0.5" } }, - "node_modules/undefsafe": { - "version": "2.0.5", + "node_modules/reftools": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", + "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", "dev": true, "license": "MIT" }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", "dev": true, "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, "engines": { "node": ">=4" } }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", "dev": true, "license": "MIT", "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" + "@babel/runtime": "^7.8.4" } }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", + "node_modules/regexpp": { + "version": "3.2.0", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", + "node_modules/regexpu-core": { + "version": "5.3.2", "dev": true, "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, "engines": { "node": ">=4" } }, - "node_modules/unionfs": { - "version": "4.4.0", + "node_modules/regjsparser": { + "version": "0.9.1", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "fs-monkey": "^1.0.0" + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" } }, - "node_modules/universal-user-agent": { - "version": "6.0.0", - "license": "ISC" + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } }, - "node_modules/universalify": { - "version": "2.0.0", - "license": "MIT", + "node_modules/remove-undefined-objects": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/remove-undefined-objects/-/remove-undefined-objects-2.0.2.tgz", + "integrity": "sha512-b6x4MUtR4YBW1aCoGx3tE4mA2PFjiXSmtSdNmLexQzUdZa4ybnJAItXLKpkcVgCUJIzJtk2DFG402sMSEMlonQ==", "engines": { - "node": ">= 10.0.0" + "node": ">=14" } }, - "node_modules/unpipe": { - "version": "1.0.0", + "node_modules/require-directory": { + "version": "2.1.1", "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/untildify": { - "version": "4.0.0", + "node_modules/require-from-string": { + "version": "2.0.2", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/requires-port": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.1", "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { - "update-browserslist-db": "cli.js" + "resolve": "bin/resolve" }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "license": "BSD-2-Clause", + "node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "punycode": "^2.1.0" + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/url-join": { - "version": "4.0.1", - "license": "MIT" - }, - "node_modules/url-parse": { - "version": "1.5.10", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4.0" + "node": ">=8" } }, - "node_modules/uuid": { - "version": "9.0.0", + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "engines": { + "node": ">=4" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, - "license": "MIT" - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "license": "MIT" + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } }, - "node_modules/validate-npm-package-name": { - "version": "5.0.0", - "license": "ISC", + "node_modules/restore-cursor": { + "version": "4.0.0", + "license": "MIT", "dependencies": { - "builtins": "^5.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vary": { - "version": "1.1.2", + "node_modules/retry": { + "version": "0.12.0", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 4" } }, - "node_modules/vite": { - "version": "4.4.3", - "dev": true, + "node_modules/reusify": { + "version": "1.0.4", "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.25", - "rollup": "^3.25.2" + "glob": "^7.1.3" }, "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" + "rimraf": "bin.js" }, "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" }, "optionalDependencies": { "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true + } + }, + "node_modules/run-async": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "sass": { - "optional": true + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "stylus": { - "optional": true + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rusha": { + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.14.tgz", + "integrity": "sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==" + }, + "node_modules/rxjs": { + "version": "7.8.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "2.5.0", + "license": "0BSD" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "sugarss": { - "optional": true + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "terser": { - "optional": true + { + "type": "consulting", + "url": "https://feross.org/support" } + ], + "license": "MIT" + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.2", + "license": "MIT", + "engines": { + "node": ">=10" } }, - "node_modules/vite-node": { - "version": "0.33.0", + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.2.4", + "license": "ISC" + }, + "node_modules/schema-utils": { + "version": "4.0.1", "dev": true, "license": "MIT", "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "mlly": "^1.4.0", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">=v14.18.0" + "node": ">= 12.13.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.12", - "cpu": [ - "arm64" - ], + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.12.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.18.12", + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", "dev": true, - "hasInstallScript": true, "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" + "dependencies": { + "fast-deep-equal": "^3.1.3" }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.12", - "@esbuild/android-arm64": "0.18.12", - "@esbuild/android-x64": "0.18.12", - "@esbuild/darwin-arm64": "0.18.12", - "@esbuild/darwin-x64": "0.18.12", - "@esbuild/freebsd-arm64": "0.18.12", - "@esbuild/freebsd-x64": "0.18.12", - "@esbuild/linux-arm": "0.18.12", - "@esbuild/linux-arm64": "0.18.12", - "@esbuild/linux-ia32": "0.18.12", - "@esbuild/linux-loong64": "0.18.12", - "@esbuild/linux-mips64el": "0.18.12", - "@esbuild/linux-ppc64": "0.18.12", - "@esbuild/linux-riscv64": "0.18.12", - "@esbuild/linux-s390x": "0.18.12", - "@esbuild/linux-x64": "0.18.12", - "@esbuild/netbsd-x64": "0.18.12", - "@esbuild/openbsd-x64": "0.18.12", - "@esbuild/sunos-x64": "0.18.12", - "@esbuild/win32-arm64": "0.18.12", - "@esbuild/win32-ia32": "0.18.12", - "@esbuild/win32-x64": "0.18.12" + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/vitest": { - "version": "0.33.0", + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.5.4", + "license": "ISC", "dependencies": { - "@types/chai": "^4.3.5", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "@vitest/expect": "0.33.0", - "@vitest/runner": "0.33.0", - "@vitest/snapshot": "0.33.0", - "@vitest/spy": "0.33.0", - "@vitest/utils": "0.33.0", - "acorn": "^8.9.0", - "acorn-walk": "^8.2.0", - "cac": "^6.7.14", - "chai": "^4.3.7", - "debug": "^4.3.4", - "local-pkg": "^0.4.3", - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3", - "strip-literal": "^1.0.1", - "tinybench": "^2.5.0", - "tinypool": "^0.6.0", - "vite": "^3.0.0 || ^4.0.0", - "vite-node": "0.33.0", - "why-is-node-running": "^2.2.2" + "lru-cache": "^6.0.0" }, "bin": { - "vitest": "vitest.mjs" + "semver": "bin/semver.js" }, "engines": { - "node": ">=v14.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@vitest/browser": "*", - "@vitest/ui": "*", - "happy-dom": "*", - "jsdom": "*", - "playwright": "*", - "safaridriver": "*", - "webdriverio": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true - } + "node": ">=10" } }, - "node_modules/vm": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/vm/-/vm-0.1.0.tgz", - "integrity": "sha512-1aKVjgohVDnVhGrJLhl2k8zIrapH+7HsdnIjGvBp3XX2OCj6XGzsIbDp9rZ3r7t6qgDfXEE1EoEAEOLJm9LKnw==" - }, - "node_modules/vm2": { - "version": "3.9.19", + "node_modules/send": { + "version": "0.18.0", "license": "MIT", "dependencies": { - "acorn": "^8.7.0", - "acorn-walk": "^8.2.0" - }, - "bin": { - "vm2": "bin/vm2" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, "engines": { - "node": ">=6.0" + "node": ">= 0.8.0" } }, - "node_modules/watchpack": { - "version": "2.4.0", + "node_modules/send/node_modules/debug": { + "version": "2.6.9", "license": "MIT", "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" + "ms": "2.0.0" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "license": "MIT", + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "license": "BSD-3-Clause", "dependencies": { - "defaults": "^1.0.3" + "randombytes": "^2.1.0" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "license": "BSD-2-Clause" - }, - "node_modules/webpack": { - "version": "5.85.1", + "node_modules/serve-static": { + "version": "1.15.0", "license": "MIT", "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.14.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" }, "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } + "node": ">= 0.8.0" } }, - "node_modules/webpack-cli": { - "version": "5.1.3", + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", "dev": true, "license": "MIT", "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" + "kind-of": "^6.0.2" }, "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } + "node": ">=8" } }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "dev": true, + "node_modules/shebang-command": { + "version": "2.0.0", "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, "engines": { - "node": ">=14" + "node": ">=8" } }, - "node_modules/webpack-cli/node_modules/interpret": { - "version": "3.1.1", - "dev": true, + "node_modules/shebang-regex": { + "version": "3.0.0", "license": "MIT", "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-merge": { - "version": "5.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" + "node": ">=8" } }, - "node_modules/webpack-node-externals": { - "version": "3.0.0", + "node_modules/shell-quote": { + "version": "1.8.1", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "license": "MIT", - "engines": { - "node": ">=10.13.0" + "node_modules/should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "dependencies": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.2", - "license": "MIT", + "node_modules/should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "should-type": "^1.4.0" } }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "license": "MIT", + "node_modules/should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" } }, - "node_modules/which": { - "version": "2.0.2", - "license": "ISC", + "node_modules/should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==" + }, + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" + "should-type": "^1.3.0", + "should-util": "^1.0.0" } }, - "node_modules/why-is-node-running": { - "version": "2.2.2", - "dev": true, + "node_modules/should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==" + }, + "node_modules/side-channel": { + "version": "1.0.4", "license": "MIT", "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wildcard": { - "version": "2.0.1", + "node_modules/siginfo": { + "version": "2.0.0", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/winston": { - "version": "3.8.2", - "license": "MIT", + "node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/simple-oauth2": { + "version": "5.0.0", + "license": "Apache-2.0", "dependencies": { - "@colors/colors": "1.5.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.4.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" - }, - "engines": { - "node": ">= 12.0.0" + "@hapi/hoek": "^10.0.1", + "@hapi/wreck": "^18.0.0", + "debug": "^4.3.4", + "joi": "^17.6.4" } }, - "node_modules/winston-daily-rotate-file": { - "version": "4.7.1", + "node_modules/simple-swizzle": { + "version": "0.2.2", "license": "MIT", "dependencies": { - "file-stream-rotator": "^0.6.1", - "object-hash": "^2.0.1", - "triple-beam": "^1.3.0", - "winston-transport": "^4.4.0" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "winston": "^3" + "is-arrayish": "^0.3.1" } }, - "node_modules/winston-transport": { - "version": "4.5.0", + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", - "triple-beam": "^1.3.0" + "semver": "^7.5.3" }, "engines": { - "node": ">= 6.4.0" + "node": ">=10" } }, - "node_modules/word-wrap": { - "version": "1.2.5", + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/wrap-ansi": { - "version": "7.0.0", + "node_modules/slice-ansi": { + "version": "4.0.0", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "node_modules/source-map": { + "version": "0.7.4", + "license": "BSD-3-Clause", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">= 8" } }, - "node_modules/wrappy": { + "node_modules/source-map-js": { "version": "1.0.2", - "license": "ISC" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/ws": { - "version": "8.12.1", + "node_modules/source-map-loader": { + "version": "4.0.1", "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, "engines": { - "node": ">=10.0.0" + "node": ">= 14.15.0" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "peerDependencies": { + "webpack": "^5.72.1" } }, - "node_modules/xml2js": { - "version": "0.5.0", + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", "license": "MIT", "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=0.10.0" } }, - "node_modules/xmlbuilder": { - "version": "11.0.1", + "node_modules/source-map-support": { + "version": "0.5.21", "license": "MIT", - "engines": { - "node": ">=4.0" + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/xtend": { - "version": "4.0.2", - "license": "MIT", + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", "engines": { - "node": ">=0.4" + "node": ">=0.10.0" } }, - "node_modules/y18n": { - "version": "5.0.8", - "license": "ISC", - "engines": { - "node": ">=10" - } + "node_modules/spawn-command": { + "version": "0.0.2-1", + "dev": true, + "license": "MIT" }, - "node_modules/yallist": { - "version": "4.0.0", + "node_modules/split-ca": { + "version": "1.0.1", + "dev": true, "license": "ISC" }, - "node_modules/yaml": { - "version": "2.3.1", + "node_modules/split2": { + "version": "4.1.0", "license": "ISC", "engines": { - "node": ">= 14" + "node": ">= 10.x" } }, - "node_modules/yargs": { - "version": "17.7.1", + "node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/ssh-remote-port-forward": { + "version": "1.0.4", "dev": true, "license": "MIT", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "@types/ssh2": "^0.5.48", + "ssh2": "^1.4.0" + } + }, + "node_modules/ssh-remote-port-forward/node_modules/@types/ssh2": { + "version": "0.5.52", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/ssh2-streams": "*" + } + }, + "node_modules/ssh2": { + "version": "1.14.0", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "asn1": "^0.2.6", + "bcrypt-pbkdf": "^1.0.2" }, "engines": { - "node": ">=12" + "node": ">=10.16.0" + }, + "optionalDependencies": { + "cpu-features": "~0.0.8", + "nan": "^2.17.0" } }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "license": "ISC", + "node_modules/ssri": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "dependencies": { + "minipass": "^7.0.3" + }, "engines": { - "node": ">=12" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/yn": { - "version": "3.1.1", + "node_modules/ssri/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", "license": "MIT", "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/yocto-queue": { + "node_modules/stackback": { + "version": "0.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.3.3", + "dev": true, + "license": "MIT" + }, + "node_modules/stdin-discarder": { "version": "0.1.0", "license": "MIT", + "dependencies": { + "bl": "^5.0.0" + }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zip-stream": { - "version": "4.1.0", - "dev": true, + "node_modules/streamx": { + "version": "2.15.1", "license": "MIT", "dependencies": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.1.0", - "readable-stream": "^3.6.0" + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 10" + "node": ">=8" } }, - "packages/cli": { - "name": "nango", - "version": "0.36.52", - "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.22.5", - "@inquirer/prompts": "^2.3.0", - "@nangohq/shared": "0.36.52", - "@vercel/ncc": "^0.36.1", - "ajv": "^8.12.0", - "ajv-errors": "^3.0.0", - "axios": "^1.2.0", - "byots": "^5.0.0-dev.20221103.1.34", - "chokidar": "^3.5.3", - "commander": "^10.0.1", - "copyfiles": "^2.4.1", - "dotenv": "^16.0.3", - "ejs": "^3.1.9", - "esbuild": "^0.17.19", - "figlet": "^1.6.0", - "js-yaml": "^4.1.0", - "memfs": "^3.5.1", - "npm-package-arg": "^10.1.0", - "ora": "^6.3.1", - "promptly": "^3.2.0", - "semver": "^7.5.2", - "ts-node": "^10.9.1", - "typescript": "^5.0.4", - "vm": "^0.1.0" - }, - "bin": { - "nango": "dist/index.js" - }, - "devDependencies": { - "@babel/core": "^7.22.1", - "@babel/preset-env": "^7.22.4", - "@babel/preset-typescript": "^7.21.5", - "@types/babel__traverse": "^7.20.1", - "@types/babel-traverse": "^6.25.7", - "@types/commander": "^2.12.2", - "@types/ejs": "^3.1.2", - "@types/figlet": "^1.5.6", - "@types/glob": "^8.1.0", - "@types/node": "^20.1.4", - "@types/npm-package-arg": "^6.1.1", - "@types/promptly": "^3.0.2", - "babel-loader": "^9.1.2", - "webpack": "^5.85.1", - "webpack-cli": "^5.1.3", - "webpack-node-externals": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=16.7" + "node": ">=8" } }, - "packages/cli/node_modules/@types/node": { - "version": "20.1.7", - "dev": true, - "license": "MIT" - }, - "packages/cli/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "ansi-regex": "^5.0.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=8" } }, - "packages/cli/node_modules/ajv-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", - "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", - "peerDependencies": { - "ajv": "^8.0.1" + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "packages/cli/node_modules/commander": { - "version": "10.0.1", + "node_modules/strip-final-newline": { + "version": "2.0.0", "license": "MIT", "engines": { - "node": ">=14" + "node": ">=6" } }, - "packages/cli/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "packages/cli/node_modules/typescript": { - "version": "5.0.4", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12.20" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/frontend": { - "name": "@nangohq/frontend", - "version": "0.36.52", - "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY" - }, - "packages/node-client": { - "name": "@nangohq/node", - "version": "0.36.52", - "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", + "node_modules/strip-literal": { + "version": "1.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "axios": "^1.2.0" - }, - "devDependencies": { - "tsup": "^7.2.0" + "acorn": "^8.8.2" }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/sucrase": { + "version": "3.34.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/superjson": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", + "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swagger2openapi": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", + "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", + "dependencies": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "node-fetch-h2": "^2.3.0", + "node-readfiles": "^0.2.0", + "oas-kit-common": "^1.0.8", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "boast": "boast.js", + "oas-validate": "oas-validate.js", + "swagger2openapi": "swagger2openapi.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/swagger2openapi/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/swc-loader": { + "version": "0.2.3", + "license": "MIT", + "peerDependencies": { + "@swc/core": "^1.2.147", + "webpack": ">=2" + } + }, + "node_modules/table": { + "version": "6.8.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/bl": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/tar-stream/node_modules/buffer": { + "version": "5.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/tarn": { + "version": "3.0.2", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/terser": { + "version": "5.17.4", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.8", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.2", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/testcontainers": { + "version": "9.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@balena/dockerignore": "^1.0.2", + "@types/archiver": "^5.3.2", + "@types/dockerode": "^3.3.19", + "archiver": "^5.3.1", + "async-lock": "^1.4.0", + "byline": "^5.0.0", + "debug": "^4.3.4", + "docker-compose": "^0.24.1", + "dockerode": "^3.3.5", + "get-port": "^5.1.1", + "node-fetch": "^2.6.12", + "proper-lockfile": "^4.1.2", + "properties-reader": "^2.2.0", + "ssh-remote-port-forward": "^1.0.4", + "tar-fs": "^2.1.1", + "tmp": "^0.2.1" + }, + "engines": { + "node": ">= 10.16" + } + }, + "node_modules/testcontainers/node_modules/tmp": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/tildify": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "node_modules/tinybench": { + "version": "2.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/triple-beam": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/ts-algebra": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-1.2.2.tgz", + "integrity": "sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA==" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/ts-morph": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-17.0.1.tgz", + "integrity": "sha512-10PkHyXmrtsTvZSL+cqtJLTgFXkU43Gd0JCc0Rw6GchWbqKe0Rwgt1v3ouobTZwQzF1mGhDeAlWYBMGRV7y+3g==", + "dependencies": { + "@ts-morph/common": "~0.18.0", + "code-block-writer": "^11.0.3" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "license": "0BSD" + }, + "node_modules/tsup": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-require": "^4.0.0", + "cac": "^6.7.12", + "chokidar": "^3.5.1", + "debug": "^4.3.1", + "esbuild": "^0.18.2", + "execa": "^5.0.0", + "globby": "^11.0.3", + "joycon": "^3.0.1", + "postcss-load-config": "^4.0.1", + "resolve-from": "^5.0.0", + "rollup": "^3.2.5", + "source-map": "0.8.0-beta.0", + "sucrase": "^3.20.3", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/tsup/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsup/node_modules/esbuild": { + "version": "0.18.20", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/tsup/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tsup/node_modules/source-map": { + "version": "0.8.0-beta.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tsup/node_modules/tr46": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/tsup/node_modules/webidl-conversions": { + "version": "4.0.2", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/tsup/node_modules/whatwg-url": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/tsutils": { + "version": "3.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsx": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.6.2.tgz", + "integrity": "sha512-QPpBdJo+ZDtqZgAnq86iY/PD2KYCUPSUGIunHdGwyII99GKH+f3z3FZ8XNFLSGQIA4I365ui8wnQpl8OKLqcsg==", + "dev": true, + "dependencies": { + "esbuild": "~0.18.20", + "get-tsconfig": "^4.7.2" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "dev": true, + "license": "Unlicense" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "4.9.3", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ufo": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/uid-safe": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/undici": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.2.1.tgz", + "integrity": "sha512-7Wa9thEM6/LMnnKtxJHlc8SrTlDmxqJecgz1iy8KlsN0/iskQXOQCuPkrZLXbElPaSw5slFFyKIKXyJ3UtbApw==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unionfs": { + "version": "4.4.0", + "dependencies": { + "fs-monkey": "^1.0.0" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.0", + "license": "ISC" + }, + "node_modules/universalify": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "license": "MIT" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.0", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/validate.io-array": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", + "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==" + }, + "node_modules/validate.io-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz", + "integrity": "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==" + }, + "node_modules/validate.io-integer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", + "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==", + "dependencies": { + "validate.io-number": "^1.0.3" + } + }, + "node_modules/validate.io-integer-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz", + "integrity": "sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==", + "dependencies": { + "validate.io-array": "^1.0.3", + "validate.io-integer": "^1.0.4" + } + }, + "node_modules/validate.io-number": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", + "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==" + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", + "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "0.33.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.12.tgz", + "integrity": "sha512-LIxaNIQfkFZbTLb4+cX7dozHlAbAshhFE5PKdro0l+FnCpx1GDJaQ2WMcqm+ToXKMt8p8Uojk/MFRuGyz3V5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.12.tgz", + "integrity": "sha512-BMAlczRqC/LUt2P97E4apTBbkvS9JTJnp2DKFbCwpZ8vBvXVbNdqmvzW/OsdtI/+mGr+apkkpqGM8WecLkPgrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.12.tgz", + "integrity": "sha512-zU5MyluNsykf5cOJ0LZZZjgAHbhPJ1cWfdH1ZXVMXxVMhEV0VZiZXQdwBBVvmvbF28EizeK7obG9fs+fpmS0eQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.12", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.12.tgz", + "integrity": "sha512-ohqLPc7i67yunArPj1+/FeeJ7AgwAjHqKZ512ADk3WsE3FHU9l+m5aa7NdxXr0HmN1bjDlUslBjWNbFlD9y12Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.12.tgz", + "integrity": "sha512-GIIHtQXqgeOOqdG16a/A9N28GpkvjJnjYMhOnXVbn3EDJcoItdR58v/pGN31CHjyXDc8uCcRnFWmqaJt24AYJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.12.tgz", + "integrity": "sha512-zK0b9a1/0wZY+6FdOS3BpZcPc1kcx2G5yxxfEJtEUzVxI6n/FrC2Phsxj/YblPuBchhBZ/1wwn7AyEBUyNSa6g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.12.tgz", + "integrity": "sha512-y75OijvrBE/1XRrXq1jtrJfG26eHeMoqLJ2dwQNwviwTuTtHGCojsDO6BJNF8gU+3jTn1KzJEMETytwsFSvc+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.12.tgz", + "integrity": "sha512-JKgG8Q/LL/9sw/iHHxQyVMoQYu3rU3+a5Z87DxC+wAu3engz+EmctIrV+FGOgI6gWG1z1+5nDDbXiRMGQZXqiw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.12.tgz", + "integrity": "sha512-yoRIAqc0B4lDIAAEFEIu9ttTRFV84iuAl0KNCN6MhKLxNPfzwCBvEMgwco2f71GxmpBcTtn7KdErueZaM2rEvw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.12.tgz", + "integrity": "sha512-qYgt3dHPVvf/MgbIBpJ4Sup/yb9DAopZ3a2JgMpNKIHUpOdnJ2eHBo/aQdnd8dJ21X/+sS58wxHtA9lEazYtXQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.12.tgz", + "integrity": "sha512-wHphlMLK4ufNOONqukELfVIbnGQJrHJ/mxZMMrP2jYrPgCRZhOtf0kC4yAXBwnfmULimV1qt5UJJOw4Kh13Yfg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.12.tgz", + "integrity": "sha512-TeN//1Ft20ZZW41+zDSdOI/Os1bEq5dbvBvYkberB7PHABbRcsteeoNVZFlI0YLpGdlBqohEpjrn06kv8heCJg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.12.tgz", + "integrity": "sha512-AgUebVS4DoAblBgiB2ACQ/8l4eGE5aWBb8ZXtkXHiET9mbj7GuWt3OnsIW/zX+XHJt2RYJZctbQ2S/mDjbp0UA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.12.tgz", + "integrity": "sha512-dJ3Rb3Ei2u/ysSXd6pzleGtfDdc2MuzKt8qc6ls8vreP1G3B7HInX3i7gXS4BGeVd24pp0yqyS7bJ5NHaI9ing==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", + "integrity": "sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.12.tgz", + "integrity": "sha512-55FzVCAiwE9FK8wWeCRuvjazNRJ1QqLCYGZVB6E8RuQuTeStSwotpSW4xoRGwp3a1wUsaVCdYcj5LGCASVJmMg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.12.tgz", + "integrity": "sha512-qnluf8rfb6Y5Lw2tirfK2quZOBbVqmwxut7GPCIJsM8lc4AEUj9L8y0YPdLaPK0TECt4IdyBdBD/KRFKorlK3g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.12.tgz", + "integrity": "sha512-+RkKpVQR7bICjTOPUpkTBTaJ4TFqQBX5Ywyd/HSdDkQGn65VPkTsR/pL4AMvuMWy+wnXgIl4EY6q4mVpJal8Kg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.12.tgz", + "integrity": "sha512-GNHuciv0mFM7ouzsU0+AwY+7eV4Mgo5WnbhfDCQGtpvOtD1vbOiRjPYG6dhmMoFyBjj+pNqQu2X+7DKn0KQ/Gw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.12.tgz", + "integrity": "sha512-kR8cezhYipbbypGkaqCTWIeu4zID17gamC8YTPXYtcN3E5BhhtTnwKBn9I0PJur/T6UVwIEGYzkffNL0lFvxEw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.12.tgz", + "integrity": "sha512-O0UYQVkvfM/jO8a4OwoV0mAKSJw+mjWTAd1MJd/1FCX6uiMdLmMRPK/w6e9OQ0ob2WGxzIm9va/KG0Ja4zIOgg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.12", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.12", + "@esbuild/android-arm64": "0.18.12", + "@esbuild/android-x64": "0.18.12", + "@esbuild/darwin-arm64": "0.18.12", + "@esbuild/darwin-x64": "0.18.12", + "@esbuild/freebsd-arm64": "0.18.12", + "@esbuild/freebsd-x64": "0.18.12", + "@esbuild/linux-arm": "0.18.12", + "@esbuild/linux-arm64": "0.18.12", + "@esbuild/linux-ia32": "0.18.12", + "@esbuild/linux-loong64": "0.18.12", + "@esbuild/linux-mips64el": "0.18.12", + "@esbuild/linux-ppc64": "0.18.12", + "@esbuild/linux-riscv64": "0.18.12", + "@esbuild/linux-s390x": "0.18.12", + "@esbuild/linux-x64": "0.18.12", + "@esbuild/netbsd-x64": "0.18.12", + "@esbuild/openbsd-x64": "0.18.12", + "@esbuild/sunos-x64": "0.18.12", + "@esbuild/win32-arm64": "0.18.12", + "@esbuild/win32-ia32": "0.18.12", + "@esbuild/win32-x64": "0.18.12" + } + }, + "node_modules/vitest": { + "version": "0.33.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.33.0", + "@vitest/runner": "0.33.0", + "@vitest/snapshot": "0.33.0", + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.6.0", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.33.0", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/vm": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/vm/-/vm-0.1.0.tgz", + "integrity": "sha512-1aKVjgohVDnVhGrJLhl2k8zIrapH+7HsdnIjGvBp3XX2OCj6XGzsIbDp9rZ3r7t6qgDfXEE1EoEAEOLJm9LKnw==" + }, + "node_modules/watchpack": { + "version": "2.4.0", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "5.85.1", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.14.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-cli/node_modules/interpret": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-merge": { + "version": "5.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-node-externals": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.2", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/winston": { + "version": "3.8.2", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.5.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-daily-rotate-file": { + "version": "4.7.1", + "license": "MIT", + "dependencies": { + "file-stream-rotator": "^0.6.1", + "object-hash": "^2.0.1", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "winston": "^3" + } + }, + "node_modules/winston-transport": { + "version": "4.5.0", + "license": "MIT", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 6.4.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.12.1", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml2js": { + "version": "0.5.0", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.3.1", + "license": "ISC", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.1", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zip-stream": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/cli": { + "name": "nango", + "version": "0.36.78", + "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", + "dependencies": { + "@babel/traverse": "^7.22.5", + "@inquirer/prompts": "^2.3.0", + "@nangohq/shared": "0.36.78", + "@vercel/ncc": "^0.36.1", + "ajv": "^8.12.0", + "ajv-errors": "^3.0.0", + "axios": "^1.2.0", + "byots": "^5.0.0-dev.20221103.1.34", + "chokidar": "^3.5.3", + "commander": "^10.0.1", + "copyfiles": "^2.4.1", + "dotenv": "^16.0.3", + "ejs": "^3.1.9", + "esbuild": "^0.17.19", + "figlet": "^1.6.0", + "js-yaml": "^4.1.0", + "memfs": "^3.5.1", + "npm-package-arg": "^10.1.0", + "ora": "^6.3.1", + "promptly": "^3.2.0", + "semver": "^7.5.2", + "ts-node": "^10.9.1", + "typescript": "^5.0.4", + "vm": "^0.1.0" + }, + "bin": { + "nango": "dist/index.js" + }, + "devDependencies": { + "@babel/core": "^7.22.1", + "@babel/preset-env": "^7.22.4", + "@babel/preset-typescript": "^7.21.5", + "@types/babel__traverse": "^7.20.1", + "@types/babel-traverse": "^6.25.7", + "@types/commander": "^2.12.2", + "@types/ejs": "^3.1.2", + "@types/figlet": "^1.5.6", + "@types/glob": "^8.1.0", + "@types/node": "^20.1.4", + "@types/npm-package-arg": "^6.1.1", + "@types/promptly": "^3.0.2", + "babel-loader": "^9.1.2", + "webpack": "^5.85.1", + "webpack-cli": "^5.1.3", + "webpack-node-externals": "^3.0.0" + }, + "engines": { + "node": ">=16.7" + } + }, + "packages/cli/node_modules/@types/node": { + "version": "20.1.7", + "dev": true, + "license": "MIT" + }, + "packages/cli/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "packages/cli/node_modules/ajv-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", + "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", + "peerDependencies": { + "ajv": "^8.0.1" + } + }, + "packages/cli/node_modules/commander": { + "version": "10.0.1", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "packages/cli/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "packages/cli/node_modules/typescript": { + "version": "5.0.4", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "packages/frontend": { + "name": "@nangohq/frontend", + "version": "0.36.78", + "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY" + }, + "packages/jobs": { + "name": "@nangohq/nango-jobs", + "version": "0.36.52", + "dependencies": { + "@nangohq/nango-runner": "0.36.52", + "@nangohq/shared": "0.36.78", + "@octokit/plugin-retry": "^6.0.0", + "@octokit/plugin-throttling": "^7.0.0", + "@octokit/rest": "^20.0.1", + "@temporalio/activity": "^1.5.2", + "@temporalio/client": "^1.5.2", + "@temporalio/worker": "^1.5.2", + "@temporalio/workflow": "^1.5.2", + "@trpc/client": "^10.44.1", + "@trpc/server": "^10.44.1", + "@types/fs-extra": "^11.0.1", + "dd-trace": "4.20.0", + "dotenv": "^16.0.3", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "knex": "^2.4.2", + "md5": "^2.3.0", + "nanoid": "3.x", + "superjson": "^2.2.1", + "uuid": "^9.0.0" + }, + "devDependencies": { + "@tsconfig/node16": "^1.0.0", + "@types/md5": "^2.3.2", + "@types/node": "^18.7.6", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^7.32.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-deprecation": "^1.2.1", + "nodemon": "^3.0.1", + "typescript": "^5.3.2" + } + }, + "packages/jobs/node_modules/@datadog/native-appsec": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@datadog/native-appsec/-/native-appsec-4.0.0.tgz", + "integrity": "sha512-myTguXJ3VQHS2E1ylNsSF1avNpDmq5t+K4Q47wdzeakGc3sDIDDyEbvuFTujl9c9wBIkup94O1mZj5DR37ajzA==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^3.9.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/jobs/node_modules/@datadog/pprof": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@datadog/pprof/-/pprof-4.0.1.tgz", + "integrity": "sha512-TavqyiyQZOaUM9eQB07r8+K/T1CqKyOdsUGxpN79+BF+eOQBpTj/Cte6KdlhcUSKL3h5hSjC+vlgA7uW2qtVhA==", + "hasInstallScript": true, + "dependencies": { + "delay": "^5.0.0", + "node-gyp-build": "<4.0", + "p-limit": "^3.1.0", + "pprof-format": "^2.0.7", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=14" + } + }, + "packages/jobs/node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "packages/jobs/node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "packages/jobs/node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "packages/jobs/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "packages/jobs/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "packages/jobs/node_modules/dd-trace": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/dd-trace/-/dd-trace-4.20.0.tgz", + "integrity": "sha512-y7IDLSSt6nww6zMdw/I8oLdfgOQADIOkERCNdfSzlBrXHz5CHimEOFfsHN87ag0mn6vusr06aoi+CQRZSNJz2g==", + "hasInstallScript": true, + "dependencies": { + "@datadog/native-appsec": "4.0.0", + "@datadog/native-iast-rewriter": "2.2.1", + "@datadog/native-iast-taint-tracking": "1.6.4", + "@datadog/native-metrics": "^2.0.0", + "@datadog/pprof": "4.0.1", + "@datadog/sketches-js": "^2.1.0", + "@opentelemetry/api": "^1.0.0", + "@opentelemetry/core": "^1.14.0", + "crypto-randomuuid": "^1.0.0", + "dc-polyfill": "^0.1.2", + "ignore": "^5.2.4", + "import-in-the-middle": "^1.4.2", + "int64-buffer": "^0.1.9", + "ipaddr.js": "^2.1.0", + "istanbul-lib-coverage": "3.2.0", + "jest-docblock": "^29.7.0", + "koalas": "^1.0.2", + "limiter": "^1.1.4", + "lodash.kebabcase": "^4.1.1", + "lodash.pick": "^4.4.0", + "lodash.sortby": "^4.7.0", + "lodash.uniq": "^4.5.0", + "lru-cache": "^7.14.0", + "methods": "^1.1.2", + "module-details-from-path": "^1.0.3", + "msgpack-lite": "^0.1.26", + "node-abort-controller": "^3.1.1", + "opentracing": ">=0.12.1", + "path-to-regexp": "^0.1.2", + "pprof-format": "^2.0.7", + "protobufjs": "^7.2.4", + "retry": "^0.13.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "packages/jobs/node_modules/dd-trace/node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "engines": { + "node": ">= 4" + } + }, + "packages/jobs/node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/jobs/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "packages/jobs/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "packages/jobs/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "packages/jobs/node_modules/eslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "packages/jobs/node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "packages/jobs/node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "packages/jobs/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/jobs/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "packages/jobs/node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "engines": { + "node": ">= 10" + } + }, + "packages/jobs/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "packages/jobs/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, + "packages/jobs/node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "packages/node-client": { + "name": "@nangohq/node", + "version": "0.36.78", + "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", + "dependencies": { + "axios": "^1.2.0" + }, + "devDependencies": { + "tsup": "^7.2.0" + }, + "engines": { + "node": ">=16.7" + } + }, + "packages/runner": { + "name": "@nangohq/nango-runner", + "version": "0.36.52", + "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", + "dependencies": { + "@nangohq/shared": "0.36.78", + "@trpc/client": "^10.44.0", + "@trpc/server": "^10.44.0", + "api": "^6.1.1", + "connect-timeout": "^1.9.0", + "express": "^4.18.2", + "superjson": "^2.2.1", + "undici": "^6.2.1" + }, + "devDependencies": { + "@types/connect-timeout": "^0.0.39", + "@types/node": "^18.7.6", + "typescript": "^5.3.2" + } + }, + "packages/runner/node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "packages/server": { + "name": "@nangohq/nango-server", + "version": "0.36.78", + "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", + "dependencies": { + "@hapi/boom": "^10.0.1", + "@nangohq/shared": "0.36.78", + "@sentry/node": "^7.37.2", + "@temporalio/client": "^1.7.4", + "axios": "^1.3.4", + "connect-session-knex": "^3.0.1", + "cookie-parser": "^1.4.6", + "cors": "^2.8.5", + "dd-trace": "4.20.0", + "dotenv": "^16.0.3", + "exponential-backoff": "^3.1.1", + "express": "^4.18.2", + "express-session": "^1.17.3", + "form-data": "^4.0.0", + "ip": "^1.1.8", + "js-yaml": "^4.1.0", + "jsonwebtoken": "^9.0.2", + "knex": "^2.3.0", + "mailgun.js": "^8.2.1", + "node-cron": "^3.0.2", + "oauth": "^0.10.0", + "passport": "^0.6.0", + "passport-http": "^0.3.0", + "passport-local": "^1.0.0", + "pg": "^8.8.0", + "posthog-node": "^3.1.3", + "simple-oauth2": "^5.0.0", + "uuid": "^9.0.0", + "winston": "^3.8.2", + "winston-daily-rotate-file": "^4.7.1", + "ws": "^8.12.1" + }, + "devDependencies": { + "@types/braintree": "^3.3.6", + "@types/cookie-parser": "^1.4.3", + "@types/cors": "^2.8.12", + "@types/express": "^4.17.13", + "@types/express-session": "^1.17.6", + "@types/ip": "^1.1.0", + "@types/js-yaml": "^4.0.5", + "@types/jsonwebtoken": "^9.0.1", + "@types/node": "^18.7.6", + "@types/node-cron": "^3.0.7", + "@types/oauth": "^0.9.1", + "@types/passport": "^1.0.12", + "@types/passport-http": "^0.3.9", + "@types/passport-local": "^1.0.35", + "@types/simple-oauth2": "^4.1.1", + "@types/uuid": "^8.3.4", + "@types/ws": "^8.5.4", + "nodemon": "^3.0.1", + "typescript": "^4.7.4" + }, + "engines": { + "node": ">=16.7", + "npm": ">=6.14.11" + } + }, + "packages/server/node_modules/@datadog/native-appsec": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@datadog/native-appsec/-/native-appsec-4.0.0.tgz", + "integrity": "sha512-myTguXJ3VQHS2E1ylNsSF1avNpDmq5t+K4Q47wdzeakGc3sDIDDyEbvuFTujl9c9wBIkup94O1mZj5DR37ajzA==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^3.9.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/server/node_modules/@datadog/pprof": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@datadog/pprof/-/pprof-4.0.1.tgz", + "integrity": "sha512-TavqyiyQZOaUM9eQB07r8+K/T1CqKyOdsUGxpN79+BF+eOQBpTj/Cte6KdlhcUSKL3h5hSjC+vlgA7uW2qtVhA==", + "hasInstallScript": true, + "dependencies": { + "delay": "^5.0.0", + "node-gyp-build": "<4.0", + "p-limit": "^3.1.0", + "pprof-format": "^2.0.7", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=14" + } + }, + "packages/server/node_modules/dd-trace": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/dd-trace/-/dd-trace-4.20.0.tgz", + "integrity": "sha512-y7IDLSSt6nww6zMdw/I8oLdfgOQADIOkERCNdfSzlBrXHz5CHimEOFfsHN87ag0mn6vusr06aoi+CQRZSNJz2g==", + "hasInstallScript": true, + "dependencies": { + "@datadog/native-appsec": "4.0.0", + "@datadog/native-iast-rewriter": "2.2.1", + "@datadog/native-iast-taint-tracking": "1.6.4", + "@datadog/native-metrics": "^2.0.0", + "@datadog/pprof": "4.0.1", + "@datadog/sketches-js": "^2.1.0", + "@opentelemetry/api": "^1.0.0", + "@opentelemetry/core": "^1.14.0", + "crypto-randomuuid": "^1.0.0", + "dc-polyfill": "^0.1.2", + "ignore": "^5.2.4", + "import-in-the-middle": "^1.4.2", + "int64-buffer": "^0.1.9", + "ipaddr.js": "^2.1.0", + "istanbul-lib-coverage": "3.2.0", + "jest-docblock": "^29.7.0", + "koalas": "^1.0.2", + "limiter": "^1.1.4", + "lodash.kebabcase": "^4.1.1", + "lodash.pick": "^4.4.0", + "lodash.sortby": "^4.7.0", + "lodash.uniq": "^4.5.0", + "lru-cache": "^7.14.0", + "methods": "^1.1.2", + "module-details-from-path": "^1.0.3", + "msgpack-lite": "^0.1.26", + "node-abort-controller": "^3.1.1", + "opentracing": ">=0.12.1", + "path-to-regexp": "^0.1.2", + "pprof-format": "^2.0.7", + "protobufjs": "^7.2.4", + "retry": "^0.13.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "packages/server/node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "engines": { + "node": ">= 10" + } + }, + "packages/server/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "engines": { - "node": ">=16.7" + "node": ">=12" } }, - "packages/server": { - "name": "@nangohq/nango-server", - "version": "0.36.52", - "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", - "dependencies": { - "@hapi/boom": "^10.0.1", - "@nangohq/shared": "0.36.52", - "@sentry/node": "^7.37.2", - "@temporalio/client": "^1.7.4", - "axios": "^1.3.4", - "connect-session-knex": "^3.0.1", - "cookie-parser": "^1.4.6", - "cors": "^2.8.5", - "dd-trace": "^4.19.0", - "dotenv": "^16.0.3", - "exponential-backoff": "^3.1.1", - "express": "^4.18.2", - "express-session": "^1.17.3", - "form-data": "^4.0.0", - "ip": "^1.1.8", - "js-yaml": "^4.1.0", - "jsonwebtoken": "^9.0.2", - "knex": "^2.3.0", - "mailgun.js": "^8.2.1", - "node-cron": "^3.0.2", - "oauth": "^0.10.0", - "passport": "^0.6.0", - "passport-http": "^0.3.0", - "passport-local": "^1.0.0", - "pg": "^8.8.0", - "posthog-node": "^3.1.3", - "simple-oauth2": "^5.0.0", - "uuid": "^9.0.0", - "winston": "^3.8.2", - "winston-daily-rotate-file": "^4.7.1", - "ws": "^8.12.1" - }, - "devDependencies": { - "@types/braintree": "^3.3.6", - "@types/cookie-parser": "^1.4.3", - "@types/cors": "^2.8.12", - "@types/express": "^4.17.13", - "@types/express-session": "^1.17.6", - "@types/ip": "^1.1.0", - "@types/js-yaml": "^4.0.5", - "@types/jsonwebtoken": "^9.0.1", - "@types/node": "^18.7.6", - "@types/node-cron": "^3.0.7", - "@types/oauth": "^0.9.1", - "@types/passport": "^1.0.12", - "@types/passport-http": "^0.3.9", - "@types/passport-local": "^1.0.35", - "@types/simple-oauth2": "^4.1.1", - "@types/uuid": "^8.3.4", - "@types/ws": "^8.5.4", - "nodemon": "^3.0.1", - "ts-node": "^10.9.1", - "typescript": "^4.7.4" - }, + "packages/server/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "engines": { - "node": ">=16.7", - "npm": ">=6.14.11" + "node": ">= 4" } }, "packages/shared": { "name": "@nangohq/shared", - "version": "0.36.52", + "version": "0.36.78", "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", "dependencies": { "@aws-sdk/client-s3": "^3.348.0", "@datadog/datadog-api-client": "^1.16.0", "@hapi/boom": "^10.0.1", - "@nangohq/node": "0.36.52", + "@nangohq/node": "0.36.78", "@sentry/node": "^7.37.2", "@temporalio/client": "^1.5.2", "@types/fs-extra": "^11.0.1", @@ -13223,7 +16040,6 @@ "rimraf": "^5.0.1", "semver": "^7.5.4", "simple-oauth2": "^5.0.0", - "ts-node": "^10.9.1", "uuid": "^9.0.0", "winston": "^3.8.2", "winston-daily-rotate-file": "^4.7.1" @@ -13416,9 +16232,10 @@ }, "packages/worker": { "name": "@nangohq/nango-worker", - "version": "0.36.52", + "version": "0.36.64", + "extraneous": true, "dependencies": { - "@nangohq/shared": "0.36.52", + "@nangohq/shared": "0.36.64", "@octokit/plugin-retry": "^6.0.0", "@octokit/plugin-throttling": "^7.0.0", "@octokit/rest": "^20.0.1", @@ -13446,210 +16263,8 @@ "eslint-config-prettier": "^8.3.0", "eslint-plugin-deprecation": "^1.2.1", "nodemon": "^3.0.1", - "ts-node": "^10.9.1", "typescript": "^4.4.2" } - }, - "packages/worker/node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "packages/worker/node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "3.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "packages/worker/node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "packages/worker/node_modules/acorn": { - "version": "7.4.1", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "packages/worker/node_modules/argparse": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "packages/worker/node_modules/eslint": { - "version": "7.32.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "packages/worker/node_modules/eslint-utils": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "packages/worker/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "packages/worker/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "packages/worker/node_modules/eslint/node_modules/js-yaml": { - "version": "3.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "packages/worker/node_modules/espree": { - "version": "7.3.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "packages/worker/node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "packages/worker/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "packages/worker/node_modules/ignore": { - "version": "4.0.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } } } } diff --git a/package.json b/package.json index de5f7c3177..61d4dfec8e 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "packages/frontend", "packages/node-client", "packages/server", - "packages/worker" + "packages/runner", + "packages/jobs" ], "scripts": { "create:migration": "cd packages/shared/lib/db && knex migrate:make $1 --esm --knexfile ./knexfile.cjs", @@ -17,26 +18,28 @@ "lint": "eslint . --ext .ts,.tsx", "lint:fix": "eslint . --ext .ts,.tsx --fix", "install:all": "npm i && cd packages/webapp && npm i && cd ../..", - "ts-build": "tsc -b --clean packages/shared packages/server packages/worker packages/cli && tsc -b tsconfig.build.json && tsc -b packages/webapp/tsconfig.json", + "ts-build": "tsc -b --clean packages/shared packages/server packages/cli packages/runner packages/jobs && tsc -b tsconfig.build.json && tsc -b packages/webapp/tsconfig.json", "docker-build": "docker build -f packages/server/Dockerfile -t nango-server:latest .", "webapp-build:hosted": "cd ./packages/webapp && npm run build:hosted && cd ../..", "webapp-build:staging": "cd ./packages/webapp && npm run build:staging && cd ../..", "webapp-build:prod": "cd ./packages/webapp && npm run build:prod && cd ../..", + "webapp-build:enterprise": "cd ./packages/webapp && npm run build:enterprise && cd ../..", "webapp-build:watch": "tsc -b -w packages/webapp/tsconfig.json", "shared:build": "cd ./packages/shared && npm run build && cd ../..", "shared:watch": "cd ./packages/shared && tsc -w", "build:hosted": "npm run install:all && npm run ts-build && npm run webapp-build:hosted ", "build:staging": "npm run install:all && npm run ts-build && npm run webapp-build:staging", "build:prod": "npm run install:all && npm run ts-build && npm run webapp-build:prod", + "build:enterprise": "npm run install:all && npm run ts-build && npm run webapp-build:enterprise", "server:dev:watch": "cd ./packages/server && npm run dev", - "worker:dev:watch": "cd ./packages/worker && npm run dev", + "jobs:dev:watch": "npm run dev -w @nangohq/nango-jobs", "webapp:dev:watch": "cd ./packages/webapp && npm run start:hosted", "cli:watch": "cd ./packages/cli && npm run dev", "prepare": "husky install", "build:watch": "tsc -b -w tsconfig.build.json", "dev:watch": "concurrently --kill-others \"npm run build:watch\" \"npm run webapp-build:watch\" \"npm run prettier-watch\" \"npm run shared:watch\" \"npm run cli:watch\"", "watch:dev": "npm run dev:watch", - "dev:watch:apps": "concurrently --kill-others \"npm run server:dev:watch\" \"npm run webapp:dev:watch\" \"npm run worker:dev:watch\" ", + "dev:watch:apps": "concurrently --kill-others \"npm run server:dev:watch\" \"npm run webapp:dev:watch\" \"npm run jobs:dev:watch\"", "watch:dev:apps": "npm run dev:watch:apps", "dw": "npm run dev:watch", "dwa": "npm run dev:watch:apps", @@ -60,6 +63,7 @@ "onchange": "^7.1.0", "prettier": "^2.7.1", "testcontainers": "^9.12.0", + "tsx": "^4.6.2", "typescript": "^4.7.4", "vitest": "^0.33.0" }, @@ -67,4 +71,4 @@ "@babel/parser": "^7.22.5", "@babel/traverse": "^7.22.5" } -} +} \ No newline at end of file diff --git a/packages/cli/docker/docker-compose.yaml b/packages/cli/docker/docker-compose.yaml index 5bcbef397f..4b0ef76c0f 100644 --- a/packages/cli/docker/docker-compose.yaml +++ b/packages/cli/docker/docker-compose.yaml @@ -15,7 +15,7 @@ services: - nango nango-server: - image: nangohq/nango-server:0.36.52 + image: nangohq/nango-server:0.36.78 container_name: nango-server environment: - TEMPORAL_ADDRESS=temporal:7233 @@ -46,9 +46,9 @@ services: networks: - nango - nango-worker: - image: nangohq/nango-worker:0.36.52 - container_name: nango-worker + nango-jobs: + image: nangohq/nango-jobs:production + container_name: nango-jobs restart: always ports: - '${WORKER_PORT:-3004}:${WORKER_PORT:-3004}' @@ -64,7 +64,7 @@ services: - nango-db - temporal volumes: - - "${NANGO_INTEGRATIONS_LOCATION:-./}:/usr/nango-worker/src/packages/shared/dist/lib/nango-integrations" + - "${NANGO_INTEGRATIONS_LOCATION:-./}:/usr/nango-jobs/src/packages/shared/dist/lib/nango-integrations" networks: - nango diff --git a/packages/cli/lib/cli.ts b/packages/cli/lib/cli.ts index 0ac97f05a8..9842998917 100644 --- a/packages/cli/lib/cli.ts +++ b/packages/cli/lib/cli.ts @@ -33,13 +33,10 @@ export const version = (debug: boolean) => { const dockerCompose = yaml.load(dockerComposeYaml) as any; const nangoServerImage = dockerCompose.services['nango-server'].image; - const nangoWorkerImage = dockerCompose.services['nango-worker'].image; const nangoServerVersion = nangoServerImage.split(':').pop(); - const nangoWorkerVersion = nangoWorkerImage.split(':').pop(); console.log(chalk.green('Nango Server version:'), nangoServerVersion); - console.log(chalk.green('Nango Worker version:'), nangoWorkerVersion); console.log(chalk.green('Nango CLI version:'), packageJson.version); }; @@ -146,7 +143,8 @@ export const generate = async (debug = false, inParentDirectory = false) => { interfaceFileName: TYPES_FILE_NAME.replace('.ts', ''), interfaceNames, mappings, - inputs: input && Object.keys(input).length > 0 ? input : '' + inputs: input && Object.keys(input).length > 0 ? input : '', + hasWebhook: type === SyncConfigType.SYNC && flow.webhookSubscriptions && flow.webhookSubscriptions.length > 0 }); const stripped = rendered.replace(/^\s+/, ''); diff --git a/packages/cli/lib/fixtures/nango-yaml/v1/no-commas/nango.yaml b/packages/cli/lib/fixtures/nango-yaml/v1/no-commas/nango.yaml new file mode 100644 index 0000000000..c14e12e9bd --- /dev/null +++ b/packages/cli/lib/fixtures/nango-yaml/v1/no-commas/nango.yaml @@ -0,0 +1,25 @@ +integrations: + demo-github-integration: + github-issue-example: + type: sync + runs: every half hour + auto_start: true + returns: + - GithubIssue + github-write-action: + type: action + returns: boolean + +models: + GithubIssue: + id: integer, + owner: string, + repo: string + issue_number: number + title: string + author: string + author_id: string + state: string + date_created: date + date_last_modified: date + body: string diff --git a/packages/cli/lib/fixtures/nango-yaml/v1/no-semi-colons/nango.yaml b/packages/cli/lib/fixtures/nango-yaml/v1/no-semi-colons/nango.yaml new file mode 100644 index 0000000000..5ec30203b8 --- /dev/null +++ b/packages/cli/lib/fixtures/nango-yaml/v1/no-semi-colons/nango.yaml @@ -0,0 +1,25 @@ +integrations: + demo-github-integration: + github-issue-example: + type: sync + runs: every half hour + auto_start: true + returns: + - GithubIssue + github-write-action: + type: action + returns: boolean + +models: + GithubIssue: + id: integer; + owner: string + repo: string + issue_number: number + title: string + author: string + author_id: string + state: string + date_created: date + date_last_modified: date + body: string diff --git a/packages/cli/lib/fixtures/nango-yaml/v1/nango.yaml b/packages/cli/lib/fixtures/nango-yaml/v1/valid/nango.yaml similarity index 100% rename from packages/cli/lib/fixtures/nango-yaml/v1/nango.yaml rename to packages/cli/lib/fixtures/nango-yaml/v1/valid/nango.yaml diff --git a/packages/cli/lib/fixtures/nango-yaml/v1/object.json b/packages/cli/lib/fixtures/nango-yaml/v1/valid/object.json similarity index 100% rename from packages/cli/lib/fixtures/nango-yaml/v1/object.json rename to packages/cli/lib/fixtures/nango-yaml/v1/valid/object.json diff --git a/packages/cli/lib/fixtures/nango-yaml/v2/invalid.1/nango.yaml b/packages/cli/lib/fixtures/nango-yaml/v2/invalid.1/nango.yaml new file mode 100644 index 0000000000..156834fae0 --- /dev/null +++ b/packages/cli/lib/fixtures/nango-yaml/v2/invalid.1/nango.yaml @@ -0,0 +1,76 @@ +integrations: + demo-github-integration: + syncs: + github-issue-example: + description: | + Sync github issues continuously from public repos + sync_type: incremental + auto_start: true + runs: every half hour + scopes: public_repo + output: GithubIssue + webhook-subscriptions: + - issue.creation + github-issue-example-two: + description: | + Sync github issues continuously from public repos example two + sync_type: incremental + auto_start: true + runs: every hour + endpoint: /ticketing/tickets-two + scopes: public_repo + output: GithubIssue2 + github-multiple-models: + description: Sync github issues to multiple models + sync_type: full + auto_start: true + runs: every 5 minutes + endpoint: + - /ticketing/ticket + - /ticketing/pr + output: + - GithubIssue3 + - GithubPR + actions: + github-get-issue: + description: Get a GitHub issue. + endpoint: GET /ticketing/tickets/{GithubCreateIssueInput:id} + output: GithubIssueAction + scopes: repo:read + github-create-issue: + description: Creates a GitHub issue. + endpoint: /ticketing/tickets + scopes: repo:write + input: GithubCreateIssueInput + output: GithubCreateOutput + github-delete-issue: + description: Deletes a GitHub issue. + endpoint: DELETE /ticketing/tickets/{GithubIssue:id} + scopes: repo:write + output: boolean + +models: + GithubIssue: + id: integer + owner: string + repo: string + issue_number: number + title: string + author: string + author_id: string + state: string + date_created: date + date_last_modified: date + body: string + GithubIssueAction: + __extends: GithubIssue + GithubIssue2: + __extends: GithubIssue + GithubIssue3: + __extends: GithubIssue + GithubCreateIssueInput: + __extends: GithubIssue + GithubCreateOutput: + result: GithubIssue + GithubPR: + __extends: GithubIssue diff --git a/packages/cli/lib/fixtures/nango-yaml/v2/invalid.2/nango.yaml b/packages/cli/lib/fixtures/nango-yaml/v2/invalid.2/nango.yaml new file mode 100644 index 0000000000..7d9f90b9cf --- /dev/null +++ b/packages/cli/lib/fixtures/nango-yaml/v2/invalid.2/nango.yaml @@ -0,0 +1,79 @@ +integrations: + demo-github-integration: + syncs: + github-issue-example: + description: | + Sync github issues continuously from public repos + sync_type: incremental + auto_start: true + runs: every half hour + endpoint: DELETE /ticketing/tickets + scopes: public_repo + output: GithubIssue + webhook-subscriptions: + - issue.creation + github-issue-example-two: + description: | + Sync github issues continuously from public repos example two + sync_type: incremental + auto_start: true + runs: every hour + endpoint: /ticketing/tickets-two + scopes: public_repo + output: GithubIssue2 + github-multiple-models: + description: Sync github issues to multiple models + sync_type: full + auto_start: true + runs: every 5 minutes + endpoint: + - /ticketing/ticket + - /ticketing/pr + output: + - GithubIssue3 + - GithubPR + actions: + github-get-issue: + description: Get a GitHub issue. + endpoint: GET /ticketing/tickets/{GithubCreateIssueInput:id} + output: GithubIssueAction + scopes: repo:read + webhook-subscriptions: + - issue.creation + github-create-issue: + description: Creates a GitHub issue. + endpoint: /ticketing/tickets + scopes: repo:write + input: GithubCreateIssueInput + output: GithubCreateOutput + github-delete-issue: + description: Deletes a GitHub issue. + endpoint: DELETE /ticketing/tickets/{GithubIssue:id} + scopes: repo:write + output: boolean + +models: + GithubIssue: + id: integer + owner: string + repo: string + issue_number: number + title: string + author: string + author_id: string + state: string + date_created: date + date_last_modified: date + body: string + GithubIssueAction: + __extends: GithubIssue + GithubIssue2: + __extends: GithubIssue + GithubIssue3: + __extends: GithubIssue + GithubCreateIssueInput: + __extends: GithubIssue + GithubCreateOutput: + result: GithubIssue + GithubPR: + __extends: GithubIssue diff --git a/packages/cli/lib/fixtures/nango-yaml/v2/nango.yaml b/packages/cli/lib/fixtures/nango-yaml/v2/nango.yaml index 62ba925b31..156834fae0 100644 --- a/packages/cli/lib/fixtures/nango-yaml/v2/nango.yaml +++ b/packages/cli/lib/fixtures/nango-yaml/v2/nango.yaml @@ -7,9 +7,10 @@ integrations: sync_type: incremental auto_start: true runs: every half hour - endpoint: DELETE /ticketing/tickets scopes: public_repo output: GithubIssue + webhook-subscriptions: + - issue.creation github-issue-example-two: description: | Sync github issues continuously from public repos example two diff --git a/packages/cli/lib/fixtures/nango-yaml/v2/valid/nango.yaml b/packages/cli/lib/fixtures/nango-yaml/v2/valid/nango.yaml new file mode 100644 index 0000000000..b012c53b18 --- /dev/null +++ b/packages/cli/lib/fixtures/nango-yaml/v2/valid/nango.yaml @@ -0,0 +1,77 @@ +integrations: + demo-github-integration: + syncs: + github-issue-example: + description: | + Sync github issues continuously from public repos + sync_type: incremental + auto_start: true + runs: every half hour + endpoint: DELETE /ticketing/tickets + scopes: public_repo + output: GithubIssue + webhook-subscriptions: + - issue.creation + github-issue-example-two: + description: | + Sync github issues continuously from public repos example two + sync_type: incremental + auto_start: true + runs: every hour + endpoint: /ticketing/tickets-two + scopes: public_repo + output: GithubIssue2 + github-multiple-models: + description: Sync github issues to multiple models + sync_type: full + auto_start: true + runs: every 5 minutes + endpoint: + - /ticketing/ticket + - /ticketing/pr + output: + - GithubIssue3 + - GithubPR + actions: + github-get-issue: + description: Get a GitHub issue. + endpoint: GET /ticketing/tickets/{GithubCreateIssueInput:id} + output: GithubIssueAction + scopes: repo:read + github-create-issue: + description: Creates a GitHub issue. + endpoint: /ticketing/tickets + scopes: repo:write + input: GithubCreateIssueInput + output: GithubCreateOutput + github-delete-issue: + description: Deletes a GitHub issue. + endpoint: DELETE /ticketing/tickets/{GithubIssue:id} + scopes: repo:write + output: boolean + +models: + GithubIssue: + id: integer + owner: string + repo: string + issue_number: number + title: string + author: string + author_id: string + state: string + date_created: date + date_last_modified: date + body: string + GithubIssueAction: + __extends: GithubIssue + GithubIssue2: + __extends: GithubIssue + GithubIssue3: + __extends: GithubIssue + GithubCreateIssueInput: + __extends: GithubIssue + GithubCreateOutput: + result: GithubIssue + GithubPR: + __extends: GithubIssue diff --git a/packages/cli/lib/fixtures/nango-yaml/v2/object.json b/packages/cli/lib/fixtures/nango-yaml/v2/valid/object.json similarity index 97% rename from packages/cli/lib/fixtures/nango-yaml/v2/object.json rename to packages/cli/lib/fixtures/nango-yaml/v2/valid/object.json index a383001ab6..89787f10e2 100644 --- a/packages/cli/lib/fixtures/nango-yaml/v2/object.json +++ b/packages/cli/lib/fixtures/nango-yaml/v2/valid/object.json @@ -32,7 +32,8 @@ "returns": ["GithubIssue"], "description": "Sync github issues continuously from public repos\n", "scopes": ["public_repo"], - "endpoints": [{ "GET": "/ticketing/tickets" }] + "endpoints": [{ "GET": "/ticketing/tickets" }], + "webhookSubscriptions": ["issue.creation"] }, { "name": "github-issue-example-two", @@ -64,7 +65,8 @@ "returns": ["GithubIssue2"], "description": "Sync github issues continuously from public repos example two\n", "scopes": ["public_repo"], - "endpoints": [{ "GET": "/ticketing/tickets-two" }] + "endpoints": [{ "GET": "/ticketing/tickets-two" }], + "webhookSubscriptions": [] }, { "name": "github-multiple-models", @@ -112,7 +114,8 @@ "returns": ["GithubIssue3", "GithubPR"], "description": "Sync github issues to multiple models", "scopes": [], - "endpoints": [{ "GET": "/ticketing/ticket" }, { "GET": "/ticketing/pr" }] + "endpoints": [{ "GET": "/ticketing/ticket" }, { "GET": "/ticketing/pr" }], + "webhookSubscriptions": [] } ], "actions": [ diff --git a/packages/cli/lib/index.ts b/packages/cli/lib/index.ts index f529f3ffc4..8bcf7e16a5 100644 --- a/packages/cli/lib/index.ts +++ b/packages/cli/lib/index.ts @@ -1,7 +1,7 @@ #!/usr/bin/env node /* - * Copyright (c) 2023 Nango, all rights reserved. + * Copyright (c) 2024 Nango, all rights reserved. */ import { Command } from 'commander'; @@ -76,7 +76,7 @@ program.addHelpText('before', chalk.green(figlet.textSync('Nango CLI'))); program .command('version') - .description('Print the version of the Nango CLI, Nango Worker, and Nango Server.') + .description('Print the version of the Nango CLI and Nango Server.') .action(function (this: Command) { const { debug } = this.opts(); version(debug); @@ -103,9 +103,18 @@ program .description('Dry run the sync|action process to help with debugging against an existing connection in cloud.') .arguments('name connection_id') .option('-e [environment]', 'The Nango environment, defaults to dev.', 'dev') - .option('-l, --lastSyncDate [lastSyncDate]', 'Optional (for syncs only): last sync date to retrieve records greater than this date') - .option('-i, --input [input]', 'Optional (for actions only): input to pass to the action script') - .option('-m, --metadata [metadata]', 'Optional (for syncs only): metadata to stub for the sync script') + .option( + '-l, --lastSyncDate [lastSyncDate]', + 'Optional (for syncs only): last sync date to retrieve records greater than this date. The format is any string that can be successfully parsed by `new Date()` in JavaScript' + ) + .option( + '-i, --input [input]', + 'Optional (for actions only): input to pass to the action script. The `input` can be supplied in either JSON format or as a plain string. For example --input \'{"foo": "bar"}\' --input \'foobar\'' + ) + .option( + '-m, --metadata [metadata]', + 'Optional (for syncs only): metadata to stub for the sync script supplied in JSON format, for example --metadata \'{"foo": "bar"}\'' + ) .action(async function (this: Command, sync: string, connectionId: string) { const { autoConfirm, debug, e: environment } = this.opts(); await verificationService.necessaryFilesExist(autoConfirm, debug); diff --git a/packages/cli/lib/nango.yaml.schema.v2.json b/packages/cli/lib/nango.yaml.schema.v2.json index c953d2e3e6..1fdd70acd2 100644 --- a/packages/cli/lib/nango.yaml.schema.v2.json +++ b/packages/cli/lib/nango.yaml.schema.v2.json @@ -97,6 +97,18 @@ "errorMessage": { "_": "nango yaml schema validation error: output must be a string or an array of strings." } + }, + "webhook-subscriptions": { + "oneOf": [ + { "type": "string" }, + { + "type": "array", + "items": { "type": "string" } + } + ], + "errorMessage": { + "_": "nango yaml schema validation error: webhook-subscriptions must be a string or an array of strings." + } } }, "required": ["endpoint", "output"], @@ -181,7 +193,11 @@ "errorMessage": { "required": { "endpoint": "nango yaml schema validation error: An endpoint property is required to specify how to trigger the action." - } + }, + "_": "nango yaml schema validation error: webhook-subscriptions is not a valid property for an action." + }, + "not": { + "required": ["webhook-subscriptions"] } } } diff --git a/packages/cli/lib/services/compile.service.ts b/packages/cli/lib/services/compile.service.ts index 16958a42a8..cd9823ba8c 100644 --- a/packages/cli/lib/services/compile.service.ts +++ b/packages/cli/lib/services/compile.service.ts @@ -3,7 +3,7 @@ import * as tsNode from 'ts-node'; import glob from 'glob'; import chalk from 'chalk'; import path from 'path'; -import { SyncConfigType } from '@nangohq/shared'; +import { SyncConfigType, NangoSyncConfig } from '@nangohq/shared'; import configService from './config.service.js'; import { getNangoRootPath, printDebug } from '../utils.js'; @@ -55,10 +55,12 @@ class CompileService { const providerConfiguration = config.find((config) => [...config.syncs, ...config.actions].find((sync) => sync.name === path.basename(filePath, '.ts')) ); + if (!providerConfiguration) { continue; } - const syncConfig = [...providerConfiguration.syncs, ...providerConfiguration.actions].find( + + const syncConfig = [...(providerConfiguration?.syncs as NangoSyncConfig[]), ...(providerConfiguration?.actions as NangoSyncConfig[])].find( (sync) => sync.name === path.basename(filePath, '.ts') ); const type = syncConfig?.type || SyncConfigType.SYNC; diff --git a/packages/cli/lib/services/deploy.service.ts b/packages/cli/lib/services/deploy.service.ts index c7370f3855..2a1c16a560 100644 --- a/packages/cli/lib/services/deploy.service.ts +++ b/packages/cli/lib/services/deploy.service.ts @@ -295,7 +295,8 @@ class DeployService { ts: localFileService.getIntegrationTsFile(syncName, './') as string }, model_schema: JSON.stringify(model_schema), - endpoints: flow.endpoints + endpoints: flow.endpoints, + webhookSubscriptions: flow.webhookSubscriptions || [] }; postData.push(body); diff --git a/packages/cli/lib/services/local-integration.service.ts b/packages/cli/lib/services/local-integration.service.ts index 3dc4b7e235..7e9423c450 100644 --- a/packages/cli/lib/services/local-integration.service.ts +++ b/packages/cli/lib/services/local-integration.service.ts @@ -1,4 +1,13 @@ -import { NangoError, formatScriptError, IntegrationServiceInterface, NangoIntegrationData, NangoSync, localFileService } from '@nangohq/shared'; +import { + ActionError, + NangoError, + formatScriptError, + IntegrationServiceInterface, + NangoIntegrationData, + NangoSync, + NangoProps, + localFileService +} from '@nangohq/shared'; import * as vm from 'vm'; import * as url from 'url'; import * as crypto from 'crypto'; @@ -9,15 +18,17 @@ class IntegrationService implements IntegrationServiceInterface { syncName: string, _syncId: string, _activityLogId: number | undefined, - nango: NangoSync, + nangoProps: NangoProps, _integrationData: NangoIntegrationData, _environmentId: number, _writeToDb: boolean, - isAction: boolean, + isInvokedImmediately: boolean, + isWebhook: boolean, optionalLoadLocation?: string, input?: object ): Promise { try { + const nango = new NangoSync(nangoProps); const script: string | null = localFileService.getIntegrationFile(syncName, optionalLoadLocation); if (!script) { @@ -32,7 +43,7 @@ class IntegrationService implements IntegrationServiceInterface { var module = { exports: {} }; var exports = module.exports; ${script} - return module.exports.default || module.exports; + return module.exports; })(); `; @@ -55,8 +66,8 @@ class IntegrationService implements IntegrationServiceInterface { const context = vm.createContext(sandbox); const scriptExports: any = scriptObj.runInContext(context); - if (scriptExports && typeof scriptExports === 'function') { - const results = isAction ? await scriptExports(nango, input) : await scriptExports(nango); + if (scriptExports.default && typeof scriptExports.default === 'function') { + const results = isInvokedImmediately ? await scriptExports.default(nango, input) : await scriptExports.default(nango); return { success: true, error: null, response: results }; } else { const content = `There is no default export that is a function for ${syncName}`; @@ -64,7 +75,17 @@ class IntegrationService implements IntegrationServiceInterface { return { success: false, error: new NangoError(content, 500), response: null }; } } catch (err: any) { - const errorType = isAction ? 'action_script_failure' : 'sync_script_failure'; + // TODO merge this back with the main integration service + if (err instanceof ActionError) { + return { success: false, error: err, response: null }; + } + + let errorType = 'sync_script_failure'; + if (isWebhook) { + errorType = 'webhook_script_failure'; + } else if (isInvokedImmediately) { + errorType = 'action_script_failure'; + } return formatScriptError(err, errorType, syncName); } diff --git a/packages/cli/lib/services/model.service.ts b/packages/cli/lib/services/model.service.ts index 164b212c84..0b7a87c456 100644 --- a/packages/cli/lib/services/model.service.ts +++ b/packages/cli/lib/services/model.service.ts @@ -54,8 +54,7 @@ class ModelService { throw new Error(`Model "${modelName}" doesn't have an id field. This is required to be able to uniquely identify the data record.`); } - const singularModelName = modelName.charAt(modelName.length - 1) === 's' ? modelName.slice(0, -1) : modelName; - const interfaceName = `${singularModelName.charAt(0).toUpperCase()}${singularModelName.slice(1)}`; + const interfaceName = `${modelName.charAt(0).toUpperCase()}${modelName.slice(1)}`; let extendsClause = ''; const fieldDefinitions = Object.keys(fields) .filter((fieldName: string) => { @@ -69,7 +68,7 @@ class ModelService { }) .map((fieldName: string) => { const fieldModel = fields[fieldName] as string | NangoModel; - const fieldType = this.getFieldType(fieldModel, debug); + const fieldType = this.getFieldType(fieldModel, debug, modelName); return ` ${fieldName}: ${fieldType};`; }) .join('\n'); @@ -80,8 +79,12 @@ class ModelService { return interfaceDefinitions; } - private getFieldType(rawField: string | NangoModel, debug = false): string { + private getFieldType(rawField: string | NangoModel, debug = false, modelName: string): string { if (typeof rawField === 'string') { + if (rawField.toString().endsWith(',') || rawField.toString().endsWith(';')) { + throw new Error(`Field "${rawField}" in the model ${modelName} ends with a comma or semicolon which is not allowed.`); + } + let field = rawField; let hasNull = false; let hasUndefined = false; @@ -137,7 +140,7 @@ class ModelService { } else { try { const nestedFields = Object.keys(rawField) - .map((fieldName: string) => ` ${fieldName}: ${this.getFieldType(rawField[fieldName] as string | NangoModel)};`) + .map((fieldName: string) => ` ${fieldName}: ${this.getFieldType(rawField[fieldName] as string | NangoModel, debug, modelName)};`) .join('\n'); return `{\n${nestedFields}\n}`; } catch (_) { diff --git a/packages/cli/lib/services/verification.service.ts b/packages/cli/lib/services/verification.service.ts index ecd5739210..3f98378ebd 100644 --- a/packages/cli/lib/services/verification.service.ts +++ b/packages/cli/lib/services/verification.service.ts @@ -103,13 +103,13 @@ class VerificationService { const syncNames = config.map((provider) => provider.syncs.map((sync) => sync.name)).flat(); const actionNames = config.map((provider) => provider.actions.map((action) => action.name)).flat(); - const flows = [...syncNames, ...actionNames]; + const flows = [...syncNames, ...actionNames].filter((name) => name); const tsFiles = glob.sync(`./*.ts`); const tsFileNames = tsFiles.filter((file) => !file.includes('models.ts')).map((file) => path.basename(file, '.ts')); - const missingSyncsAndActions = flows.filter((syncOrActionName) => !tsFileNames.includes(syncOrActionName)); + const missingSyncsAndActions = flows.filter((syncOrActionName) => !tsFileNames.includes(syncOrActionName as string)); if (missingSyncsAndActions.length > 0) { console.log(chalk.red(`The following syncs are missing a corresponding .ts file: ${missingSyncsAndActions.join(', ')}`)); diff --git a/packages/cli/lib/sync.unit.test.ts b/packages/cli/lib/sync.unit.test.ts index 3e6a3eba7d..2f7d6005d0 100644 --- a/packages/cli/lib/sync.unit.test.ts +++ b/packages/cli/lib/sync.unit.test.ts @@ -219,6 +219,42 @@ describe('generate function tests', () => { ); }); + it('should allow models to end in an s', async () => { + await init(); + const data = { + integrations: { + 'demo-github-integration': { + 'single-model-return': { + type: 'sync', + runs: 'every half hour', + returns: 'GithubIssues' + } + } + }, + models: { + GithubIssues: { + id: 'string', + owner: 'string', + repo: 'string', + issue_number: 'number', + title: 'string', + author: 'string', + author_id: 'string', + state: 'string', + date_created: 'date', + date_last_modified: 'date', + body: 'string' + } + } + }; + const yamlData = yaml.dump(data); + console.log(yamlData); + await fs.promises.writeFile(`${testDirectory}/nango.yaml`, yamlData, 'utf8'); + await generate(false, true); + const modelsFile = await fs.promises.readFile(`${testDirectory}/models.ts`, 'utf8'); + expect(modelsFile).toContain('export interface GithubIssues'); + }); + it('should not throw an error if a model is missing an id for an action', async () => { await init(); const data = { @@ -313,16 +349,42 @@ describe('generate function tests', () => { }); it('should parse a nango.yaml file that is version 1 as expected', async () => { - const { response: config } = await configService.load(path.resolve(__dirname, `./fixtures/nango-yaml/v1`)); + const { response: config } = await configService.load(path.resolve(__dirname, `./fixtures/nango-yaml/v1/valid`)); expect(config).toBeDefined(); - const json = fs.readFileSync(path.resolve(__dirname, `./fixtures/nango-yaml/v1/object.json`), 'utf8'); + const json = fs.readFileSync(path.resolve(__dirname, `./fixtures/nango-yaml/v1/valid/object.json`), 'utf8'); expect(config).toEqual(JSON.parse(json)); }); + it('v1 - should complain about commas at the end of declared types', async () => { + await fs.promises.mkdir(testDirectory, { recursive: true }); + await fs.promises.copyFile(`${fixturesPath}/nango-yaml/v1/no-commas/nango.yaml`, `${testDirectory}/nango.yaml`); + expect(generate(false, true)).rejects.toThrow(`Field "integer," in the model GithubIssue ends with a comma or semicolon which is not allowed.`); + }); + + it('v1 - should complain about semi colons at the end of declared types', async () => { + await fs.promises.mkdir(testDirectory, { recursive: true }); + await fs.promises.copyFile(`${fixturesPath}/nango-yaml/v1/no-semi-colons/nango.yaml`, `${testDirectory}/nango.yaml`); + expect(generate(false, true)).rejects.toThrow(`Field "integer;" in the model GithubIssue ends with a comma or semicolon which is not allowed.`); + }); + it('should parse a nango.yaml file that is version 2 as expected', async () => { - const { response: config } = await configService.load(path.resolve(__dirname, `./fixtures/nango-yaml/v2`)); + const { response: config } = await configService.load(path.resolve(__dirname, `./fixtures/nango-yaml/v2/valid`)); expect(config).toBeDefined(); - const json = fs.readFileSync(path.resolve(__dirname, `./fixtures/nango-yaml/v2/object.json`), 'utf8'); + const json = fs.readFileSync(path.resolve(__dirname, `./fixtures/nango-yaml/v2/valid/object.json`), 'utf8'); expect(config).toEqual(JSON.parse(json)); }); + + it('should throw a validation error on a nango.yaml file that is not formatted correctly -- missing endpoint', async () => { + const { response: config, error } = await configService.load(path.resolve(__dirname, `./fixtures/nango-yaml/v2/invalid.1`)); + expect(config).toBeNull(); + expect(error).toBeDefined(); + expect(error?.message).toEqual('Problem validating the nango.yaml file.'); + }); + + it('should throw a validation error on a nango.yaml file that is not formatted correctly -- webhook subscriptions are not allowed in an action', async () => { + const { response: config, error } = await configService.load(path.resolve(__dirname, `./fixtures/nango-yaml/v2/invalid.2`)); + expect(config).toBeNull(); + expect(error).toBeDefined(); + expect(error?.message).toEqual('Problem validating the nango.yaml file.'); + }); }); diff --git a/packages/cli/lib/templates/sync.ejs b/packages/cli/lib/templates/sync.ejs index e346753970..0b5fe15397 100644 --- a/packages/cli/lib/templates/sync.ejs +++ b/packages/cli/lib/templates/sync.ejs @@ -8,3 +8,9 @@ export default async function fetchData(nango: NangoSync): Promise { // to save data use await nango.batchSave // to delete data use await nango.batchDelete } +<% if (hasWebhook) { %> +export async function onWebhookPayloadReceived(nango: NangoSync, payload: any): Promise { + // handle the subscription types you need + // use nango.batchUpdate for object change events +} +<% } %> diff --git a/packages/cli/lib/utils.ts b/packages/cli/lib/utils.ts index b1bfba41a9..196138b22c 100644 --- a/packages/cli/lib/utils.ts +++ b/packages/cli/lib/utils.ts @@ -428,7 +428,7 @@ export async function parseSecretKey(environment: string, debug = false): Promis } if (!process.env['NANGO_SECRET_KEY']) { - console.log(chalk.red(`NANGO_SECRET_KEY environment variable is not set. Please set it now`)); + console.log(chalk.red(`NANGO_SECRET_KEY_${environment.toUpperCase()} environment variable is not set. Please set it now`)); try { const secretKey = await promptly.prompt('Secret Key: '); if (secretKey) { diff --git a/packages/cli/package.json b/packages/cli/package.json index 8eae996b93..84acfcfa82 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "nango", - "version": "0.36.52", + "version": "0.36.78", "description": "Nango's CLI tool.", "type": "module", "main": "dist/index.js", @@ -23,7 +23,7 @@ "dependencies": { "@babel/traverse": "^7.22.5", "@inquirer/prompts": "^2.3.0", - "@nangohq/shared": "0.36.52", + "@nangohq/shared": "0.36.78", "@vercel/ncc": "^0.36.1", "ajv": "^8.12.0", "ajv-errors": "^3.0.0", diff --git a/packages/frontend/lib/index.ts b/packages/frontend/lib/index.ts index 470e78f3a3..b74d04fc5e 100644 --- a/packages/frontend/lib/index.ts +++ b/packages/frontend/lib/index.ts @@ -91,13 +91,13 @@ export default class Nango { public auth( providerConfigKey: string, connectionId: string, - conectionConfigOrCredentials?: ConnectionConfig | BasicApiCredentials | ApiKeyCredentials + conectionConfigOrCredentials?: ConnectionConfig | BasicApiCredentials | ApiKeyCredentials | AppStoreCredentials ): Promise { if (conectionConfigOrCredentials && 'credentials' in conectionConfigOrCredentials && Object.keys(conectionConfigOrCredentials.credentials).length > 0) { const credentials = conectionConfigOrCredentials.credentials as BasicApiCredentials | ApiKeyCredentials; const { credentials: _, ...connectionConfig } = conectionConfigOrCredentials as ConnectionConfig; - return this.apiAuth(providerConfigKey, connectionId, this.convertCredentialsToConfig(credentials), connectionConfig); + return this.customAuth(providerConfigKey, connectionId, this.convertCredentialsToConfig(credentials), connectionConfig); } const url = @@ -168,7 +168,7 @@ export default class Nango { }); } - private convertCredentialsToConfig(credentials: BasicApiCredentials | ApiKeyCredentials): ConnectionConfig { + private convertCredentialsToConfig(credentials: BasicApiCredentials | ApiKeyCredentials | AppStoreCredentials): ConnectionConfig { const params: Record = {}; if ('username' in credentials) { @@ -181,10 +181,25 @@ export default class Nango { params['apiKey'] = credentials.apiKey || ''; } + if ('privateKeyId' in credentials && 'issuerId' in credentials && 'privateKey' in credentials) { + const appStoreCredentials: { params: Record } = { + params: { + privateKeyId: credentials.privateKeyId as string, + issuerId: credentials.issuerId as string, + privateKey: credentials.privateKey as string + } + }; + + if (credentials.scope) { + appStoreCredentials.params['scope'] = credentials.scope; + } + return appStoreCredentials as unknown as ConnectionConfig; + } + return { params }; } - private async apiAuth( + private async customAuth( providerConfigKey: string, connectionId: string, connectionConfigWithCredentials: ConnectionConfig, @@ -237,7 +252,28 @@ export default class Nango { return res.json(); } - return Promise.reject('Something went wrong with the API authorization'); + if ('privateKeyId' in credentials && 'issuerId' in credentials && 'privateKey' in credentials) { + const appCredentials = credentials as unknown as AppStoreCredentials; + + const url = this.hostBaseUrl + `/app-store-auth/${providerConfigKey}${this.toQueryString(connectionId, connectionConfig as ConnectionConfig)}`; + + const res = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(appCredentials) + }); + + if (!res.ok) { + const errorResponse = await res.json(); + throw new AuthError(errorResponse.error, errorResponse.type); + } + + return res.json(); + } + + return Promise.reject('Something went wrong with the authorization'); } private toQueryString(connectionId: string, connectionConfig?: ConnectionConfig): string { @@ -284,7 +320,7 @@ interface ConnectionConfig { hmac?: string; user_scope?: string[]; authorization_params?: Record; - credentials?: BasicApiCredentials | ApiKeyCredentials; + credentials?: BasicApiCredentials | ApiKeyCredentials | AppStoreCredentials; } interface BasicApiCredentials { @@ -296,6 +332,13 @@ interface ApiKeyCredentials { apiKey?: string; } +interface AppStoreCredentials { + privateKeyId: string; + issuerId: string; + privateKey: string; + scope?: string[]; +} + enum AuthorizationStatus { IDLE, BUSY, diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 7a83a8b10e..4fff74ae9f 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -1,6 +1,6 @@ { "name": "@nangohq/frontend", - "version": "0.36.52", + "version": "0.36.78", "description": "Nango's frontend library for OAuth handling.", "type": "module", "main": "dist/index.js", diff --git a/packages/worker/.gitignore b/packages/jobs/.gitignore similarity index 100% rename from packages/worker/.gitignore rename to packages/jobs/.gitignore diff --git a/packages/jobs/Dockerfile b/packages/jobs/Dockerfile new file mode 100644 index 0000000000..ace81c57bd --- /dev/null +++ b/packages/jobs/Dockerfile @@ -0,0 +1,20 @@ +FROM node:18-slim + +RUN apt-get update \ + && apt-get install -y ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +ENV SERVER_RUN_MODE=DOCKERIZED + +WORKDIR /nango + +COPY packages/node-client/ packages/node-client/ +COPY packages/shared/ packages/shared/ +COPY packages/jobs/ packages/jobs/ +COPY packages/runner/ packages/runner/ +COPY package*.json ./ + +RUN npm pkg delete scripts.prepare +RUN npm install --omit=dev + +CMD [ "node", "/nango/packages/jobs/dist/app.js" ] diff --git a/packages/worker/lib/activities.ts b/packages/jobs/lib/activities.ts similarity index 87% rename from packages/worker/lib/activities.ts rename to packages/jobs/lib/activities.ts index c7cce9852b..e7c10e96bd 100644 --- a/packages/worker/lib/activities.ts +++ b/packages/jobs/lib/activities.ts @@ -23,10 +23,11 @@ import { MetricTypes, isInitialSyncStillRunning, initialSyncExists, + getSyncByIdAndName, logger } from '@nangohq/shared'; import integrationService from './integration.service.js'; -import type { ContinuousSyncArgs, InitialSyncArgs, ActionArgs } from './models/Worker'; +import type { ContinuousSyncArgs, InitialSyncArgs, ActionArgs, WebhookArgs } from './models/worker'; export async function routeSync(args: InitialSyncArgs): Promise { const { syncId, syncJobId, syncName, activityLogId, nangoConnection, debug } = args; @@ -307,23 +308,77 @@ export async function syncProvider( } } +export async function runWebhook(args: WebhookArgs): Promise { + const { input, nangoConnection, activityLogId, parentSyncName } = args; + + const syncConfig: ProviderConfig = (await configService.getProviderConfig( + nangoConnection?.provider_config_key as string, + nangoConnection?.environment_id as number + )) as ProviderConfig; + + const sync = await getSyncByIdAndName(nangoConnection.id as number, parentSyncName); + + const context: Context = Context.current(); + + const syncJobId = await createSyncJob( + sync?.id as string, + SyncType.WEBHOOK, + SyncStatus.RUNNING, + context.info.workflowExecution.workflowId, + nangoConnection, + context.info.workflowExecution.runId + ); + + const syncRun = new syncRunService({ + integrationService, + writeToDb: true, + nangoConnection, + syncJobId: syncJobId?.id as number, + syncName: parentSyncName, + isAction: false, + syncType: SyncType.WEBHOOK, + syncId: sync?.id as string, + isWebhook: true, + activityLogId, + input, + provider: syncConfig.provider, + debug: false, + temporalContext: context + }); + + const result = await syncRun.run(); + + return result.success; +} + export async function reportFailure( error: any, - workflowArguments: InitialSyncArgs | ContinuousSyncArgs | ActionArgs, + workflowArguments: InitialSyncArgs | ContinuousSyncArgs | ActionArgs | WebhookArgs, DEFAULT_TIMEOUT: string, MAXIMUM_ATTEMPTS: number ): Promise { const { nangoConnection } = workflowArguments; - const type = 'syncName' in workflowArguments ? 'sync' : 'action'; - const name = 'syncName' in workflowArguments ? workflowArguments.syncName : workflowArguments.actionName; + let type = 'webhook'; + + let name = ''; + if ('syncName' in workflowArguments) { + name = workflowArguments.syncName; + type = 'sync'; + } else if ('actionName' in workflowArguments) { + name = workflowArguments.actionName; + type = 'action'; + } else { + name = workflowArguments.name; + } + let content = `The ${type} "${name}" failed `; const context: Context = Context.current(); if (error instanceof CancelledFailure) { content += `due to a cancellation.`; - } else if (error.cause instanceof TerminatedFailure || error.cause.name === 'TerminatedFailure') { + } else if (error.cause instanceof TerminatedFailure || error.cause?.name === 'TerminatedFailure') { content += `due to a termination.`; - } else if (error.cause instanceof TimeoutFailure || error.cause.name === 'TimeoutFailure') { + } else if (error.cause instanceof TimeoutFailure || error.cause?.name === 'TimeoutFailure') { if (error.cause.timeoutType === 3) { content += `due to a timeout with respect to the max schedule length timeout of ${DEFAULT_TIMEOUT}.`; } else { diff --git a/packages/jobs/lib/app.ts b/packages/jobs/lib/app.ts new file mode 100644 index 0000000000..f0811f1355 --- /dev/null +++ b/packages/jobs/lib/app.ts @@ -0,0 +1,23 @@ +import { Temporal } from './temporal.js'; +import { server } from './server.js'; +import './tracer.js'; + +try { + const port = parseInt(process.env['NANGO_JOBS_PORT'] || '3005', 10); + server.listen(port); + console.log(`🚀 Jobs service ready at http://localhost:${port}`); + const temporalNs = process.env['TEMPORAL_NAMESPACE'] || 'default'; + const temporal = new Temporal(temporalNs); + temporal.start(); + + // handle SIGTERM + process.on('SIGTERM', async () => { + temporal.stop(); + server.server.close(async () => { + process.exit(0); + }); + }); +} catch (err) { + console.error(`[JOBS]: ${err}`); + process.exit(1); +} diff --git a/packages/jobs/lib/client.ts b/packages/jobs/lib/client.ts new file mode 100644 index 0000000000..71dcac567a --- /dev/null +++ b/packages/jobs/lib/client.ts @@ -0,0 +1,10 @@ +import { CreateTRPCProxyClient, createTRPCProxyClient, httpBatchLink } from '@trpc/client'; +import type { AppRouter } from './server.js'; +import superjson from 'superjson'; + +export function getJobsClient(url: string): CreateTRPCProxyClient { + return createTRPCProxyClient({ + transformer: superjson, + links: [httpBatchLink({ url })] + }); +} diff --git a/packages/worker/lib/integration.service.ts b/packages/jobs/lib/integration.service.ts similarity index 57% rename from packages/worker/lib/integration.service.ts rename to packages/jobs/lib/integration.service.ts index 4dc05ff3ee..2a86a84f32 100644 --- a/packages/worker/lib/integration.service.ts +++ b/packages/jobs/lib/integration.service.ts @@ -1,18 +1,19 @@ import type { Context } from '@temporalio/activity'; -import { NodeVM } from 'vm2'; import { IntegrationServiceInterface, createActivityLogMessage, - getRootDir, NangoIntegrationData, - NangoSync, + NangoProps, localFileService, remoteFileService, isCloud, + isProd, ServiceResponse, NangoError, formatScriptError } from '@nangohq/shared'; +import { getRunner, getRunnerId } from './runner/runner.js'; +import tracer from './tracer.js'; class IntegrationService implements IntegrationServiceInterface { public runningScripts: { [key: string]: Context } = {}; @@ -25,15 +26,24 @@ class IntegrationService implements IntegrationServiceInterface { syncName: string, syncId: string, activityLogId: number | undefined, - nango: NangoSync, + nangoProps: NangoProps, integrationData: NangoIntegrationData, environmentId: number, writeToDb: boolean, - isAction: boolean, + isInvokedImmediately: boolean, + isWebhook: boolean, optionalLoadLocation?: string, input?: object, temporalContext?: Context ): Promise> { + const span = tracer + .startSpan('runScript') + .setTag('accountId', nangoProps.accountId) + .setTag('environmentId', nangoProps.environmentId) + .setTag('connectionId', nangoProps.connectionId) + .setTag('providerConfigKey', nangoProps.providerConfigKey) + .setTag('syncId', nangoProps.syncId) + .setTag('syncName', syncName); try { const script: string | null = isCloud() && !optionalLoadLocation @@ -68,43 +78,47 @@ class IntegrationService implements IntegrationServiceInterface { return { success: false, error, response: null }; } - try { - if (temporalContext) { - this.runningScripts[syncId] = temporalContext; - } + if (temporalContext) { + this.runningScripts[syncId] = temporalContext; + } + if (nangoProps.accountId == null) { + throw new Error(`No accountId provided (instead ${nangoProps.accountId})`); + } + + const accountId = nangoProps.accountId; + const runnerId = isProd() ? getRunnerId(`${accountId}`) : getRunnerId('default'); // a runner per account in prod only + const runner = await getRunner(runnerId).catch((_) => getRunner(getRunnerId('default'))); // fallback to default runner if account runner isn't ready yet - const vm = new NodeVM({ - console: 'inherit', - sandbox: { nango }, - require: { - external: true, - builtin: ['url', 'crypto'] - } + const runSpan = tracer.startSpan('runner.run', { childOf: span }).setTag('runnerId', runner.id); + try { + // TODO: request sent to the runner for it to run the script is synchronous. + // TODO: Make the request return immediately and have the runner ping the job service when it's done. + const res = await runner.client.run.mutate({ + nangoProps, + code: script as string, + codeParams: input as object, + isInvokedImmediately, + isWebhook }); - const rootDir = getRootDir(optionalLoadLocation); - const scriptExports = vm.run(script as string, `${rootDir}/*.js`); - - if (typeof scriptExports.default === 'function') { - const results = isAction ? await scriptExports.default(nango, input) : await scriptExports.default(nango); - - return { success: true, error: null, response: results }; - } else { - const content = `There is no default export that is a function for ${syncName}`; - if (activityLogId && writeToDb) { - await createActivityLogMessage({ - level: 'error', - environment_id: environmentId, - activity_log_id: activityLogId, - content, - timestamp: Date.now() - }); - } - - return { success: false, error: new NangoError(content, 500), response: null }; + // TODO handle errors from the runner more gracefully and this service doesn't have to handle them + if (res && !res.success && res.error) { + const { error } = res; + + const err = new NangoError(error.type, error.payload); + + return { success: false, error: err, response: null }; } + return { success: true, error: null, response: res }; } catch (err: any) { - const errorType = isAction ? 'action_script_failure' : 'sync_script_failure'; + runSpan.setTag('error', err); + + let errorType = 'sync_script_failure'; + if (isWebhook) { + errorType = 'webhook_script_failure'; + } else if (isInvokedImmediately) { + errorType = 'action_script_failure'; + } const { success, error, response } = formatScriptError(err, errorType, syncName); if (activityLogId && writeToDb) { @@ -116,12 +130,14 @@ class IntegrationService implements IntegrationServiceInterface { timestamp: Date.now() }); } - return { success, error, response }; + } finally { + runSpan.finish(); } } catch (err) { + span.setTag('error', err); const errorMessage = JSON.stringify(err, ['message', 'name', 'stack'], 2); - const content = `The script failed to load for ${syncName} with the following error: ${errorMessage}`; + const content = `There was an error running integration '${syncName}': ${errorMessage}`; if (activityLogId && writeToDb) { await createActivityLogMessage({ @@ -136,6 +152,7 @@ class IntegrationService implements IntegrationServiceInterface { return { success: false, error: new NangoError(content, 500), response: null }; } finally { delete this.runningScripts[syncId]; + span.finish(); } } diff --git a/packages/worker/lib/models/Worker.ts b/packages/jobs/lib/models/worker.ts similarity index 78% rename from packages/worker/lib/models/Worker.ts rename to packages/jobs/lib/models/worker.ts index fafa9297ec..3cae8d7a05 100644 --- a/packages/worker/lib/models/Worker.ts +++ b/packages/jobs/lib/models/worker.ts @@ -24,3 +24,11 @@ export interface ActionArgs { nangoConnection: NangoConnection; activityLogId: number; } + +export interface WebhookArgs { + name: string; + parentSyncName: string; + nangoConnection: NangoConnection; + input: object; + activityLogId: number; +} diff --git a/packages/jobs/lib/runner/local.runner.ts b/packages/jobs/lib/runner/local.runner.ts new file mode 100644 index 0000000000..f806f084d2 --- /dev/null +++ b/packages/jobs/lib/runner/local.runner.ts @@ -0,0 +1,55 @@ +import type { Runner } from './runner.js'; +import { execSync, spawn, ChildProcess } from 'child_process'; +import { getRunnerClient } from '@nangohq/nango-runner'; + +export class LocalRunner implements Runner { + constructor(public readonly id: string, public readonly client: any, private readonly childProcess: ChildProcess) {} + + async stop(): Promise { + this.childProcess.kill(); + } + + static async get(runnerId: string): Promise { + try { + const port = Math.floor(Math.random() * 1000) + 11000; // random port between 11000 and 12000; + let nodePath = ''; + try { + nodePath = execSync('which node', { encoding: 'utf-8' }).trim(); + } catch (err) { + throw new Error('Unable to find node'); + } + + const nangoRunnerPath = process.env['NANGO_RUNNER_PATH'] || '../runner/dist/app.js'; + + const cmd = nodePath; + const runnerLocation = `${nangoRunnerPath}`; + const cmdOptions = [runnerLocation, port.toString(), runnerId]; + console.log(`[Runner] Starting runner with command: ${cmd} ${cmdOptions.join(' ')} `); + + const childProcess = spawn(cmd, cmdOptions, { + stdio: [null, null, null] + }); + + if (!childProcess) { + throw new Error('Unable to spawn runner process'); + } + + if (childProcess.stdout) { + childProcess.stdout.on('data', (data) => { + console.log(`[Runner] ${data.toString()} `); + }); + } + + if (childProcess.stderr) { + childProcess.stderr.on('data', (data) => { + console.log(`[Runner][ERROR] ${data.toString()} `); + }); + } + + const client = getRunnerClient(`http://localhost:${port}`); + return new LocalRunner(runnerId, client, childProcess); + } catch (err) { + throw new Error(`Unable to get runner ${runnerId}: ${err}`); + } + } +} diff --git a/packages/jobs/lib/runner/render.runner.ts b/packages/jobs/lib/runner/render.runner.ts new file mode 100644 index 0000000000..9aa9ca1dfe --- /dev/null +++ b/packages/jobs/lib/runner/render.runner.ts @@ -0,0 +1,63 @@ +import type { Runner } from './runner.js'; +import { getRunnerClient } from '@nangohq/nango-runner'; +import { getEnv } from '@nangohq/shared'; +import api from 'api'; + +const render = api('@render-api/v1.0#aiie8wizhlp1is9bu'); +render.auth(process.env['RENDER_API_KEY']); + +export class RenderRunner implements Runner { + constructor(public readonly id: string, public readonly client: any, private readonly serviceId: string) {} + + async stop(): Promise { + render.suspendService({ serviceId: this.serviceId }); + } + + static async get(runnerId: string): Promise { + try { + let svc = null; + // check if runner exists, if not, create it + let res = await render.getServices({ name: runnerId, type: 'private_service', limit: '1' }); + if (res.data.length > 0) { + svc = res.data[0].service; + } else { + const imageTag = getEnv(); + const ownerId = process.env['RUNNER_OWNER_ID']; + if (!ownerId) { + throw new Error('RUNNER_OWNER_ID is not set'); + } + res = await render.createService({ + type: 'private_service', + name: runnerId, + ownerId: ownerId, + image: { ownerId: ownerId, imagePath: `nangohq/nango-runner:${imageTag}` }, + serviceDetails: { env: 'image' }, + envVars: [ + { key: 'NODE_ENV', value: process.env['NODE_ENV'] }, + { key: 'NANGO_CLOUD', value: process.env['NANGO_CLOUD'] }, + { key: 'NANGO_DB_HOST', value: process.env['NANGO_DB_HOST'] }, + { key: 'NANGO_DB_NAME', value: process.env['NANGO_DB_NAME'] }, + { key: 'NANGO_DB_PASSWORD', value: process.env['NANGO_DB_PASSWORD'] }, + { key: 'NANGO_DB_PORT', value: process.env['NANGO_DB_PORT'] }, + { key: 'NANGO_DB_SSL', value: process.env['NANGO_DB_SSL'] }, + { key: 'NANGO_ENCRYPTION_KEY', value: process.env['NANGO_ENCRYPTION_KEY'] }, + { key: 'NODE_OPTIONS', value: '--max-old-space-size=384' } + ] + }); + svc = res.data.service; + } + if (!svc) { + throw new Error(`Unable to create runner instance ${runnerId}`); + } + // check if runner is suspended, if so, resume it + if (svc.suspended === 'suspended') { + const res = await render.resumeService({ serviceId: svc.id }); + console.log(res); + } + const client = getRunnerClient(`http://${runnerId}`); + return new RenderRunner(runnerId, client, svc.id); + } catch (err) { + throw new Error(`Unable to get runner ${runnerId}: ${err}`); + } + } +} diff --git a/packages/jobs/lib/runner/runner.ts b/packages/jobs/lib/runner/runner.ts new file mode 100644 index 0000000000..43ef34cb98 --- /dev/null +++ b/packages/jobs/lib/runner/runner.ts @@ -0,0 +1,49 @@ +import { LocalRunner } from './local.runner.js'; +import { RenderRunner } from './render.runner.js'; +import { getEnv, LogActionEnum, metricsManager, MetricTypes } from '@nangohq/shared'; + +export function getRunnerId(suffix: string): string { + return `${getEnv()}-runner-account-${suffix}`; +} + +export async function getRunner(runnerId: string): Promise { + const isRender = process.env['IS_RENDER'] === 'true'; + try { + const runner = isRender ? await RenderRunner.get(runnerId) : await LocalRunner.get(runnerId); + + // Wait for runner to start and be healthy + const timeoutMs = 5000; + let healthCheck = false; + const startTime = Date.now(); + while (!healthCheck && Date.now() - startTime < timeoutMs) { + try { + await runner.client.health.query(); + healthCheck = true; + } catch (err) { + await new Promise((resolve) => setTimeout(resolve, 1000)); + } + } + if (!healthCheck) { + throw new Error(`Runner '${runnerId}' hasn't started after ${timeoutMs}ms,`); + } + return runner; + } catch (e) { + await metricsManager.capture( + MetricTypes.RENDER_RUNNER_FAILURE_RESOLVED_BACK_TO_LOCAL, + 'Render runner cannnot be accessed', + LogActionEnum.INFRASTRUCTURE, + { + runnerId: String(runnerId), + error: String(e) + } + ); + + return await LocalRunner.get(runnerId); + } +} + +export interface Runner { + id: string; + client: any; + stop(): Promise; +} diff --git a/packages/jobs/lib/server.ts b/packages/jobs/lib/server.ts new file mode 100644 index 0000000000..2cf0fc593e --- /dev/null +++ b/packages/jobs/lib/server.ts @@ -0,0 +1,27 @@ +import { initTRPC } from '@trpc/server'; +import { createHTTPServer } from '@trpc/server/adapters/standalone'; +import superjson from 'superjson'; + +export const t = initTRPC.create({ + transformer: superjson +}); + +const router = t.router; +const publicProcedure = t.procedure; +// TODO: add logging middleware + +const appRouter = router({ + health: healthProcedure() +}); + +export type AppRouter = typeof appRouter; + +export const server = createHTTPServer({ + router: appRouter +}); + +function healthProcedure() { + return publicProcedure.query(async () => { + return { status: 'ok' }; + }); +} diff --git a/packages/jobs/lib/temporal.ts b/packages/jobs/lib/temporal.ts new file mode 100644 index 0000000000..385d26f14b --- /dev/null +++ b/packages/jobs/lib/temporal.ts @@ -0,0 +1,77 @@ +import { Worker, NativeConnection } from '@temporalio/worker'; +import fs from 'fs-extra'; +import * as dotenv from 'dotenv'; +import { createRequire } from 'module'; +import * as activities from './activities.js'; +import { SYNC_TASK_QUEUE, WEBHOOK_TASK_QUEUE, isProd, isEnterprise } from '@nangohq/shared'; + +export class Temporal { + namespace: string; + workers: Worker[] | null; + + constructor(namespace: string) { + this.namespace = namespace; + this.workers = null; + } + + async start() { + console.log('Starting Temporal worker'); + + if (process.env['SERVER_RUN_MODE'] !== 'DOCKERIZED') { + dotenv.config({ path: '../../.env' }); + } + + let crt: Buffer | null = null; + let key: Buffer | null = null; + + if (isProd() || isEnterprise()) { + crt = await fs.readFile(`/etc/secrets/${this.namespace}.crt`); + key = await fs.readFile(`/etc/secrets/${this.namespace}.key`); + } + + try { + const connection = await NativeConnection.connect({ + address: process.env['TEMPORAL_ADDRESS'] || 'localhost:7233', + tls: + !isProd() && !isEnterprise() + ? false + : { + clientCertPair: { + crt: crt as Buffer, + key: key as Buffer + } + } + }); + + const syncWorker = { + connection, + namespace: this.namespace, + workflowsPath: createRequire(import.meta.url).resolve('./workflows'), + activities, + maxConcurrentWorkflowTaskExecutions: 50, + taskQueue: SYNC_TASK_QUEUE + }; + + const webhookWorker = { + connection, + namespace: this.namespace, + workflowsPath: createRequire(import.meta.url).resolve('./workflows'), + activities, + maxConcurrentWorkflowTaskExecutions: 50, + maxActivitiesPerSecond: 50, + taskQueue: WEBHOOK_TASK_QUEUE + }; + + this.workers = await Promise.all([Worker.create(syncWorker), Worker.create(webhookWorker)]); + await Promise.all(this.workers.map((worker) => worker.run())); + } catch (e) { + console.log(e); + } + } + + stop() { + if (this.workers) { + this.workers.forEach((worker) => worker.shutdown()); + } + } +} diff --git a/packages/jobs/lib/tracer.ts b/packages/jobs/lib/tracer.ts new file mode 100644 index 0000000000..78f78b913c --- /dev/null +++ b/packages/jobs/lib/tracer.ts @@ -0,0 +1,9 @@ +import tracer from 'dd-trace'; +import { isCloud } from '@nangohq/shared'; +if (isCloud()) { + tracer.init({ + service: 'nango-jobs' + }); +} + +export default tracer; diff --git a/packages/worker/lib/workflows.ts b/packages/jobs/lib/workflows.ts similarity index 75% rename from packages/worker/lib/workflows.ts rename to packages/jobs/lib/workflows.ts index 7681fece7f..c6790edc07 100644 --- a/packages/worker/lib/workflows.ts +++ b/packages/jobs/lib/workflows.ts @@ -1,11 +1,11 @@ import { proxyActivities } from '@temporalio/workflow'; import type * as activities from './activities.js'; -import type { ContinuousSyncArgs, InitialSyncArgs, ActionArgs } from './models/Worker'; +import type { WebhookArgs, ContinuousSyncArgs, InitialSyncArgs, ActionArgs } from './models/worker'; const DEFAULT_TIMEOUT = '24 hours'; const MAXIMUM_ATTEMPTS = 3; -const { reportFailure, routeSync, scheduleAndRouteSync, runAction } = proxyActivities({ +const { reportFailure, routeSync, scheduleAndRouteSync, runAction, runWebhook } = proxyActivities({ startToCloseTimeout: DEFAULT_TIMEOUT, scheduleToCloseTimeout: DEFAULT_TIMEOUT, retry: { @@ -44,3 +44,13 @@ export async function action(args: ActionArgs): Promise { return { success: false }; } } + +export async function webhook(args: WebhookArgs): Promise { + try { + return await runWebhook(args); + } catch (e: any) { + await reportFailure(e, args, DEFAULT_TIMEOUT, MAXIMUM_ATTEMPTS); + + return false; + } +} diff --git a/packages/worker/nodemon.json b/packages/jobs/nodemon.json similarity index 51% rename from packages/worker/nodemon.json rename to packages/jobs/nodemon.json index fc12c18e11..586aa9f368 100644 --- a/packages/worker/nodemon.json +++ b/packages/jobs/nodemon.json @@ -2,5 +2,6 @@ "watch": ["lib", "../shared/lib", "../../.env"], "ext": "ts,json", "ignore": ["lib/**/*.spec.ts"], - "exec": "ts-node-esm -r dotenv/config lib/worker.ts dotenv_config_path=./../../.env" -} + "exec": "tsx -r dotenv/config lib/app.ts dotenv_config_path=./../../.env", + "signal": "SIGTERM" +} \ No newline at end of file diff --git a/packages/worker/package.json b/packages/jobs/package.json similarity index 71% rename from packages/worker/package.json rename to packages/jobs/package.json index 5103f2e740..4d48d4690a 100644 --- a/packages/worker/package.json +++ b/packages/jobs/package.json @@ -1,21 +1,22 @@ { - "name": "@nangohq/nango-worker", + "name": "@nangohq/nango-jobs", "version": "0.36.52", "type": "module", - "main": "dist/worker.js", + "main": "dist/app.js", "scripts": { - "start": "tsc && node dist/worker.js", + "start": "tsc && node dist/app.js", "dev": "nodemon", - "build": "tsc" + "build": "rimraf dist && tsc" }, "keywords": [], "repository": { "type": "git", "url": "https://github.com/NangoHQ/nango", - "directory": "packages/worker" + "directory": "packages/jobs" }, "dependencies": { - "@nangohq/shared": "0.36.52", + "@nangohq/nango-runner": "0.36.52", + "@nangohq/shared": "0.36.78", "@octokit/plugin-retry": "^6.0.0", "@octokit/plugin-throttling": "^7.0.0", "@octokit/rest": "^20.0.1", @@ -23,15 +24,18 @@ "@temporalio/client": "^1.5.2", "@temporalio/worker": "^1.5.2", "@temporalio/workflow": "^1.5.2", + "@trpc/client": "^10.44.1", + "@trpc/server": "^10.44.1", "@types/fs-extra": "^11.0.1", + "dd-trace": "4.20.0", "dotenv": "^16.0.3", "fs-extra": "^11.1.1", "js-yaml": "^4.1.0", "knex": "^2.4.2", "md5": "^2.3.0", "nanoid": "3.x", - "uuid": "^9.0.0", - "vm2": "^3.9.19" + "superjson": "^2.2.1", + "uuid": "^9.0.0" }, "devDependencies": { "@tsconfig/node16": "^1.0.0", @@ -43,7 +47,6 @@ "eslint-config-prettier": "^8.3.0", "eslint-plugin-deprecation": "^1.2.1", "nodemon": "^3.0.1", - "ts-node": "^10.9.1", - "typescript": "^4.4.2" + "typescript": "^5.3.2" } } diff --git a/packages/worker/tsconfig.json b/packages/jobs/tsconfig.json similarity index 98% rename from packages/worker/tsconfig.json rename to packages/jobs/tsconfig.json index fceecc91c2..dd2652e614 100644 --- a/packages/worker/tsconfig.json +++ b/packages/jobs/tsconfig.json @@ -6,4 +6,4 @@ }, "references": [{ "path": "../shared" }], "include": ["lib/**/*"] -} +} \ No newline at end of file diff --git a/packages/node-client/lib/index.ts b/packages/node-client/lib/index.ts index eebce66742..107967120d 100644 --- a/packages/node-client/lib/index.ts +++ b/packages/node-client/lib/index.ts @@ -296,6 +296,28 @@ export class Nango { return axios.post(url, metadata, { headers: this.enrichHeaders(headers) }); } + public async updateMetadata(providerConfigKey: string, connectionId: string, metadata: Record): Promise> { + if (!providerConfigKey) { + throw new Error('Provider Config Key is required'); + } + + if (!connectionId) { + throw new Error('Connection Id is required'); + } + + if (!metadata) { + throw new Error('Metadata is required'); + } + + const url = `${this.serverUrl}/connection/${connectionId}/metadata?provider_config_key=${providerConfigKey}`; + + const headers: Record = { + 'Provider-Config-Key': providerConfigKey as string + }; + + return axios.patch(url, metadata, { headers: this.enrichHeaders(headers) }); + } + public async deleteConnection(providerConfigKey: string, connectionId: string): Promise> { const url = `${this.serverUrl}/connection/${connectionId}?provider_config_key=${providerConfigKey}`; diff --git a/packages/node-client/lib/types.ts b/packages/node-client/lib/types.ts index e18befe0aa..762a078467 100644 --- a/packages/node-client/lib/types.ts +++ b/packages/node-client/lib/types.ts @@ -5,7 +5,9 @@ export enum AuthModes { OAuth2 = 'OAUTH2', Basic = 'BASIC', ApiKey = 'API_KEY', - App = 'APP' + AppStore = 'APP_STORE', + App = 'APP', + None = 'NONE' } export interface CredentialsCommon> { diff --git a/packages/node-client/package.json b/packages/node-client/package.json index 4176c94f1a..fe821d7e30 100644 --- a/packages/node-client/package.json +++ b/packages/node-client/package.json @@ -1,6 +1,6 @@ { "name": "@nangohq/node", - "version": "0.36.52", + "version": "0.36.78", "description": "Nango's Node client.", "type": "module", "main": "dist/index.js", diff --git a/packages/runner/.gitignore b/packages/runner/.gitignore new file mode 100644 index 0000000000..8c3aba0aad --- /dev/null +++ b/packages/runner/.gitignore @@ -0,0 +1,3 @@ +tsconfig.tsbuildinfo +dist/* +node_modules diff --git a/packages/worker/Dockerfile b/packages/runner/Dockerfile similarity index 70% rename from packages/worker/Dockerfile rename to packages/runner/Dockerfile index c42952c6f5..be6335fafa 100644 --- a/packages/worker/Dockerfile +++ b/packages/runner/Dockerfile @@ -6,14 +6,14 @@ RUN apt-get update \ ENV SERVER_RUN_MODE=DOCKERIZED -WORKDIR /usr/nango-worker/src +WORKDIR /nango -COPY packages/shared/ packages/shared/ COPY packages/node-client/ packages/node-client/ -COPY packages/worker/ packages/worker/ +COPY packages/shared/ packages/shared/ +COPY packages/runner/ packages/runner/ COPY package*.json ./ RUN npm pkg delete scripts.prepare RUN npm install --omit=dev -CMD [ "node", "packages/worker/dist/worker.js" ] +CMD [ "node", "/nango/packages/runner/dist/app.js", "80", "dockerized-runner" ] diff --git a/packages/runner/lib/app.ts b/packages/runner/lib/app.ts new file mode 100644 index 0000000000..a9dd05d902 --- /dev/null +++ b/packages/runner/lib/app.ts @@ -0,0 +1,12 @@ +import { server } from './server.js'; + +try { + const port = parseInt(process.argv[2] || '3006', 10); + const id = process.argv[3] || 'unknown-id'; + server.listen(port, () => { + console.log(`🚀 Runner '${id}' ready at http://localhost:${port}`); + }); +} catch (err) { + console.error(`Unable to start runner: ${err}`); + process.exit(1); +} diff --git a/packages/runner/lib/client.ts b/packages/runner/lib/client.ts new file mode 100644 index 0000000000..9054b11452 --- /dev/null +++ b/packages/runner/lib/client.ts @@ -0,0 +1,25 @@ +import { CreateTRPCProxyClient, createTRPCProxyClient, httpBatchLink } from '@trpc/client'; +import type { AppRouter } from './server.js'; +import superjson from 'superjson'; +import { fetch, Agent } from 'undici'; + +export function getRunnerClient(url: string): CreateTRPCProxyClient { + return createTRPCProxyClient({ + transformer: superjson, + links: [ + httpBatchLink({ + url, + fetch(url, options) { + return fetch(url, { + ...options, + dispatcher: new Agent({ + headersTimeout: 0, + connectTimeout: 0, + bodyTimeout: 0 + }) + }); + } + }) + ] + }); +} diff --git a/packages/runner/lib/client.unit.test.ts b/packages/runner/lib/client.unit.test.ts new file mode 100644 index 0000000000..099eeb1760 --- /dev/null +++ b/packages/runner/lib/client.unit.test.ts @@ -0,0 +1,52 @@ +import { expect, describe, it, beforeAll } from 'vitest'; +import { getRunnerClient } from './client.js'; +import { server } from './server.js'; + +describe('Runner client', () => { + const port = 3095; + const serverUrl = `http://localhost:${port}`; + let client: ReturnType; + + beforeAll(() => { + client = getRunnerClient(serverUrl); + server.listen(port); + }); + + it('should get server health', async () => { + const result = await client.health.query(); + expect(result).toEqual({ status: 'ok' }); + }); + + it('should run code', async () => { + const nangoProps = { + host: 'http://localhost:3003', + connectionId: 'connection-id', + environmentId: 1, + providerConfigKey: 'provider-config-key', + activityLogId: 1, + secretKey: 'secret-key', + nangoConnectionId: 1, + syncId: 'sync-id', + syncJobId: 1, + lastSyncDate: new Date(), + dryRun: true, + attributes: {}, + track_deletes: false, + logMessages: [], + stubbedMetadata: {} + }; + const jsCode = ` + f = async (nango) => { + const s = nango.lastSyncDate.toISOString(); + const b = Buffer.from("hello world"); + const t = await Promise.resolve(setTimeout(() => {}, 5)); + return [1, 2, 3] + }; + exports.default = f + `; + const isInvokedImmediately = false; + const isWebhook = false; + const run = client.run.mutate({ nangoProps, isInvokedImmediately, isWebhook, code: jsCode }); + await expect(run).resolves.toEqual([1, 2, 3]); + }); +}); diff --git a/packages/runner/lib/exec.ts b/packages/runner/lib/exec.ts new file mode 100644 index 0000000000..e23ed09eca --- /dev/null +++ b/packages/runner/lib/exec.ts @@ -0,0 +1,72 @@ +import type { NangoProps } from '@nangohq/shared'; +import { ActionError, NangoSync, NangoAction } from '@nangohq/shared'; +import { Buffer } from 'buffer'; +import * as vm from 'vm'; +import * as url from 'url'; +import * as crypto from 'crypto'; + +export async function exec(nangoProps: NangoProps, isInvokedImmediately: boolean, isWebhook: boolean, code: string, codeParams?: object): Promise { + const isAction = isInvokedImmediately && !isWebhook; + const nango = isAction ? new NangoAction(nangoProps) : new NangoSync(nangoProps); + const wrappedCode = ` + (function() { + var module = { exports: {} }; + var exports = module.exports; + ${code} + return module.exports; + })(); + `; + + try { + const script = new vm.Script(wrappedCode); + const sandbox = { + console, + require: (moduleName: string) => { + switch (moduleName) { + case 'url': + return url; + case 'crypto': + return crypto; + default: + throw new Error(`Module '${moduleName}' is not allowed`); + } + }, + Buffer, + setTimeout + }; + const context = vm.createContext(sandbox); + const scriptExports = script.runInContext(context); + if (isWebhook) { + if (!scriptExports.onWebhookPayloadReceived) { + const content = `There is no onWebhookPayloadReceived export for ${nangoProps.syncId}`; + + throw new Error(content); + } + + return await scriptExports.onWebhookPayloadReceived(nango, codeParams); + } else { + if (!scriptExports.default || typeof scriptExports.default !== 'function') { + throw new Error(`Default exports is not a function but a ${typeof scriptExports.default}`); + } + if (isAction) { + return await scriptExports.default(nango, codeParams); + } else { + return await scriptExports.default(nango); + } + } + } catch (error: any) { + if (error instanceof ActionError) { + const { type, payload } = error; + return { + success: false, + error: { + type, + payload + }, + response: null + }; + } else { + throw new Error(`Error executing code '${error}'`); + } + } +} diff --git a/packages/runner/lib/index.ts b/packages/runner/lib/index.ts new file mode 100644 index 0000000000..9b3f4f9fb5 --- /dev/null +++ b/packages/runner/lib/index.ts @@ -0,0 +1 @@ +export { getRunnerClient } from './client.js'; diff --git a/packages/runner/lib/server.ts b/packages/runner/lib/server.ts new file mode 100644 index 0000000000..29cefa5c87 --- /dev/null +++ b/packages/runner/lib/server.ts @@ -0,0 +1,60 @@ +import { initTRPC } from '@trpc/server'; +import * as trpcExpress from '@trpc/server/adapters/express'; +import express from 'express'; +import type { Request, Response, NextFunction } from 'express'; +import timeout from 'connect-timeout'; +import type { NangoProps } from '@nangohq/shared'; +import { exec } from './exec.js'; +import superjson from 'superjson'; + +export const t = initTRPC.create({ + transformer: superjson +}); + +const router = t.router; +const publicProcedure = t.procedure; + +interface RunParams { + nangoProps: NangoProps; + isInvokedImmediately: boolean; + isWebhook: boolean; + code: string; + codeParams?: object; +} + +const appRouter = router({ + health: healthProcedure(), + run: runProcedure() +}); + +export type AppRouter = typeof appRouter; + +function healthProcedure() { + return publicProcedure.query(async () => { + return { status: 'ok' }; + }); +} + +function runProcedure() { + return publicProcedure + .input((input) => input as RunParams) + .mutation(async ({ input }) => { + const { nangoProps, code, codeParams } = input; + return await exec(nangoProps, input.isInvokedImmediately, input.isWebhook, code, codeParams); + }); +} + +export const server = express(); +server.use(timeout('24h')); +server.use( + '/', + trpcExpress.createExpressMiddleware({ + router: appRouter, + createContext: () => ({}) + }) +); +server.use(haltOnTimedout); + +function haltOnTimedout(req: Request, _res: Response, next: NextFunction) { + if (!req.timedout) next(); +} diff --git a/packages/runner/nodemon.json b/packages/runner/nodemon.json new file mode 100644 index 0000000000..ad33404dea --- /dev/null +++ b/packages/runner/nodemon.json @@ -0,0 +1,6 @@ +{ + "watch": ["lib", "../shared/lib", "../../.env"], + "ext": "ts,json", + "ignore": ["lib/**/*.test.ts"], + "exec": "tsc && tsx -r dotenv/config lib/server.ts dotenv_config_path=./../../.env" +} \ No newline at end of file diff --git a/packages/runner/package.json b/packages/runner/package.json new file mode 100644 index 0000000000..69e50ccc6b --- /dev/null +++ b/packages/runner/package.json @@ -0,0 +1,35 @@ +{ + "name": "@nangohq/nango-runner", + "version": "0.36.52", + "description": "Runs Nango integration code", + "type": "module", + "main": "dist/index.js", + "typings": "dist/index.d.ts", + "scripts": { + "build": "rimraf ./dist && tsc", + "start": "node dist/app.js", + "dev": "nodemon" + }, + "keywords": [], + "repository": { + "type": "git", + "url": "https://github.com/NangoHQ/nango", + "directory": "packages/runner" + }, + "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", + "dependencies": { + "@nangohq/shared": "0.36.78", + "@trpc/client": "^10.44.0", + "@trpc/server": "^10.44.0", + "api": "^6.1.1", + "connect-timeout": "^1.9.0", + "express": "^4.18.2", + "superjson": "^2.2.1", + "undici": "^6.2.1" + }, + "devDependencies": { + "@types/connect-timeout": "^0.0.39", + "@types/node": "^18.7.6", + "typescript": "^5.3.2" + } +} diff --git a/packages/runner/tsconfig.json b/packages/runner/tsconfig.json new file mode 100644 index 0000000000..dd2652e614 --- /dev/null +++ b/packages/runner/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "lib", + "outDir": "dist" + }, + "references": [{ "path": "../shared" }], + "include": ["lib/**/*"] +} \ No newline at end of file diff --git a/packages/server/lib/controllers/apiAuth.controller.ts b/packages/server/lib/controllers/apiAuth.controller.ts index 4d1dfcaf24..3ca88637af 100644 --- a/packages/server/lib/controllers/apiAuth.controller.ts +++ b/packages/server/lib/controllers/apiAuth.controller.ts @@ -7,7 +7,7 @@ import { errorManager, analytics, AnalyticsTypes, - SyncClient, + connectionCreated as connectionCreatedHook, createActivityLogMessage, updateSuccess as updateSuccessActivityLog, updateProvider as updateProviderActivityLog, @@ -156,8 +156,15 @@ class ApiAuthController { ); if (updatedConnection) { - const syncClient = await SyncClient.getInstance(); - await syncClient?.initiate(updatedConnection.id); + await connectionCreatedHook( + { + id: updatedConnection.id, + connection_id: connectionId, + provider_config_key: providerConfigKey, + environment_id: environmentId + }, + config?.provider as string + ); } res.status(200).send({ providerConfigKey: providerConfigKey as string, connectionId: connectionId as string }); @@ -313,8 +320,15 @@ class ApiAuthController { ); if (updatedConnection) { - const syncClient = await SyncClient.getInstance(); - await syncClient?.initiate(updatedConnection.id); + await connectionCreatedHook( + { + id: updatedConnection.id, + connection_id: connectionId, + provider_config_key: providerConfigKey, + environment_id: environmentId + }, + config?.provider as string + ); } res.status(200).send({ providerConfigKey: providerConfigKey as string, connectionId: connectionId as string }); diff --git a/packages/server/lib/controllers/appAuth.controller.ts b/packages/server/lib/controllers/appAuth.controller.ts index a3bff4ddd5..c91eab8359 100644 --- a/packages/server/lib/controllers/appAuth.controller.ts +++ b/packages/server/lib/controllers/appAuth.controller.ts @@ -3,7 +3,7 @@ import { environmentService, AuthCredentials, NangoError, - SyncClient, + connectionCreated as connectionCreatedHook, findActivityLogBySession, errorManager, analytics, @@ -160,8 +160,15 @@ class AppAuthController { ); if (updatedConnection) { - const syncClient = await SyncClient.getInstance(); - await syncClient?.initiate(updatedConnection.id); + await connectionCreatedHook( + { + id: updatedConnection.id, + connection_id: connectionId, + provider_config_key: providerConfigKey, + environment_id: environmentId + }, + session.provider + ); } await createActivityLogMessageAndEnd({ diff --git a/packages/server/lib/controllers/appStoreAuth.controller.ts b/packages/server/lib/controllers/appStoreAuth.controller.ts new file mode 100644 index 0000000000..c8ff75cfb0 --- /dev/null +++ b/packages/server/lib/controllers/appStoreAuth.controller.ts @@ -0,0 +1,217 @@ +import type { Request, Response, NextFunction } from 'express'; +import type { LogLevel } from '@nangohq/shared'; +import { + getAccount, + getEnvironmentId, + createActivityLog, + errorManager, + analytics, + AnalyticsTypes, + connectionCreated as connectionCreatedHook, + createActivityLogMessage, + updateSuccess as updateSuccessActivityLog, + AuthCredentials, + updateProvider as updateProviderActivityLog, + configService, + connectionService, + createActivityLogMessageAndEnd, + AuthModes, + hmacService, + ErrorSourceEnum, + LogActionEnum +} from '@nangohq/shared'; + +class AppStoreAuthController { + async auth(req: Request, res: Response, next: NextFunction) { + const accountId = getAccount(res); + const environmentId = getEnvironmentId(res); + const { providerConfigKey } = req.params; + const connectionId = req.query['connection_id'] as string | undefined; + + const log = { + level: 'info' as LogLevel, + success: false, + action: LogActionEnum.AUTH, + start: Date.now(), + end: Date.now(), + timestamp: Date.now(), + connection_id: connectionId as string, + provider_config_key: providerConfigKey as string, + environment_id: environmentId + }; + + const activityLogId = await createActivityLog(log); + + try { + analytics.track(AnalyticsTypes.PRE_APP_STORE_AUTH, accountId); + + if (!providerConfigKey) { + errorManager.errRes(res, 'missing_connection'); + + return; + } + + if (!connectionId) { + errorManager.errRes(res, 'missing_connection_id'); + + return; + } + + const hmacEnabled = await hmacService.isEnabled(environmentId); + if (hmacEnabled) { + const hmac = req.query['hmac'] as string | undefined; + if (!hmac) { + await createActivityLogMessageAndEnd({ + level: 'error', + environment_id: environmentId, + activity_log_id: activityLogId as number, + timestamp: Date.now(), + content: 'Missing HMAC in query params' + }); + + errorManager.errRes(res, 'missing_hmac'); + + return; + } + const verified = await hmacService.verify(hmac as string, environmentId, providerConfigKey as string, connectionId as string); + if (!verified) { + await createActivityLogMessageAndEnd({ + level: 'error', + environment_id: environmentId, + activity_log_id: activityLogId as number, + timestamp: Date.now(), + content: 'Invalid HMAC' + }); + + errorManager.errRes(res, 'invalid_hmac'); + + return; + } + } + + const config = await configService.getProviderConfig(providerConfigKey as string, environmentId); + + if (config == null) { + await createActivityLogMessageAndEnd({ + level: 'error', + environment_id: environmentId, + activity_log_id: activityLogId as number, + content: `Error during App store auth: config not found`, + timestamp: Date.now() + }); + + errorManager.errRes(res, 'unknown_provider_config'); + + return; + } + + const template = await configService.getTemplate(config?.provider as string); + + if (template.auth_mode !== AuthModes.AppStore) { + await createActivityLogMessageAndEnd({ + level: 'error', + environment_id: environmentId, + activity_log_id: activityLogId as number, + timestamp: Date.now(), + content: `Provider ${config?.provider} does not support App store auth` + }); + + errorManager.errRes(res, 'invalid_auth_mode'); + + return; + } + + await updateProviderActivityLog(activityLogId as number, String(config?.provider)); + + if (!req.body.privateKeyId) { + errorManager.errRes(res, 'missing_private_key_id'); + + return; + } + + if (!req.body.privateKey) { + errorManager.errRes(res, 'missing_private_key'); + + return; + } + + if (!req.body.issuerId) { + errorManager.errRes(res, 'missing_issuer_id'); + + return; + } + + const { privateKeyId, privateKey, issuerId, scope } = req.body; + + const connectionConfig = { + privateKeyId, + issuerId, + scope + }; + + const { success, error, response: credentials } = await connectionService.getAppStoreCredentials(template, connectionConfig, privateKey); + + if (!success || !credentials) { + errorManager.errResFromNangoErr(res, error); + return; + } + + await createActivityLogMessage({ + level: 'info', + environment_id: environmentId, + activity_log_id: activityLogId as number, + content: `App store auth creation was successful`, + timestamp: Date.now() + }); + + await updateSuccessActivityLog(activityLogId as number, true); + + const [updatedConnection] = await connectionService.upsertConnection( + connectionId, + providerConfigKey, + config?.provider as string, + credentials as unknown as AuthCredentials, + connectionConfig, + environmentId, + accountId + ); + + if (updatedConnection) { + await connectionCreatedHook( + { + id: updatedConnection.id, + connection_id: connectionId, + provider_config_key: providerConfigKey, + environment_id: environmentId + }, + config?.provider as string + ); + } + + res.status(200).send({ providerConfigKey: providerConfigKey as string, connectionId: connectionId as string }); + } catch (err) { + const prettyError = JSON.stringify(err, ['message', 'name'], 2); + + await createActivityLogMessage({ + level: 'error', + environment_id: environmentId, + activity_log_id: activityLogId as number, + content: `Error during App store auth: ${prettyError}`, + timestamp: Date.now() + }); + + await errorManager.report(err, { + source: ErrorSourceEnum.PLATFORM, + operation: LogActionEnum.AUTH, + environmentId, + metadata: { + providerConfigKey, + connectionId + } + }); + next(err); + } + } +} + +export default new AppStoreAuthController(); diff --git a/packages/server/lib/controllers/config.controller.integration.test.ts b/packages/server/lib/controllers/config.controller.integration.test.ts index 2a043148f0..85411f5da8 100644 --- a/packages/server/lib/controllers/config.controller.integration.test.ts +++ b/packages/server/lib/controllers/config.controller.integration.test.ts @@ -217,6 +217,7 @@ describe('Should verify the config controller HTTP API calls', async () => { unique_key: 'test', client_id: 'abc', client_secret: 'def', + has_webhook: false, scopes: 'abc,def,efg', app_link: null, auth_mode: 'OAUTH2', diff --git a/packages/server/lib/controllers/config.controller.ts b/packages/server/lib/controllers/config.controller.ts index f6a2b5bc38..586e3e9aa6 100644 --- a/packages/server/lib/controllers/config.controller.ts +++ b/packages/server/lib/controllers/config.controller.ts @@ -192,6 +192,7 @@ class ConfigController { }; }); const actions = await getActionsByProviderConfigKey(environmentId, providerConfigKey); + const hasWebhook = providerTemplate.webhook_routing_script; const configRes: ProviderIntegration | IntegrationWithCreds = includeCreds ? ({ @@ -203,7 +204,8 @@ class ConfigController { app_link: config.app_link, auth_mode: authMode, syncs, - actions + actions, + has_webhook: Boolean(hasWebhook) } as IntegrationWithCreds) : ({ unique_key: config.unique_key, provider: config.provider, syncs, actions } as ProviderIntegration); diff --git a/packages/server/lib/controllers/connection.controller.ts b/packages/server/lib/controllers/connection.controller.ts index 69ff56a002..a8edcd74af 100644 --- a/packages/server/lib/controllers/connection.controller.ts +++ b/packages/server/lib/controllers/connection.controller.ts @@ -2,7 +2,6 @@ import type { Request, Response } from 'express'; import type { NextFunction } from 'express'; import { createActivityLog, - createActivityLogMessageAndEnd, Config as ProviderConfig, Template as ProviderTemplate, AuthModes as ProviderAuthModes, @@ -28,8 +27,7 @@ import { createActivityLogAndLogMessage, environmentService, accountService, - SyncClient, - Connection, + connectionCreated as connectionCreatedHook, slackNotificationService } from '@nangohq/shared'; import { getUserAccountAndEnvironmentFromSession } from '../utils/utils.js'; @@ -287,19 +285,6 @@ class ConnectionController { return; } - if (!isSync && !isDryRun) { - await createActivityLogMessageAndEnd({ - level: 'debug', - environment_id: environmentId, - activity_log_id: activityLogId as number, - timestamp: Date.now(), - content: 'Connection credentials found successfully', - params: { - instant_refresh: instantRefresh - } - }); - } - if (connection && connection.credentials && connection.credentials.type === ProviderAuthModes.OAuth2 && !returnRefreshToken) { if (connection.credentials.refresh_token) { delete connection.credentials.refresh_token; @@ -495,7 +480,7 @@ class ConnectionController { return; } - await connectionService.updateMetadata(connection, req.body); + await connectionService.replaceMetadata(connection, req.body); res.status(201).send(); } catch (err) { @@ -503,6 +488,36 @@ class ConnectionController { } } + async updateMetadata(req: Request, res: Response, next: NextFunction) { + try { + const environmentId = getEnvironmentId(res); + const connectionId = (req.params['connectionId'] as string) || (req.get('Connection-Id') as string); + const providerConfigKey = (req.params['provider_config_key'] as string) || (req.get('Provider-Config-Key') as string); + + const { success, error, response: connection } = await connectionService.getConnection(connectionId, providerConfigKey, environmentId); + + if (!success) { + errorManager.errResFromNangoErr(res, error); + + return; + } + + if (!connection) { + const environmentName = await environmentService.getEnvironmentName(environmentId); + const error = new NangoError('unknown_connection', { connectionId, providerConfigKey, environmentName }); + errorManager.errResFromNangoErr(res, error); + + return; + } + + const metadata = await connectionService.updateMetadata(connection, req.body); + + res.status(200).send(metadata); + } catch (err) { + next(err); + } + } + async createConnection(req: Request, res: Response, next: NextFunction) { try { const environmentId = getEnvironmentId(res); @@ -534,7 +549,7 @@ class ConnectionController { const template = await configService.getTemplate(provider as string); let oAuthCredentials: ImportedCredentials; - let updatedConnection: Connection; + let updatedConnection: { id: number } = {} as { id: number }; if (template.auth_mode === ProviderAuthModes.OAuth2) { const { access_token, refresh_token, expires_at, expires_in, metadata, connection_config } = req.body; @@ -559,7 +574,7 @@ class ConnectionController { raw: req.body.raw || req.body }; - [updatedConnection] = await connectionService.importOAuthConnection( + const [imported] = await connectionService.importOAuthConnection( connection_id, provider_config_key, provider, @@ -567,6 +582,10 @@ class ConnectionController { accountId, oAuthCredentials ); + + if (imported) { + updatedConnection = imported; + } } else if (template.auth_mode === ProviderAuthModes.OAuth1) { const { oauth_token, oauth_token_secret } = req.body; @@ -587,7 +606,7 @@ class ConnectionController { raw: req.body.raw || req.body }; - [updatedConnection] = await connectionService.importOAuthConnection( + const [imported] = await connectionService.importOAuthConnection( connection_id, provider_config_key, provider, @@ -595,6 +614,10 @@ class ConnectionController { accountId, oAuthCredentials ); + + if (imported) { + updatedConnection = imported; + } } else if (template.auth_mode === ProviderAuthModes.Basic) { const { username, password } = req.body; @@ -614,7 +637,7 @@ class ConnectionController { password }; - [updatedConnection] = await connectionService.importApiAuthConnection( + const [imported] = await connectionService.importApiAuthConnection( connection_id, provider_config_key, provider, @@ -622,6 +645,10 @@ class ConnectionController { accountId, credentials ); + + if (imported) { + updatedConnection = imported; + } } else if (template.auth_mode === ProviderAuthModes.ApiKey) { const { api_key: apiKey } = req.body; @@ -635,7 +662,7 @@ class ConnectionController { apiKey }; - [updatedConnection] = await connectionService.importApiAuthConnection( + const [imported] = await connectionService.importApiAuthConnection( connection_id, provider_config_key, provider, @@ -643,6 +670,10 @@ class ConnectionController { accountId, credentials ); + + if (imported) { + updatedConnection = imported; + } } else if (template.auth_mode === ProviderAuthModes.App) { const { app_id, installation_id } = req.body; @@ -675,7 +706,7 @@ class ConnectionController { return; } - [updatedConnection] = await connectionService.upsertConnection( + const [imported] = await connectionService.upsertConnection( connection_id, provider_config_key, provider, @@ -684,14 +715,25 @@ class ConnectionController { environmentId, accountId ); + + if (imported) { + updatedConnection = imported; + } } else { errorManager.errRes(res, 'unknown_oauth_type'); return; } if (updatedConnection && updatedConnection.id) { - const syncClient = await SyncClient.getInstance(); - await syncClient?.initiate(updatedConnection.id); + await connectionCreatedHook( + { + id: updatedConnection.id, + connection_id, + provider_config_key, + environment_id: environmentId + }, + provider + ); } res.status(201).send(req.body); diff --git a/packages/server/lib/controllers/environment.controller.ts b/packages/server/lib/controllers/environment.controller.ts index 7004934aa2..67e99f57ac 100644 --- a/packages/server/lib/controllers/environment.controller.ts +++ b/packages/server/lib/controllers/environment.controller.ts @@ -8,6 +8,7 @@ import { isCloud, getWebsocketsPath, getOauthCallbackUrl, + getGlobalWebhookReceiveUrl, getEnvironmentId } from '@nangohq/shared'; import { packageJsonFile, getUserAccountAndEnvironmentFromSession } from '../utils/utils.js'; @@ -53,6 +54,8 @@ class EnvironmentController { } environment.callback_url = await getOauthCallbackUrl(environment.id); + const webhookBaseUrl = await getGlobalWebhookReceiveUrl(); + environment.webhook_receive_url = `${webhookBaseUrl}/${environment.uuid}`; const environmentVariables = await environmentService.getEnvironmentVariables(environment.id); diff --git a/packages/server/lib/controllers/flow.controller.ts b/packages/server/lib/controllers/flow.controller.ts index d505380c5c..1f7f622873 100644 --- a/packages/server/lib/controllers/flow.controller.ts +++ b/packages/server/lib/controllers/flow.controller.ts @@ -14,7 +14,7 @@ import { remoteFileService, getAllSyncsAndActions, getNangoConfigIdAndLocationFromId, - getSyncConfigConnections + getSyncsByConnectionIdsAndEnvironmentIdAndSyncName } from '@nangohq/shared'; class FlowController { @@ -207,16 +207,30 @@ class FlowController { const { environmentId } = response; const id = req.params['id']; + const connectionIds = req.query['connectionIds'] as string; + const syncName = req.query['sync_name'] as string; if (!id) { res.status(400).send('Missing id'); return; } - const syncsWithConnections = await getSyncConfigConnections(Number(id), environmentId); + if (!connectionIds) { + res.status(400).send('Missing connectionIds'); + return; + } + + if (!syncName) { + res.status(400).send('Missing sync_name'); + return; + } + + const connections = connectionIds.split(','); + + const syncs = await getSyncsByConnectionIdsAndEnvironmentIdAndSyncName(connections, environmentId, syncName); - for (const syncsWithConnection of syncsWithConnections) { - await syncOrchestrator.deleteSync(syncsWithConnection.id as string, environmentId); + for (const sync of syncs) { + await syncOrchestrator.deleteSync(sync.id as string, environmentId); } await syncOrchestrator.deleteConfig(Number(id), environmentId); diff --git a/packages/server/lib/controllers/oauth.controller.ts b/packages/server/lib/controllers/oauth.controller.ts index e1f54e62a1..01406ee2aa 100644 --- a/packages/server/lib/controllers/oauth.controller.ts +++ b/packages/server/lib/controllers/oauth.controller.ts @@ -11,7 +11,7 @@ import { } from '../utils/utils.js'; import { getConnectionConfig, - SyncClient, + connectionCreated as connectionCreatedHook, interpolateStringFromObject, getOauthCallbackUrl, getGlobalAppCallbackUrl, @@ -910,8 +910,15 @@ class OAuthController { }); if (updatedConnection) { - const syncClient = await SyncClient.getInstance(); - await syncClient?.initiate(updatedConnection.id); + await connectionCreatedHook( + { + id: updatedConnection.id, + connection_id: connectionId, + provider_config_key: providerConfigKey, + environment_id + }, + session.provider + ); } await updateSuccessActivityLog(activityLogId, true); diff --git a/packages/server/lib/controllers/unauth.controller.ts b/packages/server/lib/controllers/unauth.controller.ts index 12c1f2a934..c9514498e4 100644 --- a/packages/server/lib/controllers/unauth.controller.ts +++ b/packages/server/lib/controllers/unauth.controller.ts @@ -7,7 +7,7 @@ import { errorManager, analytics, AnalyticsTypes, - SyncClient, + connectionCreated as connectionCreatedHook, createActivityLogMessage, updateSuccess as updateSuccessActivityLog, updateProvider as updateProviderActivityLog, @@ -141,8 +141,15 @@ class UnAuthController { ); if (updatedConnection) { - const syncClient = await SyncClient.getInstance(); - await syncClient?.initiate(updatedConnection.id); + await connectionCreatedHook( + { + id: updatedConnection.id, + connection_id: connectionId, + provider_config_key: providerConfigKey, + environment_id: environmentId + }, + config?.provider as string + ); } res.status(200).send({ providerConfigKey: providerConfigKey as string, connectionId: connectionId as string }); diff --git a/packages/server/lib/controllers/user.controller.ts b/packages/server/lib/controllers/user.controller.ts index 21a7679bdc..6e14c708bf 100644 --- a/packages/server/lib/controllers/user.controller.ts +++ b/packages/server/lib/controllers/user.controller.ts @@ -1,7 +1,7 @@ import { getUserAccountAndEnvironmentFromSession } from '../utils/utils.js'; import type { Request, Response, NextFunction } from 'express'; import EmailClient from '../clients/email.client.js'; -import { errorManager, userService, getBaseUrl, isCloud } from '@nangohq/shared'; +import { errorManager, userService, getBaseUrl, isCloud, isEnterprise } from '@nangohq/shared'; class UserController { async getUser(req: Request, res: Response, next: NextFunction) { @@ -99,7 +99,7 @@ class UserController { if (!invited) { throw new Error('Failed to invite user.'); } - if (isCloud()) { + if (isCloud() || isEnterprise()) { const emailClient = EmailClient.getInstance(); emailClient.send( invited.email, diff --git a/packages/server/lib/controllers/webhook.controller.ts b/packages/server/lib/controllers/webhook.controller.ts new file mode 100644 index 0000000000..2c97a8565d --- /dev/null +++ b/packages/server/lib/controllers/webhook.controller.ts @@ -0,0 +1,45 @@ +import type { Request, Response, NextFunction } from 'express'; +import { routeWebhook, featureFlags, environmentService } from '@nangohq/shared'; + +class WebhookController { + async receive(req: Request, res: Response, next: NextFunction) { + const { environmentUuid, providerConfigKey } = req.params; + const headers = req.headers; + try { + if (!environmentUuid || !providerConfigKey) { + return; + } + + const accountUUID = await environmentService.getAccountUUIDFromEnvironmentUUID(environmentUuid); + + if (!accountUUID) { + res.status(404).send(); + return; + } + + const areWebhooksEnabled = await featureFlags.isEnabled('external-webhooks', accountUUID, true, true); + + let responsePayload = null; + + if (areWebhooksEnabled) { + responsePayload = await routeWebhook(environmentUuid, providerConfigKey, headers, req.body); + } else { + res.status(404).send(); + + return; + } + + if (!responsePayload) { + res.status(200).send(); + return; + } else { + res.status(200).send(responsePayload); + return; + } + } catch (err) { + next(err); + } + } +} + +export default new WebhookController(); diff --git a/packages/server/lib/jobs/index.ts b/packages/server/lib/jobs/index.ts index 8180aabd3e..c41b14e936 100644 --- a/packages/server/lib/jobs/index.ts +++ b/packages/server/lib/jobs/index.ts @@ -6,7 +6,7 @@ export async function deleteOldActivityLogs(): Promise { /** * Delete all activity logs older than 15 days */ - cron.schedule('0 0 * * *', async () => { + cron.schedule('0 * * * *', async () => { const activityLogTableName = '_nango_activity_logs'; await db.knex.withSchema(db.schema()).from(activityLogTableName).where('created_at', '<', db.knex.raw("now() - interval '15 days'")).del(); }); diff --git a/packages/server/lib/server.ts b/packages/server/lib/server.ts index 549c2e29f5..f6ead57410 100644 --- a/packages/server/lib/server.ts +++ b/packages/server/lib/server.ts @@ -11,6 +11,7 @@ import providerController from './controllers/provider.controller.js'; import connectionController from './controllers/connection.controller.js'; import authController from './controllers/auth.controller.js'; import unAuthController from './controllers/unauth.controller.js'; +import appStoreAuthController from './controllers/appStoreAuth.controller.js'; import authMiddleware from './controllers/access.middleware.js'; import userController from './controllers/user.controller.js'; import proxyController from './controllers/proxy.controller.js'; @@ -20,6 +21,7 @@ import flowController from './controllers/flow.controller.js'; import apiAuthController from './controllers/apiAuth.controller.js'; import appAuthController from './controllers/appAuth.controller.js'; import onboardingController from './controllers/onboarding.controller.js'; +import webhookController from './controllers/webhook.controller.js'; import path from 'path'; import { packageJsonFile, dirname } from './utils/utils.js'; import { WebSocketServer, WebSocket } from 'ws'; @@ -33,7 +35,16 @@ import environmentController from './controllers/environment.controller.js'; import accountController from './controllers/account.controller.js'; import type { Response, Request } from 'express'; import Logger from './utils/logger.js'; -import { getGlobalOAuthCallbackUrl, environmentService, getPort, isCloud, isBasicAuthEnabled, errorManager, getWebsocketsPath } from '@nangohq/shared'; +import { + getGlobalOAuthCallbackUrl, + environmentService, + getPort, + isCloud, + isEnterprise, + isBasicAuthEnabled, + errorManager, + getWebsocketsPath +} from '@nangohq/shared'; import oAuthSessionService from './services/oauth-session.service.js'; import { deleteOldActivityLogs } from './jobs/index.js'; import migrate from './utils/migrate.js'; @@ -46,14 +57,16 @@ const app = express(); AuthClient.setup(app); const apiAuth = authMiddleware.secretKeyAuth.bind(authMiddleware); const apiPublicAuth = authMiddleware.publicKeyAuth.bind(authMiddleware); -const webAuth = isCloud() - ? [passport.authenticate('session'), authMiddleware.sessionAuth.bind(authMiddleware)] - : isBasicAuthEnabled() - ? [passport.authenticate('basic', { session: false }), authMiddleware.basicAuth.bind(authMiddleware)] - : [authMiddleware.noAuth.bind(authMiddleware)]; +const webAuth = + isCloud() || isEnterprise() + ? [passport.authenticate('session'), authMiddleware.sessionAuth.bind(authMiddleware)] + : isBasicAuthEnabled() + ? [passport.authenticate('basic', { session: false }), authMiddleware.basicAuth.bind(authMiddleware)] + : [authMiddleware.noAuth.bind(authMiddleware)]; app.use(express.json({ limit: '75mb' })); app.use(cors()); +app.use(express.urlencoded({ extended: true })); // Set to 'false' to disable migration at startup. Appropriate when you // have multiple replicas of the service running and you do not want them @@ -75,8 +88,10 @@ app.get('/health', (_, res) => { app.route('/oauth/callback').get(oauthController.oauthCallback.bind(oauthController)); app.route('/app-auth/connect').get(appAuthController.connect.bind(appAuthController)); app.route('/oauth/connect/:providerConfigKey').get(apiPublicAuth, oauthController.oauthRequest.bind(oauthController)); -app.route('/api-auth/api-key/:providerConfigKey').post(apiPublicAuth, apiAuthController.apiKey.bind(authController)); -app.route('/api-auth/basic/:providerConfigKey').post(apiPublicAuth, apiAuthController.basic.bind(authController)); +app.route('/webhook/:environmentUuid/:providerConfigKey').post(webhookController.receive.bind(proxyController)); +app.route('/api-auth/api-key/:providerConfigKey').post(apiPublicAuth, apiAuthController.apiKey.bind(apiAuthController)); +app.route('/api-auth/basic/:providerConfigKey').post(apiPublicAuth, apiAuthController.basic.bind(apiAuthController)); +app.route('/app-store-auth/:providerConfigKey').post(apiPublicAuth, appStoreAuthController.auth.bind(appStoreAuthController)); app.route('/unauth/:providerConfigKey').post(apiPublicAuth, unAuthController.create.bind(unAuthController)); // API routes (API key auth). @@ -91,6 +106,7 @@ app.route('/connection/:connectionId').get(apiAuth, connectionController.getConn app.route('/connection').get(apiAuth, connectionController.listConnections.bind(connectionController)); app.route('/connection/:connectionId').delete(apiAuth, connectionController.deleteConnection.bind(connectionController)); app.route('/connection/:connectionId/metadata').post(apiAuth, connectionController.setMetadata.bind(connectionController)); +app.route('/connection/:connectionId/metadata').patch(apiAuth, connectionController.updateMetadata.bind(connectionController)); app.route('/connection').post(apiAuth, connectionController.createConnection.bind(connectionController)); app.route('/environment-variables').get(apiAuth, environmentController.getEnvironmentVariables.bind(connectionController)); app.route('/sync/deploy').post(apiAuth, syncController.deploySync.bind(syncController)); @@ -114,7 +130,7 @@ app.route('/admin/flow/deploy/pre-built').post(apiAuth, flowController.adminDepl app.route('/proxy/*').all(apiAuth, proxyController.routeCall.bind(proxyController)); // Webapp routes (no auth). -if (isCloud()) { +if (isCloud() || isEnterprise()) { app.route('/api/v1/signup').post(authController.signup.bind(authController)); app.route('/api/v1/signup/invite').get(authController.invitation.bind(authController)); app.route('/api/v1/logout').post(authController.logout.bind(authController)); @@ -180,7 +196,7 @@ app.route('/api/v1/onboarding/:id').put(webAuth, onboardingController.updateStat app.route('/api/v1/onboarding/sync-status').get(webAuth, onboardingController.checkSyncCompletion.bind(onboardingController)); // Hosted signin -if (!isCloud()) { +if (!isCloud() && !isEnterprise()) { app.route('/api/v1/basic').get(webAuth, (_: Request, res: Response) => { res.status(200).send(); }); diff --git a/packages/server/lib/utils/migrate.ts b/packages/server/lib/utils/migrate.ts index 8cce1e9622..51f86fb6be 100644 --- a/packages/server/lib/utils/migrate.ts +++ b/packages/server/lib/utils/migrate.ts @@ -1,7 +1,8 @@ import Logger from '../utils/logger.js'; -import { db, encryptionManager } from '@nangohq/shared'; +import { encryptionManager, KnexDatabase } from '@nangohq/shared'; export default async function migrate() { + const db = new KnexDatabase({ timeoutMs: 0 }); // Disable timeout for migrations Logger.info('Migrating database ...'); await db.knex.raw(`CREATE SCHEMA IF NOT EXISTS ${db.schema()}`); await db.migrate(process.env['NANGO_DB_MIGRATION_FOLDER'] || '../shared/lib/db/migrations'); diff --git a/packages/server/nodemon.json b/packages/server/nodemon.json index 83bd6c1fdd..46c44855d5 100644 --- a/packages/server/nodemon.json +++ b/packages/server/nodemon.json @@ -2,5 +2,5 @@ "watch": ["lib", "../shared/lib", "../../.env", "../shared/providers.yaml"], "ext": "ts,json", "ignore": ["src/**/*.spec.ts"], - "exec": "ts-node-esm -r dotenv/config lib/server.ts Dotenv_config_path=./../../.env" + "exec": "tsx -r dotenv/config lib/server.ts Dotenv_config_path=./../../.env" } diff --git a/packages/server/package.json b/packages/server/package.json index d599123110..c4fc8deca0 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@nangohq/nango-server", - "version": "0.36.52", + "version": "0.36.78", "description": "Nango OAuth's server.", "type": "module", "main": "dist/server.js", @@ -22,14 +22,14 @@ }, "dependencies": { "@hapi/boom": "^10.0.1", - "@nangohq/shared": "0.36.52", + "@nangohq/shared": "0.36.78", "@sentry/node": "^7.37.2", "@temporalio/client": "^1.7.4", "axios": "^1.3.4", "connect-session-knex": "^3.0.1", "cookie-parser": "^1.4.6", "cors": "^2.8.5", - "dd-trace": "^4.19.0", + "dd-trace": "4.20.0", "dotenv": "^16.0.3", "exponential-backoff": "^3.1.1", "express": "^4.18.2", @@ -72,7 +72,6 @@ "@types/uuid": "^8.3.4", "@types/ws": "^8.5.4", "nodemon": "^3.0.1", - "ts-node": "^10.9.1", "typescript": "^4.7.4" } } diff --git a/packages/shared/flows.yaml b/packages/shared/flows.yaml index 4b28f895ab..6b10181e31 100644 --- a/packages/shared/flows.yaml +++ b/packages/shared/flows.yaml @@ -445,6 +445,10 @@ integrations: runs: every half hour returns: - HubspotServiceTicket + hubspot-contacts: + runs: every day + returns: + - HubspotContact hubspot-owner: runs: every day returns: @@ -493,6 +497,13 @@ integrations: category: string content: string publishDate: number + HubspotContact: + id: string + created_at: string + updated_at: string + first_name: string + last_name: string + email: string intercom: intercom-conversations: runs: every 6 hours @@ -1011,3 +1022,247 @@ integrations: via_followup_source_id: number via_id: number voice_comment: object + zoho-crm: + zoho-crm-accounts: + runs: every half hour + auto_start: false + returns: + - ZohoCRMAccount + description: | + Fetches accounts from zoho crm. + Details: full sync, doesn't track deletes, metadata is not required. + Scope(s): ZohoCRM.modules.accounts.READ or ZohoCRM.modules.ALL + zoho-crm-contacts: + runs: every half hour + auto_start: false + returns: + - ZohoCRMContact + description: | + Fetches contacts from zoho crm. + Details: full sync, doesn't track deletes, metadata is not required. + Scope(s): ZohoCRM.modules.contacts.READ or ZohoCRM.modules.ALL + zoho-crm-deals: + runs: every half hour + auto_start: false + returns: + - ZohoCRMDeal + description: | + Fetches deals/opportunities from zoho crm. + Details: full sync, doesn't track deletes, metadata is not required. + Scope(s): ZohoCRM.modules.deals.READ or ZohoCRM.modules.ALL + models: + ZohoCRMAccount: + Owner: + name: string + id: string + email: string + $currency_symbol: string + $field_states: string + Account_Type: string + SIC_Code: string + Last_Activity_Time: date + Industry: string + Account_Site: string + $state: string + $process_flow: boolean + Billing_Country: string + $locked_for_me: boolean + id: string + $approved: boolean + $approval: + delegate: boolean + approve: boolean + reject: boolean + resubmit: boolean + Billing_Street: string + Created_Time: date + $editable: boolean + Billing_Code: string + Shipping_City: string + Shipping_Country: string + Shipping_Code: string + Billing_City: string + Created_By: + name: string + id: string + email: string + $zia_owner_assignment: string + Annual_Revenue: integer + Shipping_Street: string + Ownership: string + Description: string + Rating: integer + Shipping_State: string + $review_process: + approve: boolean + reject: boolean + resubmit: boolean + Website: string + Employees: integer + Record_Image: string + Modified_By: + name: string + id: string + email: string + $review: string + Phone: string + Account_Name: string + Account_Number: string + Ticker_Symbol: string + Modified_Time: date + $orchestration: boolean + Parent_Account: + name: string + id: string + $in_merge: boolean + Locked__s: boolean + Billing_State: string + Tag: [] + Fax: string + $approval_state: string + ZohoCRMContact: + Owner: + name: string + id: string + email: string + Email: string + $currency_symbol: string + $field_states: string + Other_Phone: string + Mailing_State: string + Other_State: string + Other_Country: string + Last_Activity_Time: date + Department: string + $state: string + Unsubscribed_Mode: string + $process_flow: boolean + Assistant: string + Mailing_Country: string + $locked_for_me: string + id: string + $approved: boolean + Reporting_To: + name: string + id: string + $approval: + delegate: boolean + approve: boolean + reject: boolean + resubmit: boolean + Other_City: string + Created_Time: date + $editable: boolean + Home_Phone: string + Created_By: + name: string + id: string + email: string + $zia_owner_assignment: string + Secondary_Email: string + Description: string + Vendor_Name: + name: string + id: string + Mailing_Zip: string + $review_process: + approve: boolean + reject: boolean + resubmit: boolean + Twitter: string + Other_Zip: string + Mailing_Street: string + Salutation: string + First_Name: string + Full_Name: string + Asst_Phone: string + Record_Image: string + Modified_By: + name: string + id: string + email: string + $review: boolean + Skype_ID: string + Phone: string + Account_Name: + name: string + id: string + Email_Opt_Out: boolean + Modified_Time: date + Date_of_Birth: date + Mailing_City: string + Unsubscribed_Time: date + Title: string + Other_Street: string + Mobile: string + $orchestration: boolean + Last_Name: string + $in_merge: boolean + Locked__s: boolean + Lead_Source: string + Tag: [] + Fax: string + $approval_state: string + ZohoCRMDeal: + Owner: + name: string + id: string + email: string + Description: string + $currency_symbol: string + Campaign_Source: + name: string + id: string + $field_states: string + $review_process: + approve: boolean + reject: boolean + resubmit: boolean + Closing_Date: date + Reason_For_Loss__s: string + Last_Activity_Time: date + Modified_By: + name: string + id: string + email: string + $review: string + Lead_Conversion_Time: date + $state: string + $process_flow: boolean + Deal_Name: string + Expected_Revenue: integer + Overall_Sales_Duration: integer + Stage: string + $locked_for_me: boolean + Account_Name: + name: string + id: string + id: string + $approved: boolean + $approval: + delegate: boolean + approve: boolean + reject: boolean + resubmit: boolean + Modified_Time: date + Created_Time: date + Amount: integer + Next_Step: string + Probability: integer + $editable: boolean + $orchestration: boolean + Contact_Name: + name: string + id: string + Sales_Cycle_Duration: integer + Type: string + $in_merge: boolean + Locked__s: boolean + Lead_Source: string + Created_By: + name: string + id: string + email: string + Tag: [] + $zia_owner_assignment: string + $approval_state: string diff --git a/packages/shared/lib/clients/sync.client.ts b/packages/shared/lib/clients/sync.client.ts index 24b109fb1d..dff29d3f5c 100644 --- a/packages/shared/lib/clients/sync.client.ts +++ b/packages/shared/lib/clients/sync.client.ts @@ -1,5 +1,5 @@ import { Client, Connection, ScheduleOverlapPolicy, ScheduleDescription } from '@temporalio/client'; -import type { NangoConnection } from '../models/Connection.js'; +import type { NangoConnection, Connection as NangoFullConnection } from '../models/Connection.js'; import ms from 'ms'; import fs from 'fs-extra'; import type { Config as ProviderConfig } from '../models/Provider.js'; @@ -7,7 +7,7 @@ import type { NangoIntegrationData, NangoConfig, NangoIntegration } from '../mod import { Sync, SyncStatus, SyncType, ScheduleStatus, SyncCommand, SyncWithSchedule } from '../models/Sync.js'; import type { ServiceResponse } from '../models/Generic.js'; import { LogActionEnum, LogLevel } from '../models/Activity.js'; -import { TASK_QUEUE } from '../constants.js'; +import { SYNC_TASK_QUEUE, WEBHOOK_TASK_QUEUE } from '../constants.js'; import { createActivityLog, createActivityLogMessage, @@ -25,9 +25,11 @@ import errorManager, { ErrorSourceEnum } from '../utils/error.manager.js'; import { NangoError } from '../utils/error.js'; import { isProd } from '../utils/utils.js'; -const generateActionWorkflowId = (actionName: string, connectionId: string) => `${TASK_QUEUE}.ACTION:${actionName}.${connectionId}.${Date.now()}`; -const generateWorkflowId = (sync: Sync, syncName: string, connectionId: string) => `${TASK_QUEUE}.${syncName}.${connectionId}-${sync.id}`; -const generateScheduleId = (sync: Sync, syncName: string, connectionId: string) => `${TASK_QUEUE}.${syncName}.${connectionId}-schedule-${sync.id}`; +const generateActionWorkflowId = (actionName: string, connectionId: string) => `${SYNC_TASK_QUEUE}.ACTION:${actionName}.${connectionId}.${Date.now()}`; +const generateWebhookWorkflowId = (parentSyncName: string, webhookName: string, connectionId: string) => + `${WEBHOOK_TASK_QUEUE}.WEBHOOK:${parentSyncName}:${webhookName}.${connectionId}.${Date.now()}`; +const generateWorkflowId = (sync: Sync, syncName: string, connectionId: string) => `${SYNC_TASK_QUEUE}.${syncName}.${connectionId}-${sync.id}`; +const generateScheduleId = (sync: Sync, syncName: string, connectionId: string) => `${SYNC_TASK_QUEUE}.${syncName}.${connectionId}-schedule-${sync.id}`; const OVERLAP_POLICY: ScheduleOverlapPolicy = ScheduleOverlapPolicy.BUFFER_ONE; @@ -207,7 +209,7 @@ class SyncClient { } handle = await this.client?.workflow.start('initialSync', { - taskQueue: TASK_QUEUE, + taskQueue: SYNC_TASK_QUEUE, workflowId: jobId, args: [ { @@ -247,7 +249,7 @@ class SyncClient { action: { type: 'startWorkflow', workflowType: 'continuousSync', - taskQueue: TASK_QUEUE, + taskQueue: SYNC_TASK_QUEUE, args: [ { syncId: sync.id, @@ -277,7 +279,7 @@ class SyncClient { level: 'info', environment_id: nangoConnection?.environment_id as number, activity_log_id: activityLogId as number, - content: `Started initial background sync ${handle?.workflowId} and data updated on a schedule ${scheduleId} at ${syncData.runs} in the task queue: ${TASK_QUEUE}`, + content: `Started initial background sync ${handle?.workflowId} and data updated on a schedule ${scheduleId} at ${syncData.runs} in the task queue: ${SYNC_TASK_QUEUE}`, timestamp: Date.now() }); } @@ -459,7 +461,7 @@ class SyncClient { level: 'info', environment_id, activity_log_id: activityLogId as number, - content: `Starting action workflow ${workflowId} in the task queue: ${TASK_QUEUE}`, + content: `Starting action workflow ${workflowId} in the task queue: ${SYNC_TASK_QUEUE}`, params: { input: JSON.stringify(input, null, 2) }, @@ -468,7 +470,7 @@ class SyncClient { } const actionHandler = await this.client?.workflow.execute('action', { - taskQueue: TASK_QUEUE, + taskQueue: SYNC_TASK_QUEUE, workflowId, args: [ { @@ -539,6 +541,114 @@ class SyncClient { } } + async triggerWebhook( + nangoConnection: NangoConnection, + webhookName: string, + provider: string, + parentSyncName: string, + input: object, + environment_id: number + ): Promise> { + const log = { + level: 'info' as LogLevel, + success: null, + action: LogActionEnum.WEBHOOK, + start: Date.now(), + end: Date.now(), + timestamp: Date.now(), + connection_id: nangoConnection?.connection_id as string, + provider_config_key: nangoConnection?.provider_config_key as string, + provider, + environment_id: nangoConnection?.environment_id as number, + operation_name: webhookName + }; + + const activityLogId = await createActivityLog(log); + + const workflowId = generateWebhookWorkflowId(parentSyncName, webhookName, nangoConnection.connection_id as string); + + try { + await createActivityLogMessage({ + level: 'info', + environment_id, + activity_log_id: activityLogId as number, + content: `Starting webhook workflow ${workflowId} in the task queue: ${WEBHOOK_TASK_QUEUE}`, + params: { + input: JSON.stringify(input, null, 2) + }, + timestamp: Date.now() + }); + + const { credentials, credentials_iv, credentials_tag, deleted, deleted_at, ...nangoConnectionWithoutCredentials } = + nangoConnection as unknown as NangoFullConnection; + + const webhookHandler = await this.client?.workflow.execute('webhook', { + taskQueue: WEBHOOK_TASK_QUEUE, + workflowId, + args: [ + { + name: webhookName, + parentSyncName, + nangoConnection: nangoConnectionWithoutCredentials, + input, + activityLogId + } + ] + }); + + const { success, error, response } = webhookHandler; + + if (success === false || error) { + await createActivityLogMessageAndEnd({ + level: 'error', + environment_id, + activity_log_id: activityLogId as number, + timestamp: Date.now(), + content: `The webhook workflow ${workflowId} did not complete successfully` + }); + + return { success, error, response }; + } + + await createActivityLogMessageAndEnd({ + level: 'info', + environment_id, + activity_log_id: activityLogId as number, + timestamp: Date.now(), + content: `The webhook workflow ${workflowId} was successfully run.` + }); + + await updateSuccessActivityLog(activityLogId as number, true); + + return { success, error, response }; + } catch (e) { + const errorMessage = JSON.stringify(e, ['message', 'name'], 2); + const error = new NangoError('webhook_script_failure', { errorMessage }); + + await createActivityLogMessageAndEnd({ + level: 'error', + environment_id, + activity_log_id: activityLogId as number, + timestamp: Date.now(), + content: `The webhook workflow ${workflowId} failed with error: ${e}` + }); + + await errorManager.report(e, { + source: ErrorSourceEnum.PLATFORM, + operation: LogActionEnum.SYNC_CLIENT, + environmentId: nangoConnection.environment_id, + metadata: { + parentSyncName, + webhookName, + connectionDetails: JSON.stringify(nangoConnection), + input + } + }); + + return { success: false, error, response: null }; + } + } + async updateSyncSchedule(schedule_id: string, interval: string, offset: number, environmentId: number, syncName?: string, activityLogId?: number) { function updateFunction(scheduleDescription: ScheduleDescription) { scheduleDescription.spec = { diff --git a/packages/shared/lib/constants.ts b/packages/shared/lib/constants.ts index fef07f0694..206a1ef7a0 100644 --- a/packages/shared/lib/constants.ts +++ b/packages/shared/lib/constants.ts @@ -1 +1,2 @@ -export const TASK_QUEUE = 'nango-syncs'; +export const SYNC_TASK_QUEUE = 'nango-syncs'; +export const WEBHOOK_TASK_QUEUE = 'nango-webhooks'; diff --git a/packages/shared/lib/db/config.ts b/packages/shared/lib/db/config.ts deleted file mode 100644 index 5c8c44c3fa..0000000000 --- a/packages/shared/lib/db/config.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { Knex } from 'knex'; - -const config: { development: Knex.Config; production: Knex.Config } = { - development: { - client: process.env['NANGO_DB_CLIENT'] || 'pg', - connection: process.env['NANGO_DATABASE_URL'] || { - host: process.env['NANGO_DB_HOST'] || (process.env['SERVER_RUN_MODE'] === 'DOCKERIZED' ? 'nango-db' : 'localhost'), - port: +(process.env['NANGO_DB_PORT'] || 5432), - user: process.env['NANGO_DB_USER'] || 'nango', - database: process.env['NANGO_DB_NAME'] || 'nango', - password: process.env['NANGO_DB_PASSWORD'] || 'nango', - ssl: process.env['NANGO_DB_SSL'] != null && process.env['NANGO_DB_SSL'].toLowerCase() === 'true' ? { rejectUnauthorized: false } : undefined - }, - migrations: { - directory: './migrations', - extension: 'ts' - }, - pool: { - min: parseInt(process.env['NANGO_DB_POOL_MIN'] || '2'), - max: parseInt(process.env['NANGO_DB_POOL_MAX'] || '7') - } - }, - - production: {} -}; - -export { config }; diff --git a/packages/shared/lib/db/database.ts b/packages/shared/lib/db/database.ts index f616c5a3d6..1bdca15d72 100644 --- a/packages/shared/lib/db/database.ts +++ b/packages/shared/lib/db/database.ts @@ -1,12 +1,30 @@ import knex from 'knex'; import type { Knex } from 'knex'; -import { config } from './config.js'; -class KnexDatabase { +function getDbConfig({ timeoutMs }: { timeoutMs: number }): Knex.Config { + return { + client: process.env['NANGO_DB_CLIENT'] || 'pg', + connection: process.env['NANGO_DATABASE_URL'] || { + host: process.env['NANGO_DB_HOST'] || (process.env['SERVER_RUN_MODE'] === 'DOCKERIZED' ? 'nango-db' : 'localhost'), + port: +(process.env['NANGO_DB_PORT'] || 5432), + user: process.env['NANGO_DB_USER'] || 'nango', + database: process.env['NANGO_DB_NAME'] || 'nango', + password: process.env['NANGO_DB_PASSWORD'] || 'nango', + ssl: process.env['NANGO_DB_SSL'] != null && process.env['NANGO_DB_SSL'].toLowerCase() === 'true' ? { rejectUnauthorized: false } : undefined, + statement_timeout: timeoutMs + }, + pool: { + min: parseInt(process.env['NANGO_DB_POOL_MIN'] || '2'), + max: parseInt(process.env['NANGO_DB_POOL_MAX'] || '7') + } + }; +} + +export class KnexDatabase { knex: Knex; - constructor() { - const dbConfig = config.development; + constructor({ timeoutMs } = { timeoutMs: 60000 }) { + const dbConfig = getDbConfig({ timeoutMs }); this.knex = knex(dbConfig); } diff --git a/packages/shared/lib/db/migrations/20231204191116_add_webhooks_subscriptions_to_config.cjs b/packages/shared/lib/db/migrations/20231204191116_add_webhooks_subscriptions_to_config.cjs new file mode 100644 index 0000000000..e982febaac --- /dev/null +++ b/packages/shared/lib/db/migrations/20231204191116_add_webhooks_subscriptions_to_config.cjs @@ -0,0 +1,13 @@ +const TABLE_NAME = '_nango_sync_configs'; + +exports.up = function (knex, _) { + return knex.schema.withSchema('nango').alterTable(TABLE_NAME, function (table) { + table.specificType('webhook_subscriptions', 'text ARRAY'); + }); +}; + +exports.down = function (knex, _) { + return knex.schema.withSchema('nango').alterTable(TABLE_NAME, function (table) { + table.dropColumn('webhook_subscriptions'); + }); +}; diff --git a/packages/shared/lib/db/migrations/20231205151403_add_uuid_to_environment.cjs b/packages/shared/lib/db/migrations/20231205151403_add_uuid_to_environment.cjs new file mode 100644 index 0000000000..70582c1544 --- /dev/null +++ b/packages/shared/lib/db/migrations/20231205151403_add_uuid_to_environment.cjs @@ -0,0 +1,13 @@ +const tableName = '_nango_environments'; + +exports.up = async function (knex, _) { + await knex.schema.withSchema('nango').alterTable(tableName, function (table) { + table.uuid('uuid').defaultTo(knex.raw('uuid_generate_v4()')).index(); + }); +}; + +exports.down = async function (knex, _) { + await knex.schema.withSchema('nango').table(tableName, function (table) { + table.dropColumn('uuid'); + }); +}; diff --git a/packages/shared/lib/db/migrations/20231208181152_update_jobs_type_enum.cjs b/packages/shared/lib/db/migrations/20231208181152_update_jobs_type_enum.cjs new file mode 100644 index 0000000000..53e22968e4 --- /dev/null +++ b/packages/shared/lib/db/migrations/20231208181152_update_jobs_type_enum.cjs @@ -0,0 +1,31 @@ +const tableName = '_nango_sync_jobs'; + +exports.up = function(knex, _) { + return knex.schema.withSchema('nango').alterTable(tableName, function(table) { + table.string('type_new').defaultsTo('initial').notNullable(); + }) + .then(() => knex.raw(` + UPDATE nango.${tableName} SET type_new = type; + `)) + .then(() => knex.schema.withSchema('nango').alterTable(tableName, function(table) { + table.dropColumn('type'); + })) + .then(() => knex.schema.withSchema('nango').alterTable(tableName, function(table) { + table.renameColumn('type_new', 'type'); + })); +}; + +exports.down = function(knex, _) { + return knex.schema.withSchema('nango').alterTable(tableName, function(table) { + table.enu('type', ['INITIAL', 'INCREMENTAL']).defaultTo('initial').notNullable(); + }) + .then(() => knex.raw(` + UPDATE nango.${tableName} SET type_new = type; + `)) + .then(() => knex.schema.withSchema('nango').alterTable(tableName, function(table) { + table.dropColumn('type'); + })) + .then(() => knex.schema.withSchema('nango').alterTable(tableName, function(table) { + table.renameColumn('type_new', 'type'); + })); +}; diff --git a/packages/shared/lib/db/migrations/20231213124728_drop_sync_data_records_indexes.cjs b/packages/shared/lib/db/migrations/20231213124728_drop_sync_data_records_indexes.cjs new file mode 100644 index 0000000000..a83a9c731f --- /dev/null +++ b/packages/shared/lib/db/migrations/20231213124728_drop_sync_data_records_indexes.cjs @@ -0,0 +1,22 @@ +exports.config = { transaction: false }; + +exports.up = function(knex) { + return Promise.resolve(); + /* + * Production only migration + return knex.schema + .raw('DROP INDEX CONCURRENTLY _nango_sync_data_records_data_hash_index') + .raw('DROP INDEX CONCURRENTLY _nango_sync_data_records_sync_job_id_index') + .raw('DROP INDEX CONCURRENTLY _nango_sync_data_records_external_is_deleted_index') + .raw('DROP INDEX CONCURRENTLY _nango_sync_data_records_external_deleted_at_index') + .raw('DROP INDEX CONCURRENTLY _nango_sync_data_records_deletes_data_hash_index') + .raw('DROP INDEX CONCURRENTLY _nango_sync_data_records_deletes_sync_job_id_index') + .raw('DROP INDEX CONCURRENTLY _nango_sync_data_records_deletes_external_is_deleted_index') + .raw('DROP INDEX CONCURRENTLY _nango_sync_data_records_deletes_external_deleted_at_index') + .raw('DROP INDEX CONCURRENTLY _nango_sync_jobs_deleted_index'); + */ +}; + +exports.down = function(knex) { + return Promise.resolve(); +}; diff --git a/packages/shared/lib/hooks/hooks.ts b/packages/shared/lib/hooks/hooks.ts new file mode 100644 index 0000000000..a4f9ecc687 --- /dev/null +++ b/packages/shared/lib/hooks/hooks.ts @@ -0,0 +1,10 @@ +import SyncClient from '../clients/sync.client.js'; +import type { RecentlyCreatedConnection } from '../models/Connection.js'; +import integrationPostConnectionScript from '../integrations/scripts/connection/connection.manager.js'; + +export const connectionCreated = async (connection: RecentlyCreatedConnection, provider: string): Promise => { + const syncClient = await SyncClient.getInstance(); + syncClient?.initiate(connection.id as number); + + integrationPostConnectionScript(connection, provider); +}; diff --git a/packages/shared/lib/index.ts b/packages/shared/lib/index.ts index e74bca4682..f6f225ba1d 100644 --- a/packages/shared/lib/index.ts +++ b/packages/shared/lib/index.ts @@ -20,6 +20,7 @@ import flowService from './services/flow.service.js'; import slackNotificationService from './services/sync/notification/slack.service.js'; import analytics, { AnalyticsTypes } from './utils/analytics.js'; import logger from './logger/console.js'; +import routeWebhook from './integrations/scripts/webhook/webhook.manager.js'; import featureFlags from './utils/featureflags.js'; export * from './services/activity/activity.service.js'; @@ -31,6 +32,8 @@ export * from './services/sync/config/endpoint.service.js'; export * from './services/sync/config/deploy.service.js'; export * from './services/onboarding.service.js'; +export * from './hooks/hooks.js'; + export * as dataService from './services/sync/data/data.service.js'; export * as syncDataService from './services/sync/data/records.service.js'; @@ -72,6 +75,7 @@ export { slackNotificationService, analytics, AnalyticsTypes, + routeWebhook, logger, featureFlags }; diff --git a/packages/shared/lib/integrations/scripts/connection/connection.manager.ts b/packages/shared/lib/integrations/scripts/connection/connection.manager.ts new file mode 100644 index 0000000000..935d2706ce --- /dev/null +++ b/packages/shared/lib/integrations/scripts/connection/connection.manager.ts @@ -0,0 +1,131 @@ +import type { AxiosResponse } from 'axios'; +import type { RecentlyCreatedConnection, Connection, ConnectionConfig } from '../../../models/Connection.js'; +import { LogLevel, LogActionEnum } from '../../../models/Activity.js'; +import { createActivityLogAndLogMessage } from '../../../services/activity/activity.service.js'; +import type { HTTP_VERB } from '../../../models/Generic.js'; +import proxyService from '../../../services/proxy.service.js'; +import connectionService from '../../../services/connection.service.js'; +import environmentService from '../../../services/environment.service.js'; +import metricsManager, { MetricTypes } from '../../../utils/metrics.manager.js'; + +import * as postConnectionHandlers from './index.js'; + +interface PostConnectionHandler { + (internalNango: InternalNango): Promise; +} + +type PostConnectionHandlersMap = { [key: string]: PostConnectionHandler }; + +const handlers: PostConnectionHandlersMap = postConnectionHandlers as unknown as PostConnectionHandlersMap; + +export interface InternalNango { + proxy: ({ method, endpoint, data }: { method?: HTTP_VERB; endpoint: string; data?: unknown }) => Promise; + updateConnectionConfig: (config: ConnectionConfig) => Promise; +} + +async function execute(createdConnection: RecentlyCreatedConnection, provider: string) { + const { connection_id, environment_id, provider_config_key } = createdConnection; + try { + const accountId = await environmentService.getAccountIdFromEnvironment(environment_id); + const { success, response: connection } = await connectionService.getConnectionCredentials( + accountId as number, + environment_id, + connection_id, + provider_config_key + ); + + if (!success || !connection) { + return; + } + + const internalConfig = { + environmentId: createdConnection.environment_id, + isFlow: true, + isDryRun: false, + throwErrors: false, + connection + }; + + const externalConfig = { + endpoint: '', + connectionId: connection.connection_id, + providerConfigKey: connection.provider_config_key, + method: 'GET' as HTTP_VERB, + data: {} + }; + + const internalNango: InternalNango = { + proxy: ({ method, endpoint, data }: { endpoint: string; method?: HTTP_VERB; data?: unknown }) => { + const finalExternalConfig = { ...externalConfig, method: method || externalConfig.method, endpoint }; + if (data) { + finalExternalConfig.data = data; + } + return proxyService.routeOrConfigure(finalExternalConfig, internalConfig) as Promise; + }, + updateConnectionConfig: (connectionConfig: ConnectionConfig) => { + return connectionService.updateConnectionConfig(connection as unknown as Connection, connectionConfig); + } + }; + + const handler = handlers[`${provider}PostConnection`]; + + if (handler) { + try { + await handler(internalNango); + } catch (e: any) { + const errorMessage = e.message || 'Unknown error'; + const errorDetails = { + message: errorMessage, + name: e.name || 'Error', + stack: e.stack || 'No stack trace' + }; + + const errorString = JSON.stringify(errorDetails); + const log = { + level: 'error' as LogLevel, + success: false, + action: LogActionEnum.AUTH, + start: Date.now(), + end: Date.now(), + timestamp: Date.now(), + connection_id: connection_id, + provider: '', + provider_config_key: provider_config_key, + environment_id + }; + + await createActivityLogAndLogMessage(log, { + level: 'error', + environment_id: environment_id, + timestamp: Date.now(), + content: `Post connection script failed with the error: ${errorString}` + }); + + await metricsManager.capture(MetricTypes.POST_CONNECTION_SCRIPT_FAILURE, `Post connection script failed, ${errorString}`, LogActionEnum.AUTH, { + environmentId: String(environment_id), + connectionId: connection_id, + providerConfigKey: provider_config_key, + provider: provider + }); + } + } + } catch (e: any) { + const errorMessage = e.message || 'Unknown error'; + const errorDetails = { + message: errorMessage, + name: e.name || 'Error', + stack: e.stack || 'No stack trace' + }; + + const errorString = JSON.stringify(errorDetails); + + await metricsManager.capture(MetricTypes.POST_CONNECTION_SCRIPT_FAILURE, `Post connection manager failed, ${errorString}`, LogActionEnum.AUTH, { + environmentId: String(environment_id), + connectionId: connection_id, + providerConfigKey: provider_config_key, + provider: provider + }); + } +} + +export default execute; diff --git a/packages/shared/lib/integrations/scripts/connection/hubspot-post-connection.ts b/packages/shared/lib/integrations/scripts/connection/hubspot-post-connection.ts new file mode 100644 index 0000000000..23d6bac5d8 --- /dev/null +++ b/packages/shared/lib/integrations/scripts/connection/hubspot-post-connection.ts @@ -0,0 +1,12 @@ +import type { InternalNango as Nango } from './connection.manager.js'; + +export default async function execute(nango: Nango) { + const response = await nango.proxy({ endpoint: '/account-info/v3/details' }); + + if (!response || !response.data || !response.data.portalId) { + return; + } + const portalId = response.data.portalId; + + await nango.updateConnectionConfig({ portalId }); +} diff --git a/packages/shared/lib/integrations/scripts/connection/index.ts b/packages/shared/lib/integrations/scripts/connection/index.ts new file mode 100644 index 0000000000..278fef580e --- /dev/null +++ b/packages/shared/lib/integrations/scripts/connection/index.ts @@ -0,0 +1,2 @@ +export { default as hubspotPostConnection } from './hubspot-post-connection.js'; +export { default as jiraPostConnection } from './jira-post-connection.js'; diff --git a/packages/shared/lib/integrations/scripts/connection/jira-post-connection.ts b/packages/shared/lib/integrations/scripts/connection/jira-post-connection.ts new file mode 100644 index 0000000000..15ac64d170 --- /dev/null +++ b/packages/shared/lib/integrations/scripts/connection/jira-post-connection.ts @@ -0,0 +1,26 @@ +import type { InternalNango as Nango } from './connection.manager.js'; + +export default async function execute(nango: Nango) { + const response = await nango.proxy({ + endpoint: `oauth/token/accessible-resources` + }); + + if (!response || !response.data || response.data.length === 0 || !response.data[0].id) { + return; + } + + const cloudId = response.data[0].id; + + const accountResponse = await nango.proxy({ + endpoint: `ex/jira/${cloudId}/rest/api/3/myself` + }); + + if (!accountResponse || !accountResponse.data || accountResponse.data.length === 0) { + await nango.updateConnectionConfig({ cloudId }); + return; + } + + const { accountId } = accountResponse.data; + + await nango.updateConnectionConfig({ cloudId, accountId }); +} diff --git a/packages/shared/lib/integrations/scripts/webhook/hubspot-webhook-routing.ts b/packages/shared/lib/integrations/scripts/webhook/hubspot-webhook-routing.ts new file mode 100644 index 0000000000..94d4a093db --- /dev/null +++ b/packages/shared/lib/integrations/scripts/webhook/hubspot-webhook-routing.ts @@ -0,0 +1,29 @@ +import type { InternalNango as Nango } from './webhook.manager.js'; +import type { Config as ProviderConfig } from '../../../models/Provider.js'; +import crypto from 'crypto'; + +export function validate(integration: ProviderConfig, headers: Record, body: any): boolean { + const signature = headers['x-hubspot-signature']; + + const combinedSignature = `${integration.oauth_client_secret}${JSON.stringify(body)}`; + const createdHash = crypto.createHash('sha256').update(combinedSignature).digest('hex'); + + return signature === createdHash; +} + +export default async function route(nango: Nango, integration: ProviderConfig, headers: Record, body: any) { + const valid = validate(integration, headers, body); + + if (!valid) { + console.log('Hubspot webhook signature invalid'); + return; + } + + if (Array.isArray(body)) { + for (const event of body) { + await nango.executeScriptForWebhooks(integration, event, 'subscriptionType', 'portalId'); + } + } else { + await nango.executeScriptForWebhooks(integration, body, 'subscriptionType', 'portalId'); + } +} diff --git a/packages/shared/lib/integrations/scripts/webhook/index.ts b/packages/shared/lib/integrations/scripts/webhook/index.ts new file mode 100644 index 0000000000..aff79e21bd --- /dev/null +++ b/packages/shared/lib/integrations/scripts/webhook/index.ts @@ -0,0 +1,3 @@ +export { default as hubspotWebhook } from './hubspot-webhook-routing.js'; +export { default as jiraWebhook } from './jira-webhook-routing.js'; +export { default as slackWebhook } from './slack-webhook-routing.js'; diff --git a/packages/shared/lib/integrations/scripts/webhook/jira-webhook-routing.ts b/packages/shared/lib/integrations/scripts/webhook/jira-webhook-routing.ts new file mode 100644 index 0000000000..12cd818204 --- /dev/null +++ b/packages/shared/lib/integrations/scripts/webhook/jira-webhook-routing.ts @@ -0,0 +1,12 @@ +import type { InternalNango as Nango } from './webhook.manager.js'; +import type { Config as ProviderConfig } from '../../../models/Provider.js'; + +export default async function route(nango: Nango, integration: ProviderConfig, _headers: Record, body: any) { + if (Array.isArray(body)) { + for (const event of body) { + await nango.executeScriptForWebhooks(integration, event, 'payload.webhookEvent', 'payload.user.accountId', 'accountId'); + } + } else { + await nango.executeScriptForWebhooks(integration, body, 'payload.webhookEvent', 'payload.user.accountId', 'accountId'); + } +} diff --git a/packages/shared/lib/integrations/scripts/webhook/slack-webhook-routing.ts b/packages/shared/lib/integrations/scripts/webhook/slack-webhook-routing.ts new file mode 100644 index 0000000000..25fe559761 --- /dev/null +++ b/packages/shared/lib/integrations/scripts/webhook/slack-webhook-routing.ts @@ -0,0 +1,20 @@ +import type { InternalNango as Nango, WebhookResponse } from './webhook.manager.js'; +import type { Config as ProviderConfig } from '../../../models/Provider.js'; + +export default async function route( + nango: Nango, + integration: ProviderConfig, + _headers: Record, + body: Record +): Promise { + // slack sends the payload as a form encoded string, so we need to parse it + const payload = JSON.parse(body['payload']); + + if (payload['type'] === 'url_verification') { + return { acknowledgementResponse: body['challenge'] }; + } else { + await nango.executeScriptForWebhooks(integration, payload, 'type', 'team.id'); + + return { parsedBody: payload }; + } +} diff --git a/packages/shared/lib/integrations/scripts/webhook/webhook.manager.ts b/packages/shared/lib/integrations/scripts/webhook/webhook.manager.ts new file mode 100644 index 0000000000..c9d9dff2fa --- /dev/null +++ b/packages/shared/lib/integrations/scripts/webhook/webhook.manager.ts @@ -0,0 +1,181 @@ +import get from 'lodash-es/get.js'; +import configService from '../../../services/config.service.js'; +import SyncClient from '../../../clients/sync.client.js'; +import connectionService from '../../../services/connection.service.js'; +import { getSyncConfigsByConfigId } from '../../../services/sync/config/config.service.js'; +import type { SyncConfig } from './../../../models/Sync.js'; +import type { Config as ProviderConfig } from './../../../models/Provider.js'; +import webhookService from '../../../services/sync/notification/webhook.service.js'; +import environmentService from '../../../services/environment.service.js'; +import metricsManager, { MetricTypes } from '../../../utils/metrics.manager.js'; +import { LogActionEnum } from '../../../models/Activity.js'; + +import * as webhookHandlers from './index.js'; + +interface WebhookHandler { + (internalNango: InternalNango, integration: ProviderConfig, headers: Record, body: any): Promise; +} + +export interface WebhookResponse { + acknowledgementResponse?: unknown; + parsedBody?: unknown; +} + +type WebhookHandlersMap = { [key: string]: WebhookHandler }; + +const handlers: WebhookHandlersMap = webhookHandlers as unknown as WebhookHandlersMap; + +export interface InternalNango { + getWebhooks: (environment_id: number, nango_config_id: number) => Promise; + executeScriptForWebhooks(integration: ProviderConfig, body: any, webhookType: string, connectionIdentifier: string, propName?: string): Promise; +} + +const internalNango: InternalNango = { + getWebhooks: async (environment_id: number, nango_config_id: number) => { + const syncConfigs = await getSyncConfigsByConfigId(environment_id, nango_config_id); + + if (!syncConfigs) { + return null; + } + + const syncConfigsWithWebhooks = syncConfigs.filter((syncConfig: SyncConfig) => syncConfig.webhook_subscriptions); + + return syncConfigsWithWebhooks; + }, + executeScriptForWebhooks: async (integration: ProviderConfig, body: any, webhookType: string, connectionIdentifier: string, propName?: string) => { + const syncConfigsWithWebhooks = await internalNango.getWebhooks(integration.environment_id, integration.id as number); + + if (!syncConfigsWithWebhooks) { + return; + } + const syncClient = await SyncClient.getInstance(); + + if (!get(body, connectionIdentifier)) { + await metricsManager.capture( + MetricTypes.INCOMING_WEBHOOK_ISSUE_WRONG_CONNECTION_IDENTIFIER, + 'Incoming webhook had the wrong connection identifier', + LogActionEnum.WEBHOOK, + { + environmentId: String(integration.environment_id), + provider: integration.provider, + providerConfigKey: integration.unique_key, + connectionIdentifier, + payload: JSON.stringify(body) + } + ); + + return; + } + + const connection = await connectionService.findConnectionByConnectionConfigValue( + propName || connectionIdentifier, + get(body, connectionIdentifier), + integration.environment_id + ); + + if (!connection) { + await metricsManager.capture( + MetricTypes.INCOMING_WEBHOOK_ISSUE_CONNECTION_NOT_FOUND, + 'Incoming webhook received but no connection found for it', + LogActionEnum.WEBHOOK, + { + environmentId: String(integration.environment_id), + provider: integration.provider, + providerConfigKey: integration.unique_key, + propName: String(propName), + connectionIdentifier, + payload: JSON.stringify(body) + } + ); + return; + } + + const accountId = await environmentService.getAccountIdFromEnvironment(integration.environment_id); + + await metricsManager.capture(MetricTypes.INCOMING_WEBHOOK_RECEIVED, 'Incoming webhook received and connection found for it', LogActionEnum.WEBHOOK, { + accountId: String(accountId), + environmentId: String(integration.environment_id), + provider: integration.provider, + providerConfigKey: integration.unique_key, + connectionId: String(connection.connection_id) + }); + + for (const syncConfig of syncConfigsWithWebhooks) { + const { webhook_subscriptions } = syncConfig; + + if (!webhook_subscriptions) { + continue; + } + + for (const webhook of webhook_subscriptions) { + if (get(body, webhookType) === webhook) { + await syncClient?.triggerWebhook(connection, integration.provider, webhook, syncConfig.sync_name, body, integration.environment_id); + } else { + await metricsManager.capture( + MetricTypes.INCOMING_WEBHOOK_ISSUE_WEBHOOK_SUBSCRIPTION_NOT_FOUND_REGISTERED, + 'Incoming webhook received but the webhook was not registered in the nango.yaml', + LogActionEnum.WEBHOOK, + { + accountId: String(accountId), + environmentId: String(integration.environment_id), + provider: integration.provider, + providerConfigKey: integration.unique_key, + connectionId: String(connection.connection_id), + registeredWebhook: webhook, + webhookType, + payload: JSON.stringify(body) + } + ); + } + } + } + } +}; + +async function execute(environmentUuid: string, providerConfigKey: string, headers: Record, body: any): Promise { + if (!body) { + return; + } + + const provider = await configService.getProviderName(providerConfigKey); + const integration = await configService.getProviderConfigByUuid(providerConfigKey, environmentUuid); + + if (!provider || !integration) { + return; + } + + const handler = handlers[`${provider}Webhook`]; + + let res: WebhookResponse | null | void = null; + + try { + if (handler) { + res = await handler(internalNango, integration, headers, body); + } + } catch (e) { + await metricsManager.capture(MetricTypes.INCOMING_WEBHOOK_FAILED_PROCESSING, 'Incoming webhook failed processing', LogActionEnum.WEBHOOK, { + environmentId: String(integration.environment_id), + provider: integration.provider, + providerConfigKey: integration.unique_key, + payload: JSON.stringify(body), + error: String(e) + }); + } + + const webhookBodyToForward = res?.parsedBody || body; + + await webhookService.forward(integration.environment_id, providerConfigKey, provider, webhookBodyToForward); + + await metricsManager.capture(MetricTypes.INCOMING_WEBHOOK_PROCESSED_SUCCESSFULLY, 'Incoming webhook was processed successfully', LogActionEnum.WEBHOOK, { + environmentId: String(integration.environment_id), + provider: integration.provider, + providerConfigKey: integration.unique_key, + payload: JSON.stringify(webhookBodyToForward) + }); + + if (res) { + return res.acknowledgementResponse; + } +} + +export default execute; diff --git a/packages/shared/lib/models/Activity.ts b/packages/shared/lib/models/Activity.ts index ff6efc5cb8..2faa344551 100644 --- a/packages/shared/lib/models/Activity.ts +++ b/packages/shared/lib/models/Activity.ts @@ -10,6 +10,7 @@ export type LogAction = | 'file' | 'full sync' | 'internal authorization' + | 'infrastructure' | 'pause sync' | 'proxy' | 'restart sync' @@ -17,7 +18,8 @@ export type LogAction = | 'sync client' | 'sync deploy' | 'token' - | 'trigger sync'; + | 'trigger sync' + | 'webhook'; export enum LogActionEnum { ACCOUNT = 'account', @@ -27,6 +29,7 @@ export enum LogActionEnum { DATABASE = 'database', FILE = 'file', FULL_SYNC = 'full sync', + INFRASTRUCTURE = 'infrastructure', INTERNAL_AUTHORIZATION = 'internal authorization', PAUSE_SYNC = 'pause sync', PROXY = 'proxy', @@ -35,7 +38,8 @@ export enum LogActionEnum { SYNC_CLIENT = 'sync client', SYNC_DEPLOY = 'sync deploy', TOKEN = 'token', - TRIGGER_SYNC = 'trigger sync' + TRIGGER_SYNC = 'trigger sync', + WEBHOOK = 'webhook' } interface Message { diff --git a/packages/shared/lib/models/Auth.ts b/packages/shared/lib/models/Auth.ts index da443ea479..934c31e865 100644 --- a/packages/shared/lib/models/Auth.ts +++ b/packages/shared/lib/models/Auth.ts @@ -7,6 +7,7 @@ export enum AuthModes { OAuth2 = 'OAUTH2', Basic = 'BASIC', ApiKey = 'API_KEY', + AppStore = 'APP_STORE', App = 'APP', None = 'NONE' } @@ -102,6 +103,14 @@ export interface AppCredentials { raw: Record; } +export interface AppStoreCredentials { + type?: AuthModes.AppStore; + access_token: string; + expires_at?: Date | undefined; + raw: Record; + private_key: string; +} + export interface OAuth2Credentials extends CredentialsCommon { type: AuthModes.OAuth2; access_token: string; diff --git a/packages/shared/lib/models/Connection.ts b/packages/shared/lib/models/Connection.ts index a512fcee6c..2e50378f3f 100644 --- a/packages/shared/lib/models/Connection.ts +++ b/packages/shared/lib/models/Connection.ts @@ -1,15 +1,19 @@ -import type { AuthCredentials, ApiKeyCredentials, BasicApiCredentials, AppCredentials } from './Auth.js'; +import type { AppStoreCredentials, AuthCredentials, ApiKeyCredentials, BasicApiCredentials, AppCredentials } from './Auth.js'; import type { TimestampsAndDeleted } from './Generic.js'; export interface Metadata { [key: string]: string | Record; } +export interface ConnectionConfig { + [key: string]: any; +} + export interface BaseConnection extends TimestampsAndDeleted { id?: number; provider_config_key: string; connection_id: string; - connection_config: Record; + connection_config: ConnectionConfig; environment_id: number; metadata?: Metadata | null; credentials_iv?: string | null; @@ -22,15 +26,17 @@ export interface StoredConnection extends BaseConnection { } export interface Connection extends BaseConnection { - credentials: AuthCredentials | ApiKeyCredentials | BasicApiCredentials | AppCredentials; + credentials: AuthCredentials | ApiKeyCredentials | BasicApiCredentials | AppCredentials | AppStoreCredentials; } +export type RecentlyCreatedConnection = Pick; + export interface ApiConnection { id?: number; connection_id: string; provider_config_key: string; environment_id: number; - connection_config: Record; + connection_config: ConnectionConfig; credentials_iv?: string | null; credentials_tag?: string | null; credentials: BasicApiCredentials | ApiKeyCredentials; @@ -41,6 +47,7 @@ export interface NangoConnection { connection_id: string; provider_config_key: string; environment_id: number; + connection_config?: ConnectionConfig; // TODO legacy while the migration is in progress account_id?: number; diff --git a/packages/shared/lib/models/Environment.ts b/packages/shared/lib/models/Environment.ts index 86f3c52051..ae18127c74 100644 --- a/packages/shared/lib/models/Environment.ts +++ b/packages/shared/lib/models/Environment.ts @@ -2,6 +2,7 @@ import type { Timestamps } from './Generic.js'; export interface Environment extends Timestamps { id: number; + uuid?: string; name: string; account_id: number; secret_key: string; @@ -24,4 +25,6 @@ export interface Environment extends Timestamps { pending_secret_key_tag?: string | null; pending_public_key?: string | null; slack_notifications?: boolean; + + webhook_receive_url?: string; } diff --git a/packages/shared/lib/models/NangoConfig.ts b/packages/shared/lib/models/NangoConfig.ts index 09e721debf..9e5f214868 100644 --- a/packages/shared/lib/models/NangoConfig.ts +++ b/packages/shared/lib/models/NangoConfig.ts @@ -21,6 +21,7 @@ export interface NangoIntegrationDataV1 { export interface NangoIntegrationDataV2 extends NangoIntegrationDataV1 { sync_type?: SyncType; description?: string; + 'webhook-subscriptions'?: string[]; scopes?: string[]; output?: string | string[]; } @@ -120,6 +121,7 @@ export interface NangoSyncConfig { // v2 additions input?: NangoSyncModel; sync_type?: SyncType; + webhookSubscriptions?: string[]; } export interface StandardNangoConfig { diff --git a/packages/shared/lib/models/Provider.ts b/packages/shared/lib/models/Provider.ts index 82a778b8c3..d10042c4fd 100644 --- a/packages/shared/lib/models/Provider.ts +++ b/packages/shared/lib/models/Provider.ts @@ -1,4 +1,4 @@ -import type { CursorPagination, LinkPagination, OffsetPagination } from './Proxy.js'; +import type { RetryHeaderConfig, CursorPagination, LinkPagination, OffsetPagination } from './Proxy.js'; import type { AuthModes } from './Auth.js'; import type { TimestampsAndDeleted } from './Generic.js'; import type { SyncConfig, Action } from './Sync.js'; @@ -24,10 +24,7 @@ export interface Template { query?: { api_key: string; }; - retry?: { - at?: string; - after?: string; - }; + retry?: RetryHeaderConfig; decompress?: boolean; paginate?: LinkPagination | CursorPagination | OffsetPagination; }; @@ -43,6 +40,8 @@ export interface Template { token_response_metadata?: Array; docs?: string; token_expiration_buffer?: number; // In seconds. + webhook_routing_script?: string; + post_connection_script?: string; } export interface TemplateAlias { diff --git a/packages/shared/lib/models/Proxy.ts b/packages/shared/lib/models/Proxy.ts index 6848004848..14c1651966 100644 --- a/packages/shared/lib/models/Proxy.ts +++ b/packages/shared/lib/models/Proxy.ts @@ -4,45 +4,42 @@ import type { BasicApiCredentials, ApiKeyCredentials, AppCredentials } from './A import type { Connection } from './Connection.js'; import type { Template as ProviderTemplate } from './Provider.js'; -export interface ApplicationConstructedProxyConfiguration { +interface BaseProxyConfiguration { endpoint: string; - providerConfigKey: string; - connectionId: string; retries?: number; data?: unknown; headers?: Record; - params?: string | Record; + params?: string | Record; paramsSerializer?: ParamsSerializerOptions; baseUrlOverride?: string; - decompress?: boolean; - responseType?: 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'; - - method: HTTP_VERB; - provider: string; - token: string | BasicApiCredentials | ApiKeyCredentials | AppCredentials; - template: ProviderTemplate; - connection: Connection; + responseType?: ResponseType; + retryHeader?: RetryHeaderConfig; } -export type ResponseType = 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'; - -export interface UserProvidedProxyConfiguration { - endpoint: string; +export interface UserProvidedProxyConfiguration extends BaseProxyConfiguration { providerConfigKey?: string; connectionId?: string; retries?: number; - data?: unknown; - headers?: Record; - params?: string | Record; - paramsSerializer?: ParamsSerializerOptions; - baseUrlOverride?: string; decompress?: boolean | string; method?: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE' | 'get' | 'post' | 'patch' | 'put' | 'delete'; paginate?: Partial | Partial | Partial; - responseType?: ResponseType; } +export interface ApplicationConstructedProxyConfiguration extends BaseProxyConfiguration { + providerConfigKey: string; + connectionId: string; + decompress?: boolean; + + method: HTTP_VERB; + provider: string; + token: string | BasicApiCredentials | ApiKeyCredentials | AppCredentials; + template: ProviderTemplate; + connection: Connection; +} + +export type ResponseType = 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'; + export interface InternalProxyConfiguration { environmentId: number; accountId?: number; @@ -53,6 +50,11 @@ export interface InternalProxyConfiguration { connection?: Connection; } +export interface RetryHeaderConfig { + at?: string; + after?: string; +} + export enum PaginationType { CURSOR = 'cursor', LINK = 'link', diff --git a/packages/shared/lib/models/Sync.ts b/packages/shared/lib/models/Sync.ts index 203ea9ab43..16b075c7c3 100644 --- a/packages/shared/lib/models/Sync.ts +++ b/packages/shared/lib/models/Sync.ts @@ -1,7 +1,7 @@ import type { Context } from '@temporalio/activity'; import { LogActionEnum } from './Activity.js'; import type { HTTP_VERB, Timestamps, TimestampsAndDeleted } from './Generic.js'; -import type { NangoSync } from '../sdk/sync.js'; +import type { NangoProps } from '../sdk/sync.js'; import type { NangoIntegrationData, NangoSyncEndpoint } from './NangoConfig.js'; export enum SyncStatus { @@ -15,6 +15,7 @@ export enum SyncStatus { export enum SyncType { INITIAL = 'INITIAL', INCREMENTAL = 'INCREMENTAL', + WEBHOOK = 'WEBHOOK', FULL = 'FULL', ACTION = 'ACTION' } @@ -102,6 +103,7 @@ export interface SyncConfig extends TimestampsAndDeleted { endpoints?: NangoSyncEndpoint[]; input?: string; sync_type?: SyncType | undefined; + webhook_subscriptions?: string[]; } export interface SyncEndpoint extends Timestamps { @@ -187,6 +189,7 @@ export interface IncomingFlowConfig extends InternalIncomingPreBuiltFlowConfig { track_deletes?: boolean; input?: string; sync_type?: SyncType; + webhookSubscriptions?: string[]; } export enum ScheduleStatus { @@ -268,6 +271,7 @@ export const SyncCommandToScheduleStatus = { }; export interface NangoSyncWebhookBody { + from: string; connectionId: string; providerConfigKey: string; syncName: string; @@ -293,11 +297,12 @@ export interface IntegrationServiceInterface { syncName: string, syncId: string, activityLogId: number | undefined, - nango: NangoSync, + nangoProps: NangoProps, integrationData: NangoIntegrationData, environmentId: number, writeToDb: boolean, - isAction: boolean, + isInvokedImmediately: boolean, + isWebhook: boolean, optionalLoadLocation?: string, input?: object, temporalContext?: Context diff --git a/packages/shared/lib/sdk/sync.ts b/packages/shared/lib/sdk/sync.ts index 07f66dbb06..9e844ee855 100644 --- a/packages/shared/lib/sdk/sync.ts +++ b/packages/shared/lib/sdk/sync.ts @@ -1,5 +1,5 @@ import { getSyncConfigByJobId } from '../services/sync/config/config.service.js'; -import { upsert } from '../services/sync/data/data.service.js'; +import { updateRecord, upsert } from '../services/sync/data/data.service.js'; import { formatDataRecords } from '../services/sync/data/records.service.js'; import { createActivityLogMessage } from '../services/activity/activity.service.js'; import { setLastSyncDate } from '../services/sync/sync.service.js'; @@ -89,6 +89,11 @@ interface OffsetPagination extends Pagination { offset_name_in_request: string; } +interface RetryHeaderConfig { + at?: string; + after?: string; +} + export interface ProxyConfiguration { endpoint: string; providerConfigKey?: string; @@ -102,6 +107,7 @@ export interface ProxyConfiguration { retries?: number; baseUrlOverride?: string; paginate?: Partial | Partial | Partial; + retryHeader?: RetryHeaderConfig; responseType?: 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'; } @@ -110,7 +116,9 @@ enum AuthModes { OAuth2 = 'OAUTH2', Basic = 'BASIC', ApiKey = 'API_KEY', - App = 'APP' + AppStore = 'APP_STORE', + App = 'APP', + None = 'NONE' } interface AppCredentials extends CredentialsCommon { @@ -170,9 +178,23 @@ interface Connection { credentials: AuthCredentials; } -interface NangoProps { +export class ActionError extends Error { + type: string; + payload: unknown; + + constructor(payload?: unknown) { + super(); + this.type = 'action_script_runtime_error'; + if (payload) { + this.payload = payload; + } + } +} + +export interface NangoProps { host?: string; secretKey: string; + accountId?: number; connectionId?: string; environmentId?: number; activityLogId?: number; @@ -211,6 +233,8 @@ export class NangoAction { public connectionId?: string; public providerConfigKey?: string; + public ActionError = ActionError; + constructor(config: NangoProps) { if (config.activityLogId) { this.activityLogId = config.activityLogId; @@ -326,10 +350,14 @@ export class NangoAction { return this.nango.getConnection(this.providerConfigKey as string, this.connectionId as string); } - public async setMetadata(metadata: Record): Promise> { + public async setMetadata(metadata: Record): Promise> { return this.nango.setMetadata(this.providerConfigKey as string, this.connectionId as string, metadata); } + public async updateMetadata(metadata: Record): Promise> { + return this.nango.updateMetadata(this.providerConfigKey as string, this.connectionId as string, metadata); + } + public async setFieldMapping(fieldMapping: Record): Promise> { console.warn('setFieldMapping is deprecated. Please use setMetadata instead.'); return this.nango.setMetadata(this.providerConfigKey as string, this.connectionId as string, fieldMapping); @@ -497,7 +525,7 @@ export class NangoSync extends NangoAction { public async batchSave(results: T[], model: string): Promise { if (!results || results.length === 0) { if (this.dryRun) { - console.log('batchSave received an empty array. No records to send.'); + console.log('batchSave received an empty array. No records to save.'); } return true; } @@ -723,6 +751,114 @@ export class NangoSync extends NangoAction { throw new Error(responseResults?.error); } } + + public async batchUpdate(results: T[], model: string): Promise { + if (!results || results.length === 0) { + if (this.dryRun) { + console.log('batchUpdate received an empty array. No records to update.'); + } + return true; + } + + if (!this.nangoConnectionId || !this.activityLogId) { + throw new Error('Nango Connection Id, and Activity Log Id both required'); + } + + const { + success, + error, + response: formattedResults + } = formatDataRecords( + results as unknown as DataResponse[], + this.nangoConnectionId as number, + model, + this.syncId as string, + this.syncJobId || 0, + this.lastSyncDate, + false + ); + + if (!success || formattedResults === null) { + if (!this.dryRun) { + await createActivityLogMessage({ + level: 'error', + environment_id: this.environmentId as number, + activity_log_id: this.activityLogId as number, + content: `There was an issue with the batch save. ${error?.message}`, + timestamp: Date.now() + }); + } + + throw error; + } + + if (this.dryRun) { + this.logMessages?.push(`A batch update call would update the following data to the ${model} model:`); + this.logMessages?.push(...results); + return null; + } + + const responseResults = await updateRecord( + formattedResults, + '_nango_sync_data_records', + 'external_id', + this.nangoConnectionId as number, + model, + this.activityLogId as number, + this.environmentId as number + ); + + if (responseResults.success) { + const { summary } = responseResults; + const updatedResults = { + [model]: { + added: summary?.addedKeys.length as number, + updated: summary?.updatedKeys.length as number, + deleted: summary?.deletedKeys?.length as number + } + }; + + await createActivityLogMessage({ + level: 'info', + environment_id: this.environmentId as number, + activity_log_id: this.activityLogId as number, + content: `Batch update was a success and resulted in ${JSON.stringify(updatedResults, null, 2)}`, + timestamp: Date.now() + }); + + await updateSyncJobResult(this.syncJobId as number, updatedResults, model); + + return true; + } else { + const content = `There was an issue with the batch update. ${responseResults?.error}`; + + if (!this.dryRun) { + await createActivityLogMessage({ + level: 'error', + environment_id: this.environmentId as number, + activity_log_id: this.activityLogId as number, + content, + timestamp: Date.now() + }); + + await errorManager.report(content, { + environmentId: this.environmentId as number, + source: ErrorSourceEnum.CUSTOMER, + operation: LogActionEnum.SYNC, + metadata: { + connectionId: this.connectionId, + providerConfigKey: this.providerConfigKey, + syncId: this.syncId, + nanogConnectionId: this.nangoConnectionId, + syncJobId: this.syncJobId + } + }); + } + + throw new Error(responseResults?.error); + } + } + public override async getMetadata(): Promise { if (this.dryRun && this.stubbedMetadata) { return this.stubbedMetadata as T; diff --git a/packages/shared/lib/services/config.service.ts b/packages/shared/lib/services/config.service.ts index 759e85821d..f9c65e74c0 100644 --- a/packages/shared/lib/services/config.service.ts +++ b/packages/shared/lib/services/config.service.ts @@ -9,6 +9,7 @@ import { NangoError } from '../utils/error.js'; import encryptionManager from '../utils/encryption.manager.js'; import syncOrchestrator from './sync/orchestrator.service.js'; import { deleteSyncFilesForConfig, deleteByConfigId as deleteSyncConfigByConfigId } from '../services/sync/config/config.service.js'; +import environmentService from '../services/environment.service.js'; class ConfigService { templates: { [key: string]: ProviderTemplate } | null; @@ -81,6 +82,23 @@ class ConfigService { return result[0].id; } + async getProviderConfigByUuid(providerConfigKey: string, environment_uuid: string): Promise { + if (!providerConfigKey) { + throw new NangoError('missing_provider_config'); + } + if (!environment_uuid) { + throw new NangoError('missing_environment_uuid'); + } + + const environment_id = await environmentService.getIdByUuid(environment_uuid); + + if (!environment_id) { + return null; + } + + return this.getProviderConfig(providerConfigKey, environment_id); + } + async getProviderConfig(providerConfigKey: string, environment_id: number): Promise { if (!providerConfigKey) { throw new NangoError('missing_provider_config'); diff --git a/packages/shared/lib/services/connection.service.integration.test.ts b/packages/shared/lib/services/connection.service.integration.test.ts new file mode 100644 index 0000000000..0c95b439b4 --- /dev/null +++ b/packages/shared/lib/services/connection.service.integration.test.ts @@ -0,0 +1,59 @@ +import { expect, describe, it, beforeAll } from 'vitest'; +import { multipleMigrations } from '../db/database.js'; +import connectionService from './connection.service.js'; +import type { Connection, Metadata } from '../models/Connection.js'; +import { createConfigSeeds } from '../db/seeders/config.seeder.js'; +import { createConnectionSeeds } from '../db/seeders/connection.seeder.js'; + +describe('Connection service integration tests', () => { + beforeAll(async () => { + await multipleMigrations(); + await createConfigSeeds(); + }); + + describe('Metadata simple operations', () => { + it('Should replace existing metadata, overwriting anything existing', async () => { + const connections = await createConnectionSeeds(); + + const initialMetadata = { + name: 'test', + host: 'test' + }; + + const newMetadata = { + additionalName: 'test23' + }; + + const [connectionId] = connections; + const connection = { id: connectionId } as Connection; + await connectionService.replaceMetadata(connection, initialMetadata); + await connectionService.replaceMetadata(connection, newMetadata); + + const dbConnection = await connectionService.getConnectionById(connectionId as number); + const updatedMetadata = dbConnection?.metadata as Metadata; + expect(updatedMetadata).toEqual(newMetadata); + }); + + it('Should update metadata and not overwrite', async () => { + const connections = await createConnectionSeeds(); + + const initialMetadata = { + name: 'test', + host: 'test' + }; + + const newMetadata = { + additionalName: 'test23' + }; + + const connectionId = connections[1]; + const dbConnection = (await connectionService.getConnectionById(connectionId as number)) as Connection; + await connectionService.replaceMetadata(dbConnection, initialMetadata); + await connectionService.updateMetadata(dbConnection, newMetadata); + + const updatedDbConnection = await connectionService.getConnectionById(connectionId as number); + const updatedMetadata = updatedDbConnection?.metadata as Metadata; + expect(updatedMetadata).toEqual({ ...initialMetadata, ...newMetadata }); + }); + }); +}); diff --git a/packages/shared/lib/services/connection.service.ts b/packages/shared/lib/services/connection.service.ts index 2aab67e7be..463ca9c41f 100644 --- a/packages/shared/lib/services/connection.service.ts +++ b/packages/shared/lib/services/connection.service.ts @@ -25,13 +25,14 @@ import environmentService from '../services/environment.service.js'; import { getFreshOAuth2Credentials } from '../clients/oauth2.client.js'; import { NangoError } from '../utils/error.js'; -import type { Metadata, Connection, StoredConnection, BaseConnection, NangoConnection } from '../models/Connection.js'; +import type { Metadata, ConnectionConfig, Connection, StoredConnection, BaseConnection, NangoConnection } from '../models/Connection.js'; import type { ServiceResponse } from '../models/Generic.js'; import encryptionManager from '../utils/encryption.manager.js'; import metricsManager, { MetricTypes } from '../utils/metrics.manager.js'; import { AppCredentials, AuthModes as ProviderAuthModes, + AppStoreCredentials, OAuth2Credentials, ImportedCredentials, ApiKeyCredentials, @@ -39,7 +40,7 @@ import { } from '../models/Auth.js'; import { schema } from '../db/database.js'; import { interpolateStringFromObject, parseTokenExpirationDate, isTokenExpired, getRedisUrl } from '../utils/utils.js'; -import SyncClient from '../clients/sync.client.js'; +import { connectionCreated as connectionCreatedHook } from '../hooks/hooks.js'; import { Locking } from '../utils/lock/locking.js'; import { InMemoryKVStore } from '../utils/kvstore/InMemoryStore.js'; import { RedisKVStore } from '../utils/kvstore/RedisStore.js'; @@ -61,7 +62,7 @@ class ConnectionService { environment_id: number, accountId: number, metadata?: Metadata - ) { + ): Promise<{ id: number }[]> { const storedConnection = await this.checkIfConnectionExists(connectionId, providerConfigKey, environment_id); if (storedConnection) { @@ -208,8 +209,15 @@ class ConnectionService { ); if (importedConnection) { - const syncClient = await SyncClient.getInstance(); - syncClient?.initiate(importedConnection[0]?.id as number); + await connectionCreatedHook( + { + id: importedConnection[0]?.id as number, + connection_id, + provider_config_key, + environment_id: environmentId + }, + provider + ); } return importedConnection; @@ -232,8 +240,15 @@ class ConnectionService { const importedConnection = await this.upsertApiConnection(connection_id, provider_config_key, provider, credentials, {}, environmentId, accountId); if (importedConnection) { - const syncClient = await SyncClient.getInstance(); - syncClient?.initiate(importedConnection[0].id); + await connectionCreatedHook( + { + id: importedConnection[0].id, + connection_id, + provider_config_key, + environment_id: environmentId + }, + provider + ); } return importedConnection; @@ -376,11 +391,26 @@ class ConnectionService { return result[0].metadata; } + public async getConnectionConfig(connection: Connection): Promise { + const result = await db.knex.withSchema(db.schema()).from(`_nango_connections`).select('connection_config').where({ + connection_id: connection.connection_id, + provider_config_key: connection.provider_config_key, + environment_id: connection.environment_id, + deleted: false + }); + + if (!result || result.length == 0 || !result[0]) { + return {}; + } + + return result[0].connection_config; + } + public async getConnectionsByEnvironmentAndConfig(environment_id: number, providerConfigKey: string): Promise { const result = await db.knex .withSchema(db.schema()) .from(`_nango_connections`) - .select('id', 'connection_id', 'provider_config_key', 'environment_id') + .select('id', 'connection_id', 'provider_config_key', 'environment_id', 'connection_config') .where({ environment_id, provider_config_key: providerConfigKey, deleted: false }); if (!result || result.length == 0 || !result[0]) { @@ -390,7 +420,7 @@ class ConnectionService { return result; } - public async updateMetadata(connection: Connection, metadata: Metadata) { + public async replaceMetadata(connection: Connection, metadata: Metadata) { await db.knex .withSchema(db.schema()) .from(`_nango_connections`) @@ -398,6 +428,45 @@ class ConnectionService { .update({ metadata }); } + public async replaceConnectionConfig(connection: Connection, config: ConnectionConfig) { + await db.knex + .withSchema(db.schema()) + .from(`_nango_connections`) + .where({ id: connection.id as number, deleted: false }) + .update({ connection_config: config }); + } + + public async updateMetadata(connection: Connection, metadata: Metadata): Promise { + const existingMetadata = await this.getMetadata(connection); + const newMetadata = { ...existingMetadata, ...metadata }; + await this.replaceMetadata(connection, newMetadata); + + return newMetadata; + } + + public async updateConnectionConfig(connection: Connection, config: ConnectionConfig): Promise { + const existingConfig = await this.getConnectionConfig(connection); + const newConfig = { ...existingConfig, ...config }; + await this.replaceConnectionConfig(connection, newConfig); + + return newConfig; + } + + public async findConnectionByConnectionConfigValue(key: string, value: string, environmentId: number): Promise { + const result = await db.knex + .withSchema(db.schema()) + .from(`_nango_connections`) + .select('*') + .where({ environment_id: environmentId }) + .whereRaw(`connection_config->>:key = :value AND deleted = false`, { key, value }); + + if (!result || result.length == 0 || !result[0]) { + return null; + } + + return encryptionManager.decryptConnection(result[0]); + } + public async listConnections( environment_id: number, connectionId?: string @@ -580,7 +649,7 @@ class ConnectionService { environment_id: number, instantRefresh = false, logAction: LogAction = 'token' - ): Promise> { + ): Promise> { const connectionId = connection.connection_id; const credentials = connection.credentials as OAuth2Credentials; const providerConfigKey = connection.provider_config_key; @@ -620,10 +689,6 @@ class ConnectionService { connection.credentials = newCredentials; await this.updateConnection(connection); - if (activityLogId && logAction === 'token') { - await this.logActivity(activityLogId, environment_id, `Token was refreshed for ${providerConfigKey} and connection ${connectionId}`); - } - await metricsManager.capture(MetricTypes.AUTH_TOKEN_REFRESH_SUCCESS, 'Token refresh was successful', LogActionEnum.AUTH, { environmentId: String(environment_id), connectionId, @@ -664,6 +729,57 @@ class ConnectionService { return { success: true, error: null, response: credentials }; } + public async getAppStoreCredentials( + template: ProviderTemplate, + connectionConfig: Connection['connection_config'], + privateKey: string + ): Promise> { + const tokenUrl = interpolateStringFromObject(template.token_url, { connectionConfig }); + + const now = Math.floor(Date.now() / 1000); + const expiration = now + 15 * 60; + + const payload: Record = { + iat: now, + exp: expiration, + iss: connectionConfig['issuerId'] + }; + + if (template.authorization_params && template.authorization_params['audience']) { + payload['aud'] = template.authorization_params['audience']; + } + + if (connectionConfig['scope']) { + payload['scope'] = connectionConfig['scope']; + } + + const { + success, + error, + response: rawCredentials + } = await this.getJWTCredentials(privateKey, tokenUrl, payload, null, { + header: { + alg: 'ES256', + kid: connectionConfig['privateKeyId'], + typ: 'JWT' + } + }); + + if (!success || !rawCredentials) { + return { success, error, response: null }; + } + + const credentials: AppStoreCredentials = { + type: ProviderAuthModes.AppStore, + access_token: (rawCredentials as any)?.token, + private_key: Buffer.from(privateKey).toString('base64'), + expires_at: (rawCredentials as any)?.expires_at, + raw: rawCredentials as unknown as Record + }; + + return { success: true, error: null, response: credentials }; + } + public async getAppCredentials( template: ProviderTemplate, config: ProviderConfig, @@ -672,47 +788,77 @@ class ConnectionService { const tokenUrl = interpolateStringFromObject(template.token_url, { connectionConfig }); const privateKeyBase64 = config.oauth_client_secret; - let privateKey = Buffer.from(privateKeyBase64, 'base64').toString('utf8'); - privateKey = privateKey.replace('-----BEGIN RSA PRIVATE KEY-----', '-----BEGIN RSA PRIVATE KEY-----\n'); - privateKey = privateKey.replace('-----END RSA PRIVATE KEY-----', '\n-----END RSA PRIVATE KEY-----'); - privateKey = privateKey.replace(/(.{64})/g, '$1\n'); + const privateKey = Buffer.from(privateKeyBase64, 'base64').toString('utf8'); + + const headers = { + Accept: 'application/vnd.github.v3+json' + }; const now = Math.floor(Date.now() / 1000); const expiration = now + 10 * 60; - const payload = { + const payload: Record = { iat: now, exp: expiration, iss: config.oauth_client_id }; - const token = jwt.sign(payload, privateKey, { algorithm: 'RS256' }); + const { success, error, response: rawCredentials } = await this.getJWTCredentials(privateKey, tokenUrl, payload, headers, { algorithm: 'RS256' }); + + if (!success || !rawCredentials) { + return { success, error, response: null }; + } + + const credentials: AppCredentials = { + type: ProviderAuthModes.App, + access_token: (rawCredentials as any)?.token, + expires_at: (rawCredentials as any)?.expires_at, + raw: rawCredentials as unknown as Record + }; + + return { success: true, error: null, response: credentials }; + } + + private async getJWTCredentials( + privateKey: string, + url: string, + payload: Record, + additionalApiHeaders: Record | null, + options: object + ): Promise> { + const hasLineBreak = /-----BEGIN RSA PRIVATE KEY-----\n/.test(privateKey); + + if (!hasLineBreak) { + privateKey = privateKey.replace('-----BEGIN RSA PRIVATE KEY-----', '-----BEGIN RSA PRIVATE KEY-----\n'); + privateKey = privateKey.replace('-----END RSA PRIVATE KEY-----', '\n-----END RSA PRIVATE KEY-----'); + } try { + const token = jwt.sign(payload, privateKey, options); + + const headers = { + Authorization: `Bearer ${token}` + }; + + if (additionalApiHeaders) { + Object.assign(headers, additionalApiHeaders); + } + const tokenResponse = await axios.post( - tokenUrl, + url, {}, { - headers: { - Authorization: `Bearer ${token}`, - Accept: 'application/vnd.github.v3+json' - } + headers } ); - const rawCredentials = tokenResponse.data; - - const credentials: AppCredentials = { - type: ProviderAuthModes.App, - access_token: (rawCredentials as any)?.token, - expires_at: (rawCredentials as any)?.expires_at, - raw: rawCredentials as unknown as Record + return { success: true, error: null, response: tokenResponse.data }; + } catch (e: any) { + const errorPayload = { + message: e.message || 'Unknown error', + name: e.name || 'Error' }; - - return { success: true, error: null, response: credentials }; - } catch (e) { - const errorMessage = JSON.stringify(e, ['message', 'name'], 2); - const error = new NangoError('refresh_token_external_error', errorMessage); + const error = new NangoError('refresh_token_external_error', errorPayload); return { success: false, error, response: null }; } } @@ -734,7 +880,7 @@ class ConnectionService { tokenExpirationCondition = credentials.refresh_token && (refreshCondition || (credentials.expires_at && isTokenExpired(credentials.expires_at, template.token_expiration_buffer || 15 * 60))); - } else if (template.auth_mode === ProviderAuthModes.App) { + } else if (template.auth_mode === ProviderAuthModes.App || template.auth_mode === ProviderAuthModes.AppStore) { tokenExpirationCondition = refreshCondition || (credentials.expires_at && isTokenExpired(credentials.expires_at, template.token_expiration_buffer || 15 * 60)); } @@ -746,12 +892,21 @@ class ConnectionService { connection: Connection, providerConfig: ProviderConfig, template: ProviderTemplate - ): Promise> { + ): Promise> { if (providerClientManager.shouldUseProviderClient(providerConfig.provider)) { const rawCreds = await providerClientManager.refreshToken(template as ProviderTemplateOAuth2, providerConfig, connection); const parsedCreds = this.parseRawCredentials(rawCreds, ProviderAuthModes.OAuth2) as OAuth2Credentials; return { success: true, error: null, response: parsedCreds }; + } else if (template.auth_mode === ProviderAuthModes.AppStore) { + const { private_key } = connection.credentials as AppStoreCredentials; + const { success, error, response: credentials } = await this.getAppStoreCredentials(template, connection.connection_config, private_key); + + if (!success || !credentials) { + return { success, error, response: null }; + } + + return { success: true, error: null, response: credentials }; } else if (template.auth_mode === ProviderAuthModes.App) { const { success, error, response: credentials } = await this.getAppCredentials(template, providerConfig, connection.connection_config); @@ -767,17 +922,6 @@ class ConnectionService { } } - private async logActivity(activityLogId: number, environment_id: number, message: string): Promise { - await updateActivityLogAction(activityLogId, 'token'); - await createActivityLogMessage({ - level: 'info', - environment_id, - activity_log_id: activityLogId, - content: message, - timestamp: Date.now() - }); - } - private async logErrorActivity(activityLogId: number, environment_id: number, message: string): Promise { await updateActivityLogAction(activityLogId, 'token'); await createActivityLogMessage({ diff --git a/packages/shared/lib/services/environment.service.ts b/packages/shared/lib/services/environment.service.ts index b1e273f7e6..591478442c 100644 --- a/packages/shared/lib/services/environment.service.ts +++ b/packages/shared/lib/services/environment.service.ts @@ -133,6 +133,20 @@ class EnvironmentService { return uuid; } + async getAccountUUIDFromEnvironmentUUID(environment_uuid: string): Promise { + const result = await db.knex.withSchema(db.schema()).select('account_id').from(TABLE).where({ uuid: environment_uuid }); + + if (result == null || result.length == 0 || result[0] == null) { + return null; + } + + const accountId = result[0].account_id; + + const uuid = await accountService.getUUIDFromAccountId(accountId); + + return uuid; + } + async getAccountIdAndEnvironmentIdByPublicKey(publicKey: string): Promise<{ accountId: number; environmentId: number } | null> { if (!isCloud()) { const environmentVariables = Object.keys(process.env).filter((key) => key.startsWith('NANGO_PUBLIC_KEY_')) || []; @@ -201,6 +215,16 @@ class EnvironmentService { return { account: account[0], environment: encryptionManager.decryptEnvironment(environmentResult[0]) }; } + async getIdByUuid(uuid: string): Promise { + const result = await db.knex.withSchema(db.schema()).select('id').from(TABLE).where({ uuid }); + + if (result == null || result.length == 0 || result[0] == null) { + return null; + } + + return result[0].id; + } + async getById(id: number): Promise { try { const result = (await schema().select('*').from(TABLE).where({ id })) as unknown as Environment[]; @@ -324,16 +348,6 @@ class EnvironmentService { return db.knex.withSchema(db.schema()).from(TABLE).where({ id }).update({ webhook_url: webhookUrl }, ['id']); } - async getWebhookInfo(id: number): Promise<{ webhook_url: string; always_send_webhook: boolean } | null> { - const result = await db.knex.withSchema(db.schema()).select('webhook_url', 'always_send_webhook').from(TABLE).where({ id }); - - if (result == null || result.length == 0 || result[0] == null) { - return null; - } - - return result[0]; - } - async editHmacEnabled(hmacEnabled: boolean, id: number): Promise { return db.knex.withSchema(db.schema()).from(TABLE).where({ id }).update({ hmac_enabled: hmacEnabled }, ['id']); } diff --git a/packages/shared/lib/services/file/remote.service.ts b/packages/shared/lib/services/file/remote.service.ts index 1fe252a3c5..5c083ba60e 100644 --- a/packages/shared/lib/services/file/remote.service.ts +++ b/packages/shared/lib/services/file/remote.service.ts @@ -2,7 +2,7 @@ import type { Response } from 'express'; import { CopyObjectCommand, PutObjectCommand, GetObjectCommand, GetObjectCommandOutput, S3Client, DeleteObjectsCommand } from '@aws-sdk/client-s3'; import { Readable } from 'stream'; import archiver from 'archiver'; -import { isCloud } from '../../utils/utils.js'; +import { isCloud, isEnterprise } from '../../utils/utils.js'; import { NangoError } from '../../utils/error.js'; import errorManager, { ErrorSourceEnum } from '../../utils/error.manager.js'; import { LogActionEnum } from '../../models/Activity.js'; @@ -23,6 +23,12 @@ class RemoteFileService { publicRoute = 'integration-templates'; async upload(fileContents: string, fileName: string, environmentId: number): Promise { + if (isEnterprise()) { + const fileNameOnly = fileName.split('/').slice(-1)[0]; + localFileService.putIntegrationFile(fileNameOnly as string, fileContents, fileName.includes('dist')); + + return '_LOCAL_FILE_'; + } if (!isCloud()) { return '_LOCAL_FILE_'; } diff --git a/packages/shared/lib/services/nango-config.service.ts b/packages/shared/lib/services/nango-config.service.ts index 86ccb11e0a..d144982ae6 100644 --- a/packages/shared/lib/services/nango-config.service.ts +++ b/packages/shared/lib/services/nango-config.service.ts @@ -16,7 +16,6 @@ import type { NangoSyncEndpoint, NangoIntegrationDataV2 } from '../models/NangoConfig.js'; -import { isCloud } from '../utils/utils.js'; import type { HTTP_VERB, ServiceResponse } from '../models/Generic.js'; import { SyncType, SyncConfigType } from '../models/Sync.js'; import { NangoError } from '../utils/error.js'; @@ -87,20 +86,6 @@ export function loadStandardConfig(configData: NangoConfig, showMessages = false } } -export function getRootDir(optionalLoadLocation?: string) { - if (isCloud()) { - return './'; - } - - if (optionalLoadLocation) { - return optionalLoadLocation; - } else if (process.env['NANGO_INTEGRATIONS_FULL_PATH']) { - return `${process.env['NANGO_INTEGRATIONS_FULL_PATH']}/dist`; - } else { - return path.resolve(__dirname, '../nango-integrations/dist'); - } -} - function getFieldsForModel(modelName: string, config: NangoConfig): { name: string; type: string }[] | null { const modelFields = []; @@ -269,6 +254,7 @@ export function convertV2ConfigObject(config: NangoConfigV2, showMessages = fals for (const providerConfigKey in config.integrations) { const builtSyncs: NangoSyncConfig[] = []; const builtActions: NangoSyncConfig[] = []; + const integration: NangoV2Integration = config.integrations[providerConfigKey] as NangoV2Integration; let provider; @@ -283,6 +269,7 @@ export function convertV2ConfigObject(config: NangoConfigV2, showMessages = fals const syncs = integration['syncs'] as NangoV2Integration; const actions = integration['actions'] as NangoV2Integration; + for (const syncName in syncs) { const sync: NangoIntegrationDataV2 = syncs[syncName] as NangoIntegrationDataV2; const models: NangoSyncModel[] = []; @@ -358,6 +345,16 @@ export function convertV2ConfigObject(config: NangoConfigV2, showMessages = fals return { success: false, error, response: null }; } + let webhookSubscriptions: string[] = []; + + if (sync['webhook-subscriptions']) { + if (Array.isArray(sync['webhook-subscriptions'])) { + webhookSubscriptions = sync['webhook-subscriptions'] as string[]; + } else { + webhookSubscriptions = [sync['webhook-subscriptions'] as string]; + } + } + const syncObject: NangoSyncConfig = { name: syncName, type: SyncConfigType.SYNC, @@ -372,7 +369,8 @@ export function convertV2ConfigObject(config: NangoConfigV2, showMessages = fals returns: Array.isArray(sync.output) ? (sync?.output as string[]) : ([sync.output] as string[]), description: sync?.description || sync?.metadata?.description || '', scopes: Array.isArray(scopes) ? scopes : String(scopes)?.split(','), - endpoints + endpoints, + webhookSubscriptions }; builtSyncs.push(syncObject); @@ -390,9 +388,6 @@ export function convertV2ConfigObject(config: NangoConfigV2, showMessages = fals if (!JAVASCRIPT_PRIMITIVES.includes(model)) { allModels.push(model); } - } else { - const error = new NangoError('duplicate_model', { model, name: actionName, type: 'action' }); - return { success: false, error, response: null }; } const modelFields = getFieldsForModel(model, config) as { name: string; type: string }[]; models.push({ name: model, fields: modelFields }); diff --git a/packages/shared/lib/services/proxy.service.ts b/packages/shared/lib/services/proxy.service.ts index bd16efdb32..63cb445f67 100644 --- a/packages/shared/lib/services/proxy.service.ts +++ b/packages/shared/lib/services/proxy.service.ts @@ -70,16 +70,6 @@ class ProxyService { connection = internalConfig.connection; } - if (!isFlow) { - await createActivityLogMessage({ - level: 'debug', - environment_id, - activity_log_id: activityLogId as number, - timestamp: Date.now(), - content: 'Connection credentials found successfully' - }); - } - let token; switch (connection?.credentials?.type) { @@ -374,6 +364,13 @@ See https://docs.nango.dev/guides/proxy#proxy-requests for more information.` error?.response?.status === 429 || ['ECONNRESET', 'ETIMEDOUT', 'ECONNABORTED'].includes(error?.code as string) ) { + if (config.retryHeader) { + const type = config.retryHeader.at ? 'at' : 'after'; + const retryHeader = config.retryHeader.at ? config.retryHeader.at : config.retryHeader.after; + + return this.retryHandler(activityLogId, environment_id, error, type, retryHeader as string); + } + if (config.template.proxy && config.template.proxy.retry && (config.template.proxy?.retry?.at || config.template.proxy?.retry?.after)) { const type = config.template.proxy.retry.at ? 'at' : 'after'; const retryHeader = config.template.proxy.retry.at ? config.template.proxy.retry.at : config.template.proxy.retry.after; diff --git a/packages/shared/lib/services/sync/config/config.service.ts b/packages/shared/lib/services/sync/config/config.service.ts index 65161e8c4a..0c68bf08f5 100644 --- a/packages/shared/lib/services/sync/config/config.service.ts +++ b/packages/shared/lib/services/sync/config/config.service.ts @@ -44,8 +44,10 @@ export async function getSyncConfig(nangoConnection: NangoConnection, syncName?: const key = nangoConnection.provider_config_key; const providerConfig = nangoConfig.integrations[key] ?? {}; + const configSyncName = syncConfig.sync_name; + const fileLocation = syncConfig.file_location; - providerConfig[syncConfig.sync_name] = { + providerConfig[configSyncName] = { sync_config_id: syncConfig.id as number, runs: syncConfig.runs, type: syncConfig.type, @@ -54,7 +56,7 @@ export async function getSyncConfig(nangoConnection: NangoConnection, syncName?: track_deletes: syncConfig.track_deletes, auto_start: syncConfig.auto_start, attributes: syncConfig.attributes || {}, - fileLocation: syncConfig.file_location, + fileLocation, version: syncConfig.version as string, pre_built: syncConfig.pre_built as boolean, is_public: syncConfig.is_public as boolean, @@ -206,11 +208,15 @@ export async function getSyncConfigsByParams(environment_id: number, providerCon throw new Error('Provider config not found'); } + return getSyncConfigsByConfigId(environment_id, config.id as number, isAction); +} + +export async function getSyncConfigsByConfigId(environment_id: number, nango_config_id: number, isAction = false): Promise { const result = await schema() .from(TABLE) .where({ environment_id, - nango_config_id: config.id as number, + nango_config_id, active: true, type: isAction ? SyncConfigType.ACTION : SyncConfigType.SYNC, deleted: false @@ -504,24 +510,6 @@ export async function getSyncConfigsWithConnectionsByEnvironmentId(environment_i return result; } -export async function getSyncConfigConnections(id: number, environment_id: number): Promise<{ connection_id: string; id: string; name: string }[]> { - const result = await schema() - .select(`_nango_connections.connection_id`, '_nango_syncs.id', '_nango_syncs.name') - .from(TABLE) - .join('_nango_configs', `${TABLE}.nango_config_id`, '_nango_configs.id') - .join('_nango_connections', '_nango_connections.provider_config_key', '_nango_configs.unique_key') - .join('_nango_syncs', `_nango_syncs.name`, `${TABLE}.sync_name`) - .where({ - '_nango_configs.environment_id': environment_id, - active: true, - '_nango_configs.deleted': false, - [`${TABLE}.deleted`]: false, - [`${TABLE}.id`]: id - }); - - return result; -} - /** * Get Sync Configs By Provider Key * @desc grab all the sync configs by a provider key diff --git a/packages/shared/lib/services/sync/config/deploy.service.ts b/packages/shared/lib/services/sync/config/deploy.service.ts index aaa1755594..dfbdc7371a 100644 --- a/packages/shared/lib/services/sync/config/deploy.service.ts +++ b/packages/shared/lib/services/sync/config/deploy.service.ts @@ -35,6 +35,8 @@ const ENDPOINT_TABLE = dbNamespace + 'sync_endpoints'; const nameOfType = 'sync/action'; +type FlowWithVersion = Omit; + export async function deploy( environment_id: number, flows: IncomingFlowConfig[], @@ -65,7 +67,7 @@ export async function deploy( operation_name: LogActionEnum.SYNC_DEPLOY }; - let flowsWithVersions: Omit[] = flows.map((flow) => { + let flowsWithVersions: FlowWithVersion[] = flows.map((flow) => { const { fileBody: _fileBody, model_schema, ...rest } = flow; const modelSchema = JSON.parse(model_schema); return { ...rest, model_schema: modelSchema }; @@ -81,149 +83,24 @@ export async function deploy( const flowReturnData: SyncDeploymentResult[] = []; for (const flow of flows) { - const { - syncName, - providerConfigKey, - fileBody, - models, - runs, - version: optionalVersion, - model_schema, - type = SyncConfigType.SYNC, - track_deletes, - auto_start, - attributes = {}, - metadata = {} - } = flow; - if (type === SyncConfigType.SYNC && !runs) { - const error = new NangoError('missing_required_fields_on_deploy'); - - return { success: false, error, response: null }; - } - - if (!syncName || !providerConfigKey || !fileBody) { - const error = new NangoError('missing_required_fields_on_deploy'); - - return { success: false, error, response: null }; - } - - const config = await configService.getProviderConfig(providerConfigKey, environment_id); - - if (!config) { - const error = new NangoError('unknown_provider_config', { providerConfigKey }); - - return { success: false, error, response: null }; - } - - const previousSyncAndActionConfig = await getSyncAndActionConfigByParams(environment_id, syncName, providerConfigKey); - let bumpedVersion = ''; - - if (previousSyncAndActionConfig) { - bumpedVersion = increment(previousSyncAndActionConfig.version as string | number).toString(); - - if (debug) { - await createActivityLogMessage({ - level: 'debug', - environment_id, - activity_log_id: activityLogId as number, - timestamp: Date.now(), - content: `A previous sync config was found for ${syncName} with version ${previousSyncAndActionConfig.version}` - }); - } - - const syncs = await getSyncsByProviderConfigAndSyncName(environment_id, providerConfigKey, syncName); - for (const sync of syncs) { - if (!runs) { - continue; - } - const { success, error } = await updateSyncScheduleFrequency(sync.id as string, runs, syncName, activityLogId as number, environment_id); - - if (!success) { - return { success, error, response: null }; - } - } - } - - const version = optionalVersion || bumpedVersion || '1'; - - const jsFile = typeof fileBody === 'string' ? fileBody : fileBody?.js; - const file_location = (await remoteFileService.upload( - jsFile as string, - `${env}/account/${accountId}/environment/${environment_id}/config/${config.id}/${syncName}-v${version}.js`, - environment_id - )) as string; - - if (typeof fileBody === 'object' && fileBody?.ts) { - await remoteFileService.upload( - fileBody.ts, - `${env}/account/${accountId}/environment/${environment_id}/config/${config.id}/${syncName}.ts`, - environment_id - ); - } - - flowsWithVersions = flowsWithVersions.map((flowWithVersions) => { - if (flowWithVersions['syncName'] === syncName) { - return { ...flowWithVersions, version }; - } - return flowWithVersions; - }); - - if (!file_location) { - await updateSuccessActivityLog(activityLogId as number, false); - - await createActivityLogMessageAndEnd({ - level: 'error', - environment_id, - activity_log_id: activityLogId as number, - timestamp: Date.now(), - content: `There was an error uploading the sync file ${syncName}-v${version}.js` - }); - - // this is a platform error so throw this - throw new NangoError('file_upload_error'); - } - - const oldConfigs = await getSyncAndActionConfigsBySyncNameAndConfigId(environment_id, config.id as number, syncName); - - if (oldConfigs.length > 0) { - const ids = oldConfigs.map((oldConfig: SyncConfig) => oldConfig.id as number); - idsToMarkAsInvactive.push(...ids); + const { success, error, response } = await compileDeployInfo( + flow, + flowsWithVersions, + idsToMarkAsInvactive, + insertData, + flowReturnData, + env, + environment_id, + accountId, + activityLogId as number, + debug + ); - if (debug) { - await createActivityLogMessage({ - level: 'debug', - environment_id, - activity_log_id: activityLogId as number, - timestamp: Date.now(), - content: `Marking ${ids.length} old sync configs as inactive for ${syncName} with version ${version} as the active sync config` - }); - } + if (!success || !response) { + return { success, error, response: null }; } - insertData.push({ - environment_id, - nango_config_id: config?.id as number, - sync_name: syncName, - type, - models, - version, - track_deletes: track_deletes || false, - auto_start: auto_start === false ? false : true, - attributes, - metadata, - file_location, - runs, - active: true, - model_schema: model_schema as unknown as SyncModelSchema[], - input: flow.input || '', - sync_type: flow.sync_type - }); - - flowReturnData.push({ - ...flow, - name: syncName, - version - }); + flowsWithVersions = response as FlowWithVersion[]; } if (insertData.length === 0) { @@ -623,3 +500,166 @@ export async function deployPreBuilt( throw new NangoError('error_creating_sync_config'); } } + +async function compileDeployInfo( + flow: IncomingFlowConfig, + flowsWithVersions: FlowWithVersion[], + idsToMarkAsInvactive: number[], + insertData: SyncConfig[], + flowReturnData: SyncConfigResult['result'], + env: string, + environment_id: number, + accountId: number, + activityLogId: number, + debug: boolean +): Promise> { + const { + syncName, + providerConfigKey, + fileBody, + models, + runs, + version: optionalVersion, + model_schema, + type = SyncConfigType.SYNC, + track_deletes, + auto_start, + attributes = {}, + metadata = {} + } = flow; + if (type === SyncConfigType.SYNC && !runs) { + const error = new NangoError('missing_required_fields_on_deploy'); + + return { success: false, error, response: null }; + } + + if (!syncName || !providerConfigKey || !fileBody) { + const error = new NangoError('missing_required_fields_on_deploy'); + + return { success: false, error, response: null }; + } + + const config = await configService.getProviderConfig(providerConfigKey, environment_id); + + if (!config) { + const error = new NangoError('unknown_provider_config', { providerConfigKey }); + + return { success: false, error, response: null }; + } + + const previousSyncAndActionConfig = await getSyncAndActionConfigByParams(environment_id, syncName, providerConfigKey); + let bumpedVersion = ''; + + if (previousSyncAndActionConfig) { + bumpedVersion = increment(previousSyncAndActionConfig.version as string | number).toString(); + + if (debug) { + await createActivityLogMessage({ + level: 'debug', + environment_id, + activity_log_id: activityLogId as number, + timestamp: Date.now(), + content: `A previous sync config was found for ${syncName} with version ${previousSyncAndActionConfig.version}` + }); + } + + const syncs = await getSyncsByProviderConfigAndSyncName(environment_id, providerConfigKey, syncName); + for (const sync of syncs) { + if (!runs) { + continue; + } + const { success, error } = await updateSyncScheduleFrequency(sync.id as string, runs, syncName, activityLogId as number, environment_id); + + if (!success) { + return { success, error, response: null }; + } + } + } + + const version = optionalVersion || bumpedVersion || '1'; + + const jsFile = typeof fileBody === 'string' ? fileBody : fileBody?.js; + const file_location = (await remoteFileService.upload( + jsFile as string, + `${env}/account/${accountId}/environment/${environment_id}/config/${config.id}/${syncName}-v${version}.js`, + environment_id + )) as string; + + if (typeof fileBody === 'object' && fileBody?.ts) { + await remoteFileService.upload( + fileBody.ts, + `${env}/account/${accountId}/environment/${environment_id}/config/${config.id}/${syncName}.ts`, + environment_id + ); + } + + flowsWithVersions = flowsWithVersions.map((flowWithVersions) => { + if (flowWithVersions['syncName'] === syncName) { + return { + ...flowWithVersions, + version + } as unknown as FlowWithVersion; + } + return flowWithVersions; + }); + + if (!file_location) { + await updateSuccessActivityLog(activityLogId as number, false); + + await createActivityLogMessageAndEnd({ + level: 'error', + environment_id, + activity_log_id: activityLogId as number, + timestamp: Date.now(), + content: `There was an error uploading the sync file ${syncName}-v${version}.js` + }); + + // this is a platform error so throw this + throw new NangoError('file_upload_error'); + } + + const oldConfigs = await getSyncAndActionConfigsBySyncNameAndConfigId(environment_id, config.id as number, syncName); + + if (oldConfigs.length > 0) { + const ids = oldConfigs.map((oldConfig: SyncConfig) => oldConfig.id as number); + idsToMarkAsInvactive.push(...ids); + + if (debug) { + await createActivityLogMessage({ + level: 'debug', + environment_id, + activity_log_id: activityLogId as number, + timestamp: Date.now(), + content: `Marking ${ids.length} old sync configs as inactive for ${syncName} with version ${version} as the active sync config` + }); + } + } + + insertData.push({ + environment_id, + nango_config_id: config?.id as number, + sync_name: syncName, + type, + models, + version, + track_deletes: track_deletes || false, + auto_start: auto_start === false ? false : true, + attributes, + metadata, + file_location, + runs, + active: true, + model_schema: model_schema as unknown as SyncModelSchema[], + input: flow.input || '', + sync_type: flow.sync_type, + webhook_subscriptions: flow.webhookSubscriptions || [] + }); + + flowReturnData.push({ + ...flow, + name: syncName, + version + }); + + return { success: true, error: null, response: flowsWithVersions }; +} diff --git a/packages/shared/lib/services/sync/data/data.service.ts b/packages/shared/lib/services/sync/data/data.service.ts index ceeb5a0d37..2910db714a 100644 --- a/packages/shared/lib/services/sync/data/data.service.ts +++ b/packages/shared/lib/services/sync/data/data.service.ts @@ -1,5 +1,5 @@ import { schema } from '../../../db/database.js'; -import { verifyUniqueKeysAreUnique } from './records.service.js'; +import { getRecordsByExternalIds, verifyUniqueKeysAreUnique } from './records.service.js'; import { createActivityLogMessage } from '../../activity/activity.service.js'; import { markRecordsForDeletion, syncCreatedAtForAddedRecords, syncUpdateAtForChangedRecords } from './delete.service.js'; import type { UpsertResponse } from '../../../models/Data.js'; @@ -85,6 +85,100 @@ export async function upsert( errorMessage += `Model: ${model}, Unique Key: ${uniqueKey}, Nango Connection ID: ${nangoConnectionId}.\n`; errorMessage += `Attempted to insert/update/delete: ${responseWithoutDuplicates.length} records\n`; + if (error.code) errorMessage += `Error code: ${error.code}.\n`; + + console.log(`${errorMessage}${error}`); + + let errorDetail = ''; + switch (error.code) { + case '22001': { + errorDetail = 'Payload too big. Limit = 256MB'; + break; + } + } + if (errorDetail) errorMessage += `Info: ${errorDetail}.\n`; + + return { + success: false, + error: errorMessage + }; + } +} + +export async function updateRecord( + records: DataRecord[], + dbTable: string, + uniqueKey: string, + nangoConnectionId: number, + model: string, + activityLogId: number, + environment_id: number +): Promise { + const responseWithoutDuplicates = await removeDuplicateKey(records, uniqueKey, activityLogId, environment_id, model); + + if (!responseWithoutDuplicates || responseWithoutDuplicates.length === 0) { + return { + success: false, + error: `There are no records to upsert because there were no records that were not duplicates to insert, but there were ${records.length} records received for the "${model}" model.` + }; + } + + const updatedKeys = await getUpdatedKeys(responseWithoutDuplicates, dbTable, uniqueKey, nangoConnectionId, model); + + try { + const recordsToUpdate = []; + const rawOldRecords = await getRecordsByExternalIds(updatedKeys, nangoConnectionId, model); + + for (const rawOldRecord of rawOldRecords) { + if (!rawOldRecord) { + continue; + } + + const { record: oldRecord } = rawOldRecord; + + const record = records.find((record) => record.external_id.toString() === (oldRecord as DataRecord)?.id?.toString()); + + const newRecord = { + ...rawOldRecord, + json: { + ...oldRecord, + ...record?.json + }, + updated_at: new Date() + }; + + delete newRecord.record; + + recordsToUpdate.push(newRecord); + } + + const encryptedRecords = encryptionManager.encryptDataRecords(recordsToUpdate); + + const results = await schema() + .from(dbTable) + .insert(encryptedRecords, ['id', 'external_id']) + .onConflict(['nango_connection_id', 'external_id', 'model']) + .merge() + .returning(['id', 'external_id']); + + const affectedInternalIds = results.map((tuple) => tuple.id) as string[]; + const affectedExternalIds = results.map((tuple) => tuple.external_id) as string[]; + + return { + success: true, + summary: { + addedKeys: [], + updatedKeys, + deletedKeys: [], + affectedInternalIds, + affectedExternalIds + } + }; + } catch (error: any) { + let errorMessage = `Failed to update records to table ${dbTable}.\n`; + errorMessage += `Model: ${model}, Unique Key: ${uniqueKey}, Nango Connection ID: ${nangoConnectionId}.\n`; + errorMessage += `Attempted to update: ${responseWithoutDuplicates.length} records\n`; + if ('code' in error) errorMessage += `Error code: ${error.code}.\n`; if ('detail' in error) errorMessage += `Detail: ${error.detail}.\n`; diff --git a/packages/shared/lib/services/sync/data/records.service.ts b/packages/shared/lib/services/sync/data/records.service.ts index 474205b4df..aa7a470cb6 100644 --- a/packages/shared/lib/services/sync/data/records.service.ts +++ b/packages/shared/lib/services/sync/data/records.service.ts @@ -525,3 +525,45 @@ export async function deleteRecordsBySyncId(sync_id: string): Promise { await schema().from('_nango_sync_data_records').where({ sync_id }).del(); await schema().from('_nango_sync_data_records_deletes').where({ sync_id }).del(); } + +export async function getSingleRecord(external_id: string, nango_connection_id: number, model: string): Promise { + const encryptedRecord = await schema().from('_nango_sync_data_records').where({ + nango_connection_id, + model, + external_id + }); + + if (!encryptedRecord) { + return null; + } + + const result = encryptionManager.decryptDataRecords(encryptedRecord, 'json'); + + if (!result || result.length === 0) { + return null; + } + + return result[0] as unknown as SyncDataRecord; +} + +export async function getRecordsByExternalIds(external_ids: string[], nango_connection_id: number, model: string): Promise { + const encryptedRecords = await schema() + .from('_nango_sync_data_records') + .where({ + nango_connection_id, + model + }) + .whereIn('external_id', external_ids); + + if (!encryptedRecords) { + return []; + } + + const result = encryptionManager.decryptDataRecords(encryptedRecords, 'json'); + + if (!result || result.length === 0) { + return []; + } + + return result as unknown as SyncDataRecord[]; +} diff --git a/packages/shared/lib/services/sync/notification/webhook.service.ts b/packages/shared/lib/services/sync/notification/webhook.service.ts index 33861b33be..979003fce8 100644 --- a/packages/shared/lib/services/sync/notification/webhook.service.ts +++ b/packages/shared/lib/services/sync/notification/webhook.service.ts @@ -1,10 +1,12 @@ import axios, { AxiosError } from 'axios'; import { backOff } from 'exponential-backoff'; +import crypto from 'crypto'; import { SyncType } from '../../../models/Sync.js'; import type { NangoConnection } from '../../../models/Connection'; +import { LogActionEnum, LogLevel } from '../../../models/Activity.js'; import type { SyncResult, NangoSyncWebhookBody } from '../../../models/Sync'; import environmentService from '../../environment.service.js'; -import { createActivityLogMessage } from '../../activity/activity.service.js'; +import { createActivityLog, createActivityLogMessage, createActivityLogMessageAndEnd } from '../../activity/activity.service.js'; const RETRY_ATTEMPTS = 10; @@ -32,6 +34,15 @@ class WebhookService { return false; }; + private getSignatureHeader = (secret: string, payload: unknown): Record => { + const combinedSignature = `${secret}${JSON.stringify(payload)}`; + const createdHash = crypto.createHash('sha256').update(combinedSignature).digest('hex'); + + return { + 'X-Nango-Signature': createdHash + }; + }; + async send( nangoConnection: NangoConnection, syncName: string, @@ -42,7 +53,7 @@ class WebhookService { activityLogId: number, environment_id: number ) { - const webhookInfo = await environmentService.getWebhookInfo(nangoConnection.environment_id); + const webhookInfo = await environmentService.getById(nangoConnection.environment_id); if (!webhookInfo || !webhookInfo.webhook_url) { return; @@ -50,12 +61,15 @@ class WebhookService { const { webhook_url: webhookUrl, always_send_webhook: alwaysSendWebhook } = webhookInfo; - if (!alwaysSendWebhook && responseResults.added === 0 && responseResults.updated === 0 && responseResults.deleted === 0) { + const noChanges = + responseResults.added === 0 && responseResults.updated === 0 && (responseResults.deleted === 0 || responseResults.deleted === undefined); + + if (!alwaysSendWebhook && noChanges) { await createActivityLogMessage({ level: 'info', environment_id, activity_log_id: activityLogId, - content: `There were no added, updated, or deleted results so a webhook with changes was not sent.`, + content: `There were no added, updated, or deleted results. No webhook sent, as per your environment settings.`, timestamp: Date.now() }); @@ -63,6 +77,7 @@ class WebhookService { } const body: NangoSyncWebhookBody = { + from: 'nango', connectionId: nangoConnection.connection_id, providerConfigKey: nangoConnection.provider_config_key, syncName, @@ -84,10 +99,16 @@ class WebhookService { body.responseResults.deleted = responseResults.deleted; } + const endingMessage = noChanges + ? 'with no data changes as per your environment settings.' + : `with the following data: ${JSON.stringify(body, null, 2)}`; + try { + const headers = this.getSignatureHeader(webhookInfo.secret_key, body); + const response = await backOff( () => { - return axios.post(webhookUrl, body); + return axios.post(webhookUrl, body, { headers }); }, { numOfAttempts: RETRY_ATTEMPTS, retry: this.retry.bind(this, activityLogId, environment_id) } ); @@ -97,9 +118,7 @@ class WebhookService { level: 'info', environment_id, activity_log_id: activityLogId, - content: `Webhook sent successfully and received with a ${ - response.status - } response code to ${webhookUrl} with the following data: ${JSON.stringify(body, null, 2)}`, + content: `Webhook sent successfully and received with a ${response.status} response code to ${webhookUrl} ${endingMessage}`, timestamp: Date.now() }); } else { @@ -107,9 +126,7 @@ class WebhookService { level: 'error', environment_id, activity_log_id: activityLogId, - content: `Webhook sent successfully to ${webhookUrl} with the following data: ${JSON.stringify(body, null, 2)} but received a ${ - response.status - } response code. Please send a 200 on successful receipt.`, + content: `Webhook sent successfully to ${webhookUrl} ${endingMessage} but received a ${response.status} response code. Please send a 2xx on successful receipt.`, timestamp: Date.now() }); } @@ -125,6 +142,79 @@ class WebhookService { }); } } + + async forward(environment_id: number, providerConfigKey: string, provider: string, payload: Record | null) { + const webhookInfo = await environmentService.getById(environment_id); + + if (!webhookInfo || !webhookInfo.webhook_url) { + return; + } + + const { webhook_url: webhookUrl } = webhookInfo; + + const log = { + level: 'info' as LogLevel, + success: true, + action: LogActionEnum.WEBHOOK, + start: Date.now(), + end: Date.now(), + timestamp: Date.now(), + connection_id: '', + provider_config_key: providerConfigKey, + provider: provider, + environment_id: environment_id + }; + + const activityLogId = await createActivityLog(log); + + const body = { + from: provider, + payload: payload + }; + + const headers = this.getSignatureHeader(webhookInfo.secret_key, body); + + try { + const response = await backOff( + () => { + return axios.post(webhookUrl, body, { headers }); + }, + { numOfAttempts: RETRY_ATTEMPTS, retry: this.retry.bind(this, activityLogId as number, environment_id) } + ); + + if (response.status >= 200 && response.status < 300) { + await createActivityLogMessageAndEnd({ + level: 'info', + environment_id, + activity_log_id: activityLogId as number, + content: `Webhook forward was sent successfully and received with a ${ + response.status + } response code to ${webhookUrl} with the following data: ${JSON.stringify(body, null, 2)}`, + timestamp: Date.now() + }); + } else { + await createActivityLogMessageAndEnd({ + level: 'error', + environment_id, + activity_log_id: activityLogId as number, + content: `Webhook forward was sent successfully to ${webhookUrl} with the following data: ${JSON.stringify(body, null, 2)} but received a ${ + response.status + } response code. Please send a 200 on successful receipt.`, + timestamp: Date.now() + }); + } + } catch (e) { + const errorMessage = JSON.stringify(e, ['message', 'name', 'stack'], 2); + + await createActivityLogMessageAndEnd({ + level: 'error', + environment_id, + activity_log_id: activityLogId as number, + content: `Webhook forward failed to send to ${webhookUrl}. The error was: ${errorMessage}`, + timestamp: Date.now() + }); + } + } } export default new WebhookService(); diff --git a/packages/shared/lib/services/sync/run.service.ts b/packages/shared/lib/services/sync/run.service.ts index 47ebfb6c7f..dc2c547c10 100644 --- a/packages/shared/lib/services/sync/run.service.ts +++ b/packages/shared/lib/services/sync/run.service.ts @@ -14,7 +14,6 @@ import { getDeletedKeys, takeSnapshot, clearOldRecords, syncUpdateAtForDeletedRe import environmentService from '../environment.service.js'; import slackNotificationService from './notification/slack.service.js'; import webhookService from './notification/webhook.service.js'; -import { NangoSync } from '../../sdk/sync.js'; import { isCloud, getApiUrl, JAVASCRIPT_PRIMITIVES } from '../../utils/utils.js'; import errorManager, { ErrorSourceEnum } from '../../utils/error.manager.js'; import { NangoError } from '../../utils/error.js'; @@ -29,6 +28,8 @@ interface SyncRunConfig { integrationService: IntegrationServiceInterface; writeToDb: boolean; isAction?: boolean; + isInvokedImmediately?: boolean; + isWebhook?: boolean; nangoConnection: NangoConnection; syncName: string; syncType: SyncType; @@ -52,6 +53,7 @@ export default class SyncRun { integrationService: IntegrationServiceInterface; writeToDb: boolean; isAction: boolean; + isInvokedImmediately: boolean; nangoConnection: NangoConnection; syncName: string; syncType: SyncType; @@ -68,14 +70,17 @@ export default class SyncRun { stubbedMetadata?: Metadata | undefined = undefined; temporalContext?: Context; + isWebhook: boolean; constructor(config: SyncRunConfig) { this.integrationService = config.integrationService; this.writeToDb = config.writeToDb; this.isAction = config.isAction || false; + this.isWebhook = config.isWebhook || false; this.nangoConnection = config.nangoConnection; this.syncName = config.syncName; this.syncType = config.syncType; + this.isInvokedImmediately = Boolean(config.isAction || config.isWebhook); if (config.syncId) { this.syncId = config.syncId; @@ -150,7 +155,7 @@ export default class SyncRun { console.error(message); } - const errorType = this.isAction ? 'action_script_failure' : 'sync_script_failure'; + const errorType = this.determineErrorType(); return { success: false, error: new NangoError(errorType, message, 404), response: false }; } @@ -160,7 +165,7 @@ export default class SyncRun { if (!integrations[this.nangoConnection.provider_config_key] && !this.writeToDb) { const message = `The connection you provided which applies to integration "${this.nangoConnection.provider_config_key}" does not match any integration in the ${nangoConfigFile}`; - const errorType = this.isAction ? 'action_script_failure' : 'sync_script_failure'; + const errorType = this.determineErrorType(); return { success: false, error: new NangoError(errorType, message, 404), response: false }; } @@ -175,7 +180,7 @@ export default class SyncRun { if (!environment && !bypassEnvironment) { const message = `No environment was found for ${this.nangoConnection.environment_id}. The sync cannot continue without a valid environment`; await this.reportFailureForResults(message); - const errorType = this.isAction ? 'action_script_failure' : 'sync_script_failure'; + const errorType = this.determineErrorType(); return { success: false, error: new NangoError(errorType, message, 404), response: false }; } @@ -224,7 +229,7 @@ export default class SyncRun { const message = `Integration was attempted to run for ${this.syncName} but no integration file was found at ${integrationFilePath}.`; await this.reportFailureForResults(message); - const errorType = this.isAction ? 'action_script_failure' : 'sync_script_failure'; + const errorType = this.determineErrorType(); return { success: false, error: new NangoError(errorType, message, 404), response: false }; } @@ -232,7 +237,7 @@ export default class SyncRun { let lastSyncDate: Date | null | undefined = null; - if (!this.isAction) { + if (!this.isInvokedImmediately) { if (!this.writeToDb) { lastSyncDate = optionalLastSyncDate; } else { @@ -258,8 +263,9 @@ export default class SyncRun { } } - const nango = new NangoSync({ + const nangoProps = { host: optionalHost || getApiUrl(), + accountId: environment?.account_id as number, connectionId: String(this.nangoConnection?.connection_id), environmentId: this.nangoConnection?.environment_id as number, providerConfigKey: String(this.nangoConnection?.provider_config_key), @@ -274,7 +280,7 @@ export default class SyncRun { track_deletes: trackDeletes as boolean, logMessages: this.logMessages, stubbedMetadata: this.stubbedMetadata - }); + }; if (this.debug) { const content = `Last sync date is ${lastSyncDate}`; @@ -306,11 +312,12 @@ export default class SyncRun { (this.syncId as string) || `${this.syncName}-${this.nangoConnection.environment_id}-${this.nangoConnection.provider_config_key}-${this.nangoConnection.connection_id}`, this.activityLogId as number, - nango, + nangoProps, syncData, this.nangoConnection.environment_id, this.writeToDb, - this.isAction, + this.isInvokedImmediately, + this.isWebhook, this.loadLocation, this.input, this.temporalContext @@ -319,7 +326,7 @@ export default class SyncRun { if (!success || (error && userDefinedResults === null)) { const message = `The integration was run but there was a problem in retrieving the results from the script "${this.syncName}"${ syncData?.version ? ` version: ${syncData.version}` : '' - }.`; + }`; await this.reportFailureForResults(message); return { success: false, error, response: false }; @@ -459,7 +466,7 @@ export default class SyncRun { const message = `There was a problem upserting the data for ${this.syncName} and the model ${model} with the error message: ${upsertResult?.error}`; await this.reportFailureForResults(message); - const errorType = this.isAction ? 'action_script_failure' : 'sync_script_failure'; + const errorType = this.determineErrorType(); return { success: false, error: new NangoError(errorType, message), response: result }; } @@ -479,7 +486,7 @@ export default class SyncRun { } sync did not complete successfully and has the following error: ${errorMessage}` ); - const errorType = this.isAction ? 'action_script_failure' : 'sync_script_failure'; + const errorType = this.determineErrorType(); return { success: false, error: new NangoError(errorType, errorMessage), response: result }; } @@ -491,12 +498,12 @@ export default class SyncRun { async finishSync(models: string[], syncStartDate: Date, version: string, totalRunTime: number, trackDeletes?: boolean): Promise { let i = 0; for (const model of models) { - if (trackDeletes) { + if (!this.isWebhook && trackDeletes) { await clearOldRecords(this.nangoConnection?.id as number, model); } const deletedKeys = trackDeletes ? await getDeletedKeys('_nango_sync_data_records', 'external_id', this.nangoConnection.id as number, model) : []; - if (trackDeletes) { + if (!this.isWebhook && trackDeletes) { await syncUpdateAtForDeletedRecords(this.nangoConnection.id as number, model, 'external_id', deletedKeys); } @@ -536,19 +543,21 @@ export default class SyncRun { // any changes while the sync is running // but if the sync date was set by the user in the integration script, // then don't override it - const override = false; - await setLastSyncDate(this.syncId as string, syncStartDate, override); - await slackNotificationService.removeFailingConnection( - this.nangoConnection, - this.syncName, - this.syncType, - this.activityLogId as number, - this.nangoConnection.environment_id, - this.provider as string - ); + if (!this.isWebhook) { + const override = false; + await setLastSyncDate(this.syncId as string, syncStartDate, override); + await slackNotificationService.removeFailingConnection( + this.nangoConnection, + this.syncName, + this.syncType, + this.activityLogId as number, + this.nangoConnection.environment_id, + this.provider as string + ); + } } - if (trackDeletes) { + if (!this.isWebhook && trackDeletes) { await takeSnapshot(this.nangoConnection?.id as number, model); } @@ -662,14 +671,16 @@ export default class SyncRun { return; } - await slackNotificationService.reportFailure( - this.nangoConnection, - this.syncName, - this.syncType, - this.activityLogId as number, - this.nangoConnection.environment_id, - this.provider as string - ); + if (!this.isWebhook) { + await slackNotificationService.reportFailure( + this.nangoConnection, + this.syncName, + this.syncType, + this.activityLogId as number, + this.nangoConnection.environment_id, + this.provider as string + ); + } if (!this.activityLogId || !this.syncJobId) { console.error(content); @@ -717,4 +728,14 @@ export default class SyncRun { `syncId:${this.syncId}` ); } + + private determineErrorType(): string { + if (this.isAction) { + return 'action_script_failure'; + } else if (this.isWebhook) { + return 'webhook_script_failure'; + } else { + return 'sync_script_failure'; + } + } } diff --git a/packages/shared/lib/services/sync/sync.service.ts b/packages/shared/lib/services/sync/sync.service.ts index ec76f71761..ac4269e688 100644 --- a/packages/shared/lib/services/sync/sync.service.ts +++ b/packages/shared/lib/services/sync/sync.service.ts @@ -450,6 +450,26 @@ export const findSyncByConnections = async (connectionIds: number[], sync_name: return []; }; +export const getSyncsByConnectionIdsAndEnvironmentIdAndSyncName = async (connectionIds: string[], environmentId: number, syncName: string): Promise => { + const results = await schema() + .select(`${TABLE}.id`) + .from(TABLE) + .join('_nango_connections', '_nango_connections.id', `${TABLE}.nango_connection_id`) + .whereIn('_nango_connections.connection_id', connectionIds) + .andWhere({ + name: syncName, + environment_id: environmentId, + [`${TABLE}.deleted`]: false, + [`_nango_connections.deleted`]: false + }); + + if (Array.isArray(results) && results.length > 0) { + return results; + } + + return []; +}; + export const getAndReconcileDifferences = async ( environmentId: number, syncs: IncomingFlowConfig[], @@ -500,8 +520,9 @@ export const getAndReconcileDifferences = async ( * When we come back here and performAction is true, the sync would have been created so exists will be true and we'll only create * the sync if there are connections */ + let syncsByConnection: Sync[] = []; if (exists && connections.length > 0) { - const syncsByConnection = await findSyncByConnections( + syncsByConnection = await findSyncByConnections( connections.map((connection) => connection.id as number), syncName ); @@ -528,6 +549,26 @@ export const getAndReconcileDifferences = async ( syncsToCreate.push({ connections, syncName, sync, providerConfigKey, environmentId }); } } + + // in some cases syncs are missing so let's also create them if missing + if (performAction && syncsByConnection.length !== 0 && syncsByConnection.length !== connections.length) { + const missingConnections = connections.filter((connection) => { + return !syncsByConnection.find((sync) => sync.nango_connection_id === connection.id); + }); + + if (missingConnections.length > 0) { + if (debug && activityLogId) { + await createActivityLogMessage({ + level: 'debug', + environment_id: environmentId, + activity_log_id: activityLogId as number, + timestamp: Date.now(), + content: `Creating sync ${syncName} for ${providerConfigKey} with ${missingConnections.length} connections` + }); + } + syncsToCreate.push({ connections: missingConnections, syncName, sync, providerConfigKey, environmentId }); + } + } } if (syncsToCreate.length > 0) { diff --git a/packages/shared/lib/utils/analytics.ts b/packages/shared/lib/utils/analytics.ts index 95e8b10e6b..33f9df1abe 100644 --- a/packages/shared/lib/utils/analytics.ts +++ b/packages/shared/lib/utils/analytics.ts @@ -26,6 +26,7 @@ export enum AnalyticsTypes { ONBOARDING_4 = 'onboarding:step_5_ship_first_integration', PRE_API_KEY_AUTH = 'server:pre_api_key_auth', PRE_APP_AUTH = 'server:pre_appauth', + PRE_APP_STORE_AUTH = 'server:pre_app_store_auth', PRE_BASIC_API_KEY_AUTH = 'server:pre_basic_api_key_auth', PRE_UNAUTH = 'server:pre_unauth', PRE_WS_OAUTH = 'server:pre_ws_oauth', diff --git a/packages/shared/lib/utils/error.manager.ts b/packages/shared/lib/utils/error.manager.ts index f3137d545c..d395dc809c 100644 --- a/packages/shared/lib/utils/error.manager.ts +++ b/packages/shared/lib/utils/error.manager.ts @@ -111,7 +111,11 @@ class ErrorManager { public errResFromNangoErr(res: Response, err: NangoError | null) { if (err) { - res.status(err.status).send({ error: err.message, type: err.type, payload: err.payload }); + if (!err.message) { + res.status(err.status).send({ type: err.type, payload: err.payload }); + } else { + res.status(err.status).send({ error: err.message, type: err.type, payload: err.payload }); + } } } diff --git a/packages/shared/lib/utils/error.ts b/packages/shared/lib/utils/error.ts index 213cf17643..d1e1732aa7 100644 --- a/packages/shared/lib/utils/error.ts +++ b/packages/shared/lib/utils/error.ts @@ -135,6 +135,21 @@ export class NangoError extends Error { this.message = `Missing param 'api_key'.`; break; + case 'missing_private_key': + this.status = 400; + this.message = `Missing param 'missing_private_key'.`; + break; + + case 'missing_private_key_id': + this.status = 400; + this.message = `Missing param 'private_key_id'.`; + break; + + case 'missing_issuer_id': + this.status = 400; + this.message = `Missing param 'missing_issuer_id'.`; + break; + case 'missing_app_id': this.status = 400; this.message = `Missing param 'app_id'.`; @@ -444,11 +459,20 @@ export class NangoError extends Error { this.message = `The action script failed with an error: ${this.payload}`; break; + case 'webhook_script_failure': + this.message = `The webhook script failed with an error: ${this.payload}`; + break; + case 'pass_through_error': this.status = 400; this.message = `${this.payload}`; break; + case 'action_script_runtime_error': + this.status = 500; + this.message = ''; + break; + default: this.status = 500; this.type = 'unhandled_' + type; diff --git a/packages/shared/lib/utils/metrics.manager.ts b/packages/shared/lib/utils/metrics.manager.ts index 3431e0e40e..aa57992100 100644 --- a/packages/shared/lib/utils/metrics.manager.ts +++ b/packages/shared/lib/utils/metrics.manager.ts @@ -24,7 +24,15 @@ export enum MetricTypes { SYNC_GET_RECORDS_INCLUDE_METADATA_USED = 'sync_get_records_include_metadata_used', SYNC_GET_RECORDS_DEPRECATED_METHOD_USED = 'sync_get_records_deprecated_method_used', SYNC_GET_RECORDS_QUERY_TIMEOUT = 'sync_get_records_query_timeout', - FLOW_JOB_TIMEOUT_FAILURE = 'flow_job_failure' + FLOW_JOB_TIMEOUT_FAILURE = 'flow_job_failure', + POST_CONNECTION_SCRIPT_FAILURE = 'post_connection_script_failure', + INCOMING_WEBHOOK_RECEIVED = 'incoming_webhook_received', + INCOMING_WEBHOOK_ISSUE_WRONG_CONNECTION_IDENTIFIER = 'incoming_webhook_issue_wrong_connection_identifier', + INCOMING_WEBHOOK_ISSUE_CONNECTION_NOT_FOUND = 'incoming_webhook_issue_connection_not_found', + INCOMING_WEBHOOK_ISSUE_WEBHOOK_SUBSCRIPTION_NOT_FOUND_REGISTERED = 'incoming_webhook_issue_webhook_subscription_not_found_registered', + INCOMING_WEBHOOK_PROCESSED_SUCCESSFULLY = 'incoming_webhook_processed_successfully', + INCOMING_WEBHOOK_FAILED_PROCESSING = 'incoming_webhook_failed_processing', + RENDER_RUNNER_FAILURE_RESOLVED_BACK_TO_LOCAL = 'render_runner_failure_resolved_back_to_local' } class MetricsManager { diff --git a/packages/shared/lib/utils/utils.ts b/packages/shared/lib/utils/utils.ts index d878c0739e..05d077710c 100644 --- a/packages/shared/lib/utils/utils.ts +++ b/packages/shared/lib/utils/utils.ts @@ -45,6 +45,10 @@ export function isCloud() { return process.env['NANGO_CLOUD']?.toLowerCase() === 'true'; } +export function isEnterprise() { + return process.env['NANGO_ENTERPRISE']?.toLowerCase() === 'true'; +} + export function isStaging() { return process.env['NODE_ENV'] === NodeEnv.Staging; } @@ -176,6 +180,11 @@ export function getGlobalAppCallbackUrl() { return baseUrl + '/app-auth/connect'; } +export function getGlobalWebhookReceiveUrl() { + const baseUrl = process.env['NANGO_SERVER_URL'] || getLocalOAuthCallbackUrlBaseUrl(); + return baseUrl + '/webhook'; +} + export async function getOauthCallbackUrl(environmentId?: number) { const globalCallbackUrl = getGlobalOAuthCallbackUrl(); diff --git a/packages/shared/package.json b/packages/shared/package.json index e60225c816..5deca010b0 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@nangohq/shared", - "version": "0.36.52", + "version": "0.36.78", "description": "Nango's shared components.", "type": "module", "main": "dist/lib/index.js", @@ -19,7 +19,7 @@ "@aws-sdk/client-s3": "^3.348.0", "@datadog/datadog-api-client": "^1.16.0", "@hapi/boom": "^10.0.1", - "@nangohq/node": "0.36.52", + "@nangohq/node": "0.36.78", "@sentry/node": "^7.37.2", "@temporalio/client": "^1.5.2", "@types/fs-extra": "^11.0.1", @@ -48,7 +48,6 @@ "rimraf": "^5.0.1", "semver": "^7.5.4", "simple-oauth2": "^5.0.0", - "ts-node": "^10.9.1", "uuid": "^9.0.0", "winston": "^3.8.2", "winston-daily-rotate-file": "^4.7.1" diff --git a/packages/shared/providers.yaml b/packages/shared/providers.yaml index 43a3c1cca1..0eff2ffc10 100644 --- a/packages/shared/providers.yaml +++ b/packages/shared/providers.yaml @@ -62,6 +62,17 @@ amplitude: auth_mode: BASIC proxy: base_url: https://amplitude.com +apollo: + auth_mode: API_KEY + proxy: + base_url: https://app.apollo.io/api + query: + api_key: ${apiKey} +apple-app-store: + auth_mode: APP_STORE + token_url: https://api.appstoreconnect.apple.com/v1/apps + authorization_params: + audience: appstoreconnect-v1 asana: auth_mode: OAUTH2 authorization_url: https://app.asana.com/-/oauth_authorize @@ -234,6 +245,12 @@ close: proxy: base_url: https://api.close.com/api docs: https://developer.close.com/ +coda: + auth_mode: API_KEY + proxy: + base_url: https://coda.io/apis/v1 + headers: + Authorization: Bearer ${apiKey} confluence: alias: jira contentstack: @@ -574,6 +591,10 @@ hubspot: auth_mode: OAUTH2 authorization_url: https://app.hubspot.com/oauth/authorize token_url: https://api.hubapi.com/oauth/v1/token + connection_configuration: + - portalId + post_connection_script: hubspot-post-connection + webhook_routing_script: hubspot-webhook-routing proxy: base_url: https://api.hubapi.com decompress: true @@ -609,6 +630,9 @@ jira: authorization_params: audience: api.atlassian.com prompt: consent + connection_configuration: + - cloudID + - accountId proxy: base_url: https://api.atlassian.com paginate: @@ -617,6 +641,8 @@ jira: limit_name_in_request: limit response_path: results link_path_in_response_body: _links.next + post_connection_script: jira-post-connection + webhook_routing_script: jira-webhook-routing keap: auth_mode: OAUTH2 authorization_url: https://accounts.infusionsoft.com/app/oauth/authorize @@ -777,6 +803,8 @@ notion: authorization_method: header body_format: json proxy: + retry: + after: 'Retry-After' base_url: https://api.notion.com headers: 'Notion-Version': '2022-06-28' @@ -1065,6 +1093,7 @@ slack: - incoming_webhook.channel - incoming_webhook.channel_id - bot_user_id + - team.id proxy: base_url: https://slack.com/api paginate: @@ -1073,6 +1102,7 @@ slack: cursor_name_in_request: cursor limit_name_in_request: limit docs: https://api.slack.com/apis + webhook_routing_script: slack-webhook-routing smugmug: auth_mode: OAUTH1 request_url: https://api.smugmug.com/services/oauth/1.0a/getRequestToken @@ -1167,6 +1197,13 @@ stripe-express: - stripe_user_id proxy: base_url: https://api.stripe.com +stripe-app: + auth_mode: OAUTH2 + authorization_url: https://marketplace.stripe.com/oauth/v2/${connectionConfig.appDomain}/authorize + token_url: https://api.stripe.com/v1/oauth/token + disable_pkce: true + proxy: + base_url: https://api.stripe.com survey-monkey: auth_mode: OAUTH2 authorization_url: https://api.surveymonkey.com/oauth/authorize @@ -1394,6 +1431,11 @@ zoho: access_type: offline proxy: base_url: https://www.zohoapis.${connectionConfig.extension} + paginate: + type: offset + response_path: data + offset_name_in_request: page + limit_name_in_request: per_page zoho-books: alias: zoho zoho-crm: diff --git a/packages/webapp/.env.enterprise b/packages/webapp/.env.enterprise new file mode 100644 index 0000000000..a6d9e96c69 --- /dev/null +++ b/packages/webapp/.env.enterprise @@ -0,0 +1,2 @@ +REACT_APP_ENV=enterprise + diff --git a/packages/webapp/package-lock.json b/packages/webapp/package-lock.json index ad29aad52c..22f2d5edbf 100644 --- a/packages/webapp/package-lock.json +++ b/packages/webapp/package-lock.json @@ -1,19 +1,19 @@ { "name": "webapp", - "version": "0.36.52", + "version": "0.36.78", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "webapp", - "version": "0.36.52", + "version": "0.36.78", "dependencies": { "@geist-ui/core": "^2.3.8", "@geist-ui/icons": "^1.0.2", "@headlessui/react": "^1.7.12", "@heroicons/react": "^2.0.18", "@mantine/prism": "^5.10.5", - "@nangohq/frontend": "0.36.52", + "@nangohq/frontend": "0.36.78", "@sentry/react": "^7.83.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", @@ -51,9 +51,9 @@ } }, "node_modules/@adobe/css-tools": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.1.tgz", - "integrity": "sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==" + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz", + "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==" }, "node_modules/@ampproject/remapping": { "version": "2.2.0", @@ -3120,9 +3120,9 @@ } }, "node_modules/@nangohq/frontend": { - "version": "0.36.52", - "resolved": "https://registry.npmjs.org/@nangohq/frontend/-/frontend-0.36.52.tgz", - "integrity": "sha512-LPv5c7bOf779grT9fyXJizOZSDRkHTtvedgp+1DA7wtlIYHcHY2Jf/AR7oR/SZnFP7NaO36AueEjeJAw7PdZbw==" + "version": "0.36.78", + "resolved": "https://registry.npmjs.org/@nangohq/frontend/-/frontend-0.36.78.tgz", + "integrity": "sha512-mC/aHD+EzsJFG7Qg+OXvOp7oeHy7A1OhzcpAIYpUhB6D3FOpYngp2beqbeKOzz69Gjbgwie40whfPFOluy12tg==" }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", @@ -16779,9 +16779,9 @@ }, "dependencies": { "@adobe/css-tools": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.1.tgz", - "integrity": "sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==" + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz", + "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==" }, "@ampproject/remapping": { "version": "2.2.0", @@ -18895,9 +18895,9 @@ "requires": {} }, "@nangohq/frontend": { - "version": "0.36.52", - "resolved": "https://registry.npmjs.org/@nangohq/frontend/-/frontend-0.36.52.tgz", - "integrity": "sha512-LPv5c7bOf779grT9fyXJizOZSDRkHTtvedgp+1DA7wtlIYHcHY2Jf/AR7oR/SZnFP7NaO36AueEjeJAw7PdZbw==" + "version": "0.36.78", + "resolved": "https://registry.npmjs.org/@nangohq/frontend/-/frontend-0.36.78.tgz", + "integrity": "sha512-mC/aHD+EzsJFG7Qg+OXvOp7oeHy7A1OhzcpAIYpUhB6D3FOpYngp2beqbeKOzz69Gjbgwie40whfPFOluy12tg==" }, "@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", diff --git a/packages/webapp/package.json b/packages/webapp/package.json index 3abc84cded..549e0ca9a4 100644 --- a/packages/webapp/package.json +++ b/packages/webapp/package.json @@ -1,6 +1,6 @@ { "name": "webapp", - "version": "0.36.52", + "version": "0.36.78", "private": true, "dependencies": { "@geist-ui/core": "^2.3.8", @@ -8,7 +8,7 @@ "@headlessui/react": "^1.7.12", "@heroicons/react": "^2.0.18", "@mantine/prism": "^5.10.5", - "@nangohq/frontend": "0.36.52", + "@nangohq/frontend": "0.36.78", "@sentry/react": "^7.83.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", @@ -42,6 +42,7 @@ "start:staging": "env-cmd -f .env.staging npm run start", "start:prod": "env-cmd -f .env.prod npm run start", "build:hosted": "env-cmd -f .env.hosted npm run build", + "build:enterprise": "env-cmd -f .env.enterprise npm run build", "build:staging": "env-cmd -f .env.staging npm run build", "build:prod": "env-cmd -f .env.prod npm run build" }, diff --git a/packages/webapp/public/images/template-logos/apollo.svg b/packages/webapp/public/images/template-logos/apollo.svg new file mode 100644 index 0000000000..b5a16df014 --- /dev/null +++ b/packages/webapp/public/images/template-logos/apollo.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/webapp/public/images/template-logos/coda.svg b/packages/webapp/public/images/template-logos/coda.svg new file mode 100644 index 0000000000..b63a9d459a --- /dev/null +++ b/packages/webapp/public/images/template-logos/coda.svg @@ -0,0 +1,7 @@ + + + Coda + + + + \ No newline at end of file diff --git a/packages/webapp/src/App.tsx b/packages/webapp/src/App.tsx index 48701290b2..6e3031ca6f 100644 --- a/packages/webapp/src/App.tsx +++ b/packages/webapp/src/App.tsx @@ -32,7 +32,7 @@ import AccountSettings from './pages/AccountSettings'; import UserSettings from './pages/UserSettings'; import { ToastContainer } from 'react-toastify'; import 'react-toastify/dist/ReactToastify.css'; -import { isCloud } from './utils/utils'; +import { isCloud, isEnterprise } from './utils/utils'; import { useStore } from './store'; Sentry.init({ @@ -113,7 +113,7 @@ const App = () => { }> } /> - {isCloud() && ( + {(isCloud() || isEnterprise()) && ( <> } /> } /> diff --git a/packages/webapp/src/components/PrivateRoute.tsx b/packages/webapp/src/components/PrivateRoute.tsx index c9f3962ab1..e878ef9ee7 100644 --- a/packages/webapp/src/components/PrivateRoute.tsx +++ b/packages/webapp/src/components/PrivateRoute.tsx @@ -1,9 +1,9 @@ import { Outlet, Navigate } from 'react-router-dom'; -import { isCloud } from '../utils/utils'; +import { isCloud, isEnterprise } from '../utils/utils'; import { isSignedIn } from '../utils/user'; const PrivateRoute = (_: any) => { - return <>{!isCloud() || isSignedIn() ? : }; + return <>{(!isCloud() && !isEnterprise()) || isSignedIn() ? : }; }; export default PrivateRoute; diff --git a/packages/webapp/src/components/TopNavBar.tsx b/packages/webapp/src/components/TopNavBar.tsx index 1f867a3c37..904e139f7d 100644 --- a/packages/webapp/src/components/TopNavBar.tsx +++ b/packages/webapp/src/components/TopNavBar.tsx @@ -1,5 +1,5 @@ import { Book, Slack, Github } from '@geist-ui/icons'; -import { isCloud } from '../utils/utils'; +import { isCloud, isEnterprise } from '../utils/utils'; import { useSignout } from '../utils/user'; export default function NavBar() { @@ -43,7 +43,7 @@ export default function NavBar() {

Github

- {isCloud() && ( + {(isCloud() || isEnterprise()) && (