From 4080f55f6e3c472f933d1f54f8540d808bd4af93 Mon Sep 17 00:00:00 2001 From: parthy007 Date: Tue, 18 Mar 2025 13:46:48 +0530 Subject: [PATCH 01/19] Fix: Connection for Salesforce, Google sheet, Slack , Grpc, Zendesk & Woocommerce Fetch the auth code using correct method in request Get the plugin object correctly for reloading Fix woocommerce operation rendering Resolve promise correctly Pass plugin_id as prop Resolve plugin saving issue with caching tokens Add json-message in query correctly Use auth code once without cache --- frontend/src/_components/Slack.jsx | 14 ++- frontend/src/_components/Zendesk.jsx | 15 ++- frontend/src/_services/datasource.service.js | 2 +- plugins/packages/grpc/lib/index.ts | 11 +- plugins/packages/grpc/lib/types.ts | 1 + plugins/packages/woocommerce/.gitignore | 3 +- .../packages/woocommerce/lib/operations.json | 105 ++++++++++++++++++ server/src/modules/data-sources/controller.ts | 2 +- .../src/modules/data-sources/util.service.ts | 19 ++-- server/src/modules/plugins/service.ts | 2 +- 10 files changed, 152 insertions(+), 22 deletions(-) create mode 100644 plugins/packages/woocommerce/lib/operations.json diff --git a/frontend/src/_components/Slack.jsx b/frontend/src/_components/Slack.jsx index d986bccd5f..1301572357 100644 --- a/frontend/src/_components/Slack.jsx +++ b/frontend/src/_components/Slack.jsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import { datasourceService } from '@/_services'; import { useTranslation } from 'react-i18next'; import { toast } from 'react-hot-toast'; @@ -15,8 +15,16 @@ const Slack = ({ isDisabled, }) => { const [authStatus, setAuthStatus] = useState(null); - const whiteLabelText = retrieveWhiteLabelText(); + const [whiteLabelText, setWhiteLabelText] = useState(''); + const plugin_id = selectedDataSource?.plugin?.id; const { t } = useTranslation(); + useEffect(() => { + async function fetchLabel() { + const text = await retrieveWhiteLabelText(); + setWhiteLabelText(text); + } + fetchLabel(); + }, []); function authGoogle() { const provider = 'slack'; @@ -29,7 +37,7 @@ const Slack = ({ } datasourceService - .fetchOauth2BaseUrl(provider) + .fetchOauth2BaseUrl(provider, plugin_id, {}) .then((data) => { const authUrl = `${data.url}&scope=${scope}&access_type=offline&prompt=select_account`; diff --git a/frontend/src/_components/Zendesk.jsx b/frontend/src/_components/Zendesk.jsx index 7d03035152..c61927c52e 100644 --- a/frontend/src/_components/Zendesk.jsx +++ b/frontend/src/_components/Zendesk.jsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import { toast } from 'react-hot-toast'; import { useTranslation } from 'react-i18next'; import Input from '@/_ui/Input'; @@ -18,17 +18,26 @@ const Zendesk = ({ isDisabled, optionsChanged, }) => { + const [whiteLabelText, setWhiteLabelText] = useState(''); const [authStatus, setAuthStatus] = useState(null); - const whiteLabelText = retrieveWhiteLabelText(); + useEffect(() => { + async function fetchLabel() { + const text = await retrieveWhiteLabelText(); + setWhiteLabelText(text); + } + fetchLabel(); + }, []); function authZendesk() { const provider = 'zendesk'; setAuthStatus('waiting_for_url'); const scope = options?.access_type?.value === 'read' ? 'read' : 'read%20write'; + const subDomain = options?.subdomain?.value; + const client_id = options?.client_id?.value; try { - const authUrl = `https://${options?.subdomain?.value}.zendesk.com/oauth/authorizations/new?response_type=code&client_id=${options?.client_id?.value}&redirect_uri=${window.location.origin}/oauth2/authorize&scope=${scope}`; + const authUrl = `https://${subDomain}.zendesk.com/oauth/authorizations/new?response_type=code&client_id=${client_id}&redirect_uri=${window.location.origin}/oauth2/authorize&scope=${scope}`; localStorage.setItem('sourceWaitingForOAuth', 'newSource'); localStorage.setItem('currentAppEnvironmentIdForOauth', currentAppEnvironmentId); optionchanged('provider', provider).then(() => { diff --git a/frontend/src/_services/datasource.service.js b/frontend/src/_services/datasource.service.js index 9ea24e99d0..49a6ade912 100644 --- a/frontend/src/_services/datasource.service.js +++ b/frontend/src/_services/datasource.service.js @@ -98,7 +98,7 @@ function setOauth2Token(dataSourceId, body, current_organization_id) { function fetchOauth2BaseUrl(provider, plugin_id = null, source_options = {}) { const payload = { provider, ...(plugin_id && { plugin_id }), ...(source_options && { source_options }) }; const requestOptions = { - method: 'GET', + method: 'POST', headers: authHeader(), credentials: 'include', body: JSON.stringify(payload), diff --git a/plugins/packages/grpc/lib/index.ts b/plugins/packages/grpc/lib/index.ts index 30aa514c22..a118aadfb8 100644 --- a/plugins/packages/grpc/lib/index.ts +++ b/plugins/packages/grpc/lib/index.ts @@ -46,8 +46,17 @@ export default class GRPC implements QueryService { metadata.add(sourceOptions.grpc_apikey_key, sourceOptions.grpc_apikey_value); } + let jsonMessage = {}; + if (queryOptions.jsonMessage) { + try { + jsonMessage = JSON.parse(queryOptions.jsonMessage); + } catch (e) { + throw new QueryError('Invalid JSON message', {}, {}); + } + } + const result = await new Promise((resolve, reject) => { - clientStub[rpc]({}, metadata, (err: any, response: any) => { + clientStub[rpc](jsonMessage, metadata, (err: any, response: any) => { if (err) { reject(err); } diff --git a/plugins/packages/grpc/lib/types.ts b/plugins/packages/grpc/lib/types.ts index 5b3865c609..d38528276d 100644 --- a/plugins/packages/grpc/lib/types.ts +++ b/plugins/packages/grpc/lib/types.ts @@ -11,5 +11,6 @@ export type SourceOptions = { export type QueryOptions = { operation: string; serviceName: string; + jsonMessage: string; rpc: string; }; diff --git a/plugins/packages/woocommerce/.gitignore b/plugins/packages/woocommerce/.gitignore index cf1107688f..4c5f09d7c4 100644 --- a/plugins/packages/woocommerce/.gitignore +++ b/plugins/packages/woocommerce/.gitignore @@ -1,5 +1,4 @@ node_modules lib/*.d.* lib/*.js -lib/*.js.map -lib/operations.json \ No newline at end of file +lib/*.js.map \ No newline at end of file diff --git a/plugins/packages/woocommerce/lib/operations.json b/plugins/packages/woocommerce/lib/operations.json new file mode 100644 index 0000000000..e6041e3ee5 --- /dev/null +++ b/plugins/packages/woocommerce/lib/operations.json @@ -0,0 +1,105 @@ +{ + "title": "Woocommerce datasource", + "description": "A schema defining Woocommerce datasource", + "type": "api", + "defaults": {}, + "properties": { + "resource": { + "label": "Resource", + "key": "resource", + "className": "col-md-4", + "type": "dropdown-component-flip", + "description": "Resource select", + "list": [ + { "value": "product", "name": "Product" }, + { "value": "customer", "name": "Customer" }, + { "value": "order", "name": "Order" }, + { "value": "coupon", "name": "Coupon" } + ] + }, + "customer": { + "operation": { + "label": "Operation", + "key": "operation", + "type": "dropdown-component-flip", + "description": "Single select dropdown for operation", + "list": [ + { "value": "list_customer", "name": "List all customers" }, + { "value": "update_customer", "name": "Update a customer" }, + { "value": "delete_customer", "name": "Delete a customer" }, + { "value": "batch_update_customer", "name": "Batch update customers" }, + { "value": "create_customer", "name": "Create a customer" }, + { "value": "retrieve_customer", "name": "Retrieve a customer" } + ] + }, + "list_customer": { + "page": { + "label": "Page", + "key": "page", + "type": "codehinter", + "description": "Enter page", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "", + "lineNumbers": false + }, + "context": { + "label": "Context", + "key": "context", + "type": "codehinter", + "description": "Enter context", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "", + "lineNumbers": false + } + } + }, + "product": { + "operation": { + "label": "Operation", + "key": "operation", + "type": "dropdown-component-flip", + "description": "Single select dropdown for operation", + "list": [ + { "value": "list_product", "name": "List all products" }, + { "value": "update_product", "name": "Update a product" }, + { "value": "delete_product", "name": "Delete a product" }, + { "value": "batch_update_product", "name": "Batch update products" }, + { "value": "create_product", "name": "Create a product" }, + { "value": "retrieve_product", "name": "Retrieve a product" } + ] + } + }, + "order": { + "operation": { + "label": "Operation", + "key": "operation", + "type": "dropdown-component-flip", + "description": "Single select dropdown for operation", + "list": [ + { "value": "list_order", "name": "List all orders" }, + { "value": "update_order", "name": "Update an order" }, + { "value": "delete_order", "name": "Delete an order" }, + { "value": "batch_update_order", "name": "Batch update orders" }, + { "value": "create_order", "name": "Create an order" }, + { "value": "retrieve_order", "name": "Retrieve an order" } + ] + } + }, + "coupon": { + "operation": { + "label": "Operation", + "key": "operation", + "type": "dropdown-component-flip", + "description": "Single select dropdown for operation", + "list": [ + { "value": "list_coupon", "name": "List all coupons" }, + { "value": "create_coupon", "name": "Create a coupon" } + ] + } + } + } +} diff --git a/server/src/modules/data-sources/controller.ts b/server/src/modules/data-sources/controller.ts index a0b1845a3d..d4352c9e9f 100644 --- a/server/src/modules/data-sources/controller.ts +++ b/server/src/modules/data-sources/controller.ts @@ -111,7 +111,7 @@ export class DataSourcesController implements IDataSourcesController { @InitFeature(FEATURE_KEY.GET_OAUTH2_BASE_URL) @UseGuards(FeatureAbilityGuard) - @Get('fetch-oauth2-base-url') + @Post('fetch-oauth2-base-url') getAuthUrl(@Body() getDataSourceOauthUrlDto: GetDataSourceOauthUrlDto) { return this.dataSourcesService.getAuthUrl(getDataSourceOauthUrlDto); } diff --git a/server/src/modules/data-sources/util.service.ts b/server/src/modules/data-sources/util.service.ts index 961f817064..03ad5ddd52 100644 --- a/server/src/modules/data-sources/util.service.ts +++ b/server/src/modules/data-sources/util.service.ts @@ -189,17 +189,16 @@ export class DataSourcesUtilService implements IDataSourcesUtilService { /* Basic plan customer. lets update all environment options. this will help us to run the queries successfully when the user buys enterprise plan - */ - await Promise.all( - allEnvs.map(async (envToUpdate) => { - dataSource.options = ( - await this.appEnvironmentUtilService.getOptions(dataSourceId, organizationId, envToUpdate.id) - ).options; + */ - const newOptions = await this.parseOptionsForUpdate(dataSource, options, manager); - await this.appEnvironmentUtilService.updateOptions(newOptions, envToUpdate.id, dataSource.id, manager); - }) - ); + const newOptions = await this.parseOptionsForUpdate(dataSource, options, manager); + for (const env of allEnvs) { + dataSource.options = ( + await this.appEnvironmentUtilService.getOptions(dataSourceId, organizationId, env.id) + ).options; + + await this.appEnvironmentUtilService.updateOptions(newOptions, env.id, dataSource.id, manager); + } } const updatableParams = { id: dataSourceId, diff --git a/server/src/modules/plugins/service.ts b/server/src/modules/plugins/service.ts index 48398d5ebe..de1709eba7 100644 --- a/server/src/modules/plugins/service.ts +++ b/server/src/modules/plugins/service.ts @@ -47,7 +47,7 @@ export class PluginsService implements IPluginsService { async findOne(id: string) { return dbTransactionWrap((manager: EntityManager) => { - return manager.find(Plugin, { where: { id } }); + return manager.findOne(Plugin, { where: { id } }); }); } From 2f7492635ac9a0f58475303ed1e0744fe1561961 Mon Sep 17 00:00:00 2001 From: Parth <108089718+parthy007@users.noreply.github.com> Date: Wed, 7 May 2025 12:30:49 +0530 Subject: [PATCH 02/19] Fix: Prevent exposure of encrypted credentials during app export. (#12449) * Fix keys mismatch * Fix jira export issue --- .../DataSourceManager/DataSourceManager.jsx | 18 +++++++++++++++--- marketplace/plugins/jira/lib/manifest.json | 8 ++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/frontend/src/modules/dataSources/components/DataSourceManager/DataSourceManager.jsx b/frontend/src/modules/dataSources/components/DataSourceManager/DataSourceManager.jsx index 65ee96758b..96f72f0c18 100644 --- a/frontend/src/modules/dataSources/components/DataSourceManager/DataSourceManager.jsx +++ b/frontend/src/modules/dataSources/components/DataSourceManager/DataSourceManager.jsx @@ -21,7 +21,7 @@ import config from 'config'; import { capitalize, isEmpty } from 'lodash'; import { Card } from '@/_ui/Card'; import { withTranslation, useTranslation } from 'react-i18next'; -import { camelizeKeys, decamelizeKeys } from 'humps'; +import { camelizeKeys, decamelizeKeys, decamelize } from 'humps'; import { ButtonSolid } from '@/_ui/AppButton/AppButton'; import SolidIcon from '@/_ui/Icon/SolidIcons'; import { useAppVersionStore } from '@/_stores/appVersionStore'; @@ -248,14 +248,26 @@ class DataSourceManagerComponent extends React.Component { const scope = this.state?.scope || selectedDataSource?.scope; const parsedOptions = Object?.keys(options)?.map((key) => { - const keyMeta = dataSourceMeta.options[key]; + let keyMeta = dataSourceMeta.options[key]; + let isEncrypted = false; + if (keyMeta) { + isEncrypted = keyMeta.encrypted; + } + + // to resolve any casing mis-match + if (decamelize(key) !== key) { + const newKey = decamelize(key); + isEncrypted = dataSourceMeta.options[newKey].encrypted; + } + return { key: key, value: options[key].value, - encrypted: keyMeta ? keyMeta.encrypted : false, + encrypted: isEncrypted, ...(!options[key]?.value && { credential_id: options[key]?.credential_id }), }; }); + if (OAuthDs.includes(kind)) { const value = localStorage.getItem('OAuthCode'); parsedOptions.push({ key: 'code', value, encrypted: false }); diff --git a/marketplace/plugins/jira/lib/manifest.json b/marketplace/plugins/jira/lib/manifest.json index 4d9abdb583..210e6328f8 100644 --- a/marketplace/plugins/jira/lib/manifest.json +++ b/marketplace/plugins/jira/lib/manifest.json @@ -15,6 +15,9 @@ "options": { "url": { "type": "string" + }, + "personal_token": { + "encrypted": true } } }, @@ -57,11 +60,12 @@ "key": "personal_token", "type": "password", "description": "Enter your api token", - "hint": "You can generate a personal access token from your Jira account 'Manage account'." + "hint": "You can generate a personal access token from your Jira account 'Manage account'.", + "encrypted": true } } }, "required": [ "url" ] -} +} \ No newline at end of file From bd3b21ce3eac8442ab9f744ccc54ae034d0d5e7d Mon Sep 17 00:00:00 2001 From: Adish M <44204658+adishM98@users.noreply.github.com> Date: Wed, 21 May 2025 19:01:25 +0530 Subject: [PATCH 03/19] Render refactor and Fix for Marketplace plugin workflow (#12911) * Render refactor * fixed the issue with commenting * fix clear cache api * enhanced the comment * fixed the issue with comment not fetched by action * issue with if condition intendation * testing clear and push commint comment * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * fix for comment trirgger * adding back to labels * adding back to labels * fixing fetching detail from api * fixing fetching detail from api * fixing fetching detail from api * fixing fetching detail from api * adding the comment option for triggerring * fix label trigger * fix label trigger * fix label trigger * fix label trigger * fix label trigger * adding failure notification on marketplace plugin failure * update s3 bucket upload script with error logs * update the aws/sdk package * Adding the github action url to the PR comment * Adding the output from s3 upload output for better understanding * fix the build error due common files issue * fix the build error due common files issue * adding the submdoule file --- .../workflows/maketplace-plugins-deploy.yml | 72 +- .github/workflows/render-preview-deploy.yml | 235 +- marketplace/package-lock.json | 5230 ++++++++++++++++- marketplace/package.json | 2 +- marketplace/scripts/upload-to-s3.js | 96 +- 5 files changed, 5562 insertions(+), 73 deletions(-) diff --git a/.github/workflows/maketplace-plugins-deploy.yml b/.github/workflows/maketplace-plugins-deploy.yml index 7f58a9b691..32c2965515 100644 --- a/.github/workflows/maketplace-plugins-deploy.yml +++ b/.github/workflows/maketplace-plugins-deploy.yml @@ -10,14 +10,12 @@ env: PR_NUMBER: ${{ github.event.number }} BRANCH_NAME: ${{ github.head_ref || github.ref_name }} - jobs: deploy-marketplace-plugin: if: ${{ github.event.action == 'labeled' && github.event.label.name == 'deploy-marketplace-plugin' }} runs-on: ubuntu-latest steps: - - name: Sync repo uses: actions/checkout@v3 @@ -49,28 +47,58 @@ jobs: aws-secret-access-key: ${{ secrets.AWS_SECRET_MAR_ACCESS_KEY }} aws-region: us-east-2 - - name: Install and build dependencies + - name: Install and build dependencies in order run: | - cd marketplace && npm install && npm run build --workspaces - continue-on-error: true - - - name: Build marketplace plugins - run: | - cd marketplace && AWS_BUCKET=tooljet-plugins-stage node scripts/upload-to-s3.js + cd marketplace + echo "šŸ”§ Installing all workspace dependencies" + npm install - - name: Comment deployment URL + echo "šŸ—ļø Building 'common' plugin first" + npm run build --workspace=plugins/common || exit 1 + + echo "šŸ” Building all remaining plugins" + PLUGINS=$(ls plugins | grep -v '^common$') + for plugin in $PLUGINS; do + echo "šŸ”Ø Building plugin: $plugin" + npm run build --workspace=plugins/$plugin || exit 1 + done + + + - name: Build marketplace plugins and capture summary + run: | + cd marketplace + echo "šŸš€ Uploading to S3" + AWS_BUCKET=tooljet-plugins-stage node scripts/upload-to-s3.js | tee upload_summary.log + + - name: Extract upload summary + id: upload_summary + run: | + SUMMARY=$(awk '/UPLOAD SUMMARY/,0' marketplace/upload_summary.log) + echo "UPLOAD_SUMMARY<> $GITHUB_ENV + echo "$SUMMARY" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + + - name: Comment on success + if: success() uses: actions/github-script@v5 with: - github-token: ${{secrets.GITHUB_TOKEN}} + github-token: ${{ secrets.GITHUB_TOKEN }} script: | + const runId = process.env.GITHUB_RUN_ID; + const runUrl = `https://github.com/${{ github.repository }}/actions/runs/${runId}`; + const summary = process.env.UPLOAD_SUMMARY; + const body = `Marketplace Plugin added to stage bucket\n\nšŸ” [View Deployment Logs & Summary](${runUrl})\n\n\`\`\`\n${summary}\n\`\`\``; + github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, - body: 'Marketplace Plugin added to stage bucket' - }) + body + }); - - uses: actions/github-script@v6 + - name: Label update on success + if: success() + uses: actions/github-script@v6 with: script: | try { @@ -90,3 +118,19 @@ jobs: repo: context.repo.repo, labels: ['marketplace-plugin-deployed'] }) + + - name: Comment on failure + if: failure() + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const runId = process.env.GITHUB_RUN_ID; + const runUrl = `https://github.com/${{ github.repository }}/actions/runs/${runId}`; + + await github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: `āŒ Marketplace Plugin deployment failed.\n\nšŸ” [View Deployment Logs & Summary](${runUrl})` + }); \ No newline at end of file diff --git a/.github/workflows/render-preview-deploy.yml b/.github/workflows/render-preview-deploy.yml index c5cb025cba..5d35c9dd03 100644 --- a/.github/workflows/render-preview-deploy.yml +++ b/.github/workflows/render-preview-deploy.yml @@ -1,7 +1,9 @@ name: Render review deploy on: pull_request_target: - types: [labeled, unlabeled, closed] + types: [labeled, unlabeled, closed, synchronize, opened] + issue_comment: + types: [created, edited, deleted] env: PR_NUMBER: ${{ github.event.number }} BRANCH_NAME: ${{ github.head_ref || github.ref_name }} @@ -1153,3 +1155,234 @@ jobs: # } catch (e) { # console.log(e) # } + + redeploy-review-app: + if: ${{ github.event.action == 'synchronize' || github.event.action == 'opened' }} + runs-on: ubuntu-latest + steps: + - name: Get PR labels + id: get_labels + uses: actions/github-script@v6 + with: + script: | + const labels = await github.rest.issues.listLabelsOnIssue({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number + }); + return labels.data.map(l => l.name); + + - name: Redeploy CE review app if active + if: contains(steps.get_labels.outputs.result, 'active-ce-review-app') + id: redeploy_ce + env: + RENDER_API_KEY: ${{ secrets.RENDER_API_KEY }} + PR_NUMBER: ${{ github.event.number }} + run: | + SERVICE_ID=$(curl --request GET \ + --url "https://api.render.com/v1/services?name=ToolJet%20CE%20PR%20%23${PR_NUMBER}&limit=1" \ + --header 'accept: application/json' \ + --header "authorization: Bearer $RENDER_API_KEY" | jq -r '.[0].service.id') + DEPLOY_RESPONSE=$(curl --request POST \ + --url "https://api.render.com/v1/services/$SERVICE_ID/deploys" \ + --header 'accept: application/json' \ + --header 'content-type: application/json' \ + --header "authorization: Bearer $RENDER_API_KEY" \ + --data '{"clearCache":"clear"}') + DEPLOY_ID=$(echo $DEPLOY_RESPONSE | jq -r '.id') + echo "SERVICE_ID=$SERVICE_ID" >> $GITHUB_ENV + echo "DEPLOY_ID=$DEPLOY_ID" >> $GITHUB_ENV + + + - name: Redeploy EE review app if active + if: contains(steps.get_labels.outputs.result, 'active-ee-review-app') + id: redeploy_ee + env: + RENDER_API_KEY: ${{ secrets.RENDER_API_KEY }} + PR_NUMBER: ${{ github.event.number }} + run: | + SERVICE_ID=$(curl --request GET \ + --url "https://api.render.com/v1/services?name=ToolJet%20EE%20PR%20%23${PR_NUMBER}&limit=1" \ + --header 'accept: application/json' \ + --header "authorization: Bearer $RENDER_API_KEY" | jq -r '.[0].service.id') + DEPLOY_RESPONSE=$(curl --request POST \ + --url "https://api.render.com/v1/services/$SERVICE_ID/deploys" \ + --header 'accept: application/json' \ + --header 'content-type: application/json' \ + --header "authorization: Bearer $RENDER_API_KEY" \ + --data '{"clearCache":"clear"}') + DEPLOY_ID=$(echo $DEPLOY_RESPONSE | jq -r '.id') + echo "SERVICE_ID=$SERVICE_ID" >> $GITHUB_ENV + echo "DEPLOY_ID=$DEPLOY_ID" >> $GITHUB_ENV + + + render-bot-check-deployment: + runs-on: ubuntu-latest + if: github.event.action == 'labeled' && github.event.label.name == 'render-check-deployment' + steps: + - name: Get PR labels + id: get_labels + uses: actions/github-script@v6 + with: + script: | + const labels = await github.rest.issues.listLabelsOnIssue({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number + }); + return labels.data.map(l => l.name); + + - name: Fetch CE service and deploy ID + run: | + response=$(curl --silent --request GET \ + --url "https://api.render.com/v1/services?name=ToolJet%20CE%20PR%20%23${PR_NUMBER}&limit=1" \ + --header 'accept: application/json' \ + --header "authorization: Bearer $RENDER_API_KEY") + + SERVICE_ID=$(echo "$response" | jq -r 'if type=="array" and length > 0 then .[0].service.id else empty end') + + if [[ -z "$SERVICE_ID" ]]; then + echo "No CE service found for PR #$PR_NUMBER. Skipping deployment ID fetch." + exit 0 + fi + + response_deploy=$(curl --silent --request GET \ + --url "https://api.render.com/v1/services/$SERVICE_ID/deploys?limit=1" \ + --header 'accept: application/json' \ + --header "authorization: Bearer $RENDER_API_KEY") + + DEPLOY_ID=$(echo "$response_deploy" | jq -r 'if type=="array" and length > 0 then .[0].deploy.id else empty end') + + echo "CE_SERVICE_ID=$SERVICE_ID" >> $GITHUB_ENV + echo "CE_DEPLOY_ID=$DEPLOY_ID" >> $GITHUB_ENV + env: + PR_NUMBER: ${{ env.PR_NUMBER }} + RENDER_API_KEY: ${{ secrets.RENDER_API_KEY }} + + - name: Comment CE deployment details + uses: actions/github-script@v6 + env: + PR_NUMBER: ${{ env.PR_NUMBER }} + RENDER_API_KEY: ${{ secrets.RENDER_API_KEY }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const prNumber = process.env.PR_NUMBER; + const apiKey = process.env.RENDER_API_KEY; + + const ceServiceRes = await fetch(`https://api.render.com/v1/services?name=ToolJet%20CE%20PR%20%23${prNumber}&limit=1`, { + headers: { + 'accept': 'application/json', + 'authorization': `Bearer ${apiKey}` + } + }); + const ceServices = await ceServiceRes.json(); + const ceServiceId = ceServices[0]?.service?.id || null; + + let ceInfo = 'No active CE review app deployment found.'; + if (ceServiceId) { + const deployRes = await fetch(`https://api.render.com/v1/services/${ceServiceId}/deploys?limit=1`, { + headers: { + 'accept': 'application/json', + 'authorization': `Bearer ${apiKey}` + } + }); + const deployData = await deployRes.json(); + const deploy = deployData[0]?.deploy || {}; + const ceCommit = deploy.commit || {}; + const status = deploy.status || 'unknown'; + ceInfo = `### Community Edition\n- App: https://tooljet-ce-pr-${prNumber}.onrender.com\n- Dashboard: https://dashboard.render.com/web/${ceServiceId}\n- Commit: ${ceCommit.id || ''}\n- Message: ${ceCommit.message || ''}\n- Status: ${status}`; + } + + await github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: ceInfo + }); + + - name: Fetch EE service and deploy ID + run: | + response=$(curl --silent --request GET \ + --url "https://api.render.com/v1/services?name=ToolJet%20EE%20PR%20%23${PR_NUMBER}&limit=1" \ + --header 'accept: application/json' \ + --header "authorization: Bearer $RENDER_API_KEY") + + SERVICE_ID=$(echo "$response" | jq -r 'if type=="array" and length > 0 then .[0].service.id else empty end') + + if [[ -z "$SERVICE_ID" ]]; then + echo "No EE service found for PR #$PR_NUMBER. Skipping deployment ID fetch." + exit 0 + fi + + response_deploy=$(curl --silent --request GET \ + --url "https://api.render.com/v1/services/$SERVICE_ID/deploys?limit=1" \ + --header 'accept: application/json' \ + --header "authorization: Bearer $RENDER_API_KEY") + + DEPLOY_ID=$(echo "$response_deploy" | jq -r 'if type=="array" and length > 0 then .[0].deploy.id else empty end') + + echo "EE_SERVICE_ID=$SERVICE_ID" >> $GITHUB_ENV + echo "EE_DEPLOY_ID=$DEPLOY_ID" >> $GITHUB_ENV + env: + PR_NUMBER: ${{ env.PR_NUMBER }} + RENDER_API_KEY: ${{ secrets.RENDER_API_KEY }} + + - name: Comment EE deployment details + uses: actions/github-script@v6 + env: + PR_NUMBER: ${{ env.PR_NUMBER }} + RENDER_API_KEY: ${{ secrets.RENDER_API_KEY }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const prNumber = process.env.PR_NUMBER; + const apiKey = process.env.RENDER_API_KEY; + + const eeServiceRes = await fetch(`https://api.render.com/v1/services?name=ToolJet%20EE%20PR%20%23${prNumber}&limit=1`, { + headers: { + 'accept': 'application/json', + 'authorization': `Bearer ${apiKey}` + } + }); + const eeServices = await eeServiceRes.json(); + const eeServiceId = eeServices[0]?.service?.id || null; + + let eeInfo = 'No active EE review app deployment found.'; + if (eeServiceId) { + const deployRes = await fetch(`https://api.render.com/v1/services/${eeServiceId}/deploys?limit=1`, { + headers: { + 'accept': 'application/json', + 'authorization': `Bearer ${apiKey}` + } + }); + const deployData = await deployRes.json(); + const deploy = deployData[0]?.deploy || {}; + const eeCommit = deploy.commit || {}; + const status = deploy.status || 'unknown'; + eeInfo = `### Enterprise Edition\n- App: https://tooljet-ee-pr-${prNumber}.onrender.com\n- Dashboard: https://dashboard.render.com/web/${eeServiceId}\n- Commit: ${eeCommit.id || ''}\n- Message: ${eeCommit.message || ''}\n- Status: ${status}`; + } + + await github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: eeInfo + }); + + - name: Remove label + if: contains(steps.get_labels.outputs.result, 'render-check-deployment') + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + try { + await github.rest.issues.removeLabel({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + name: 'render-check-deployment' + }) + } catch (e) { + console.log(e) + } diff --git a/marketplace/package-lock.json b/marketplace/package-lock.json index 4c610732ea..10de0c24d6 100644 --- a/marketplace/package-lock.json +++ b/marketplace/package-lock.json @@ -14,7 +14,7 @@ "@types/jest": "^29.5.0", "@typescript-eslint/eslint-plugin": "^5.57.0", "@typescript-eslint/parser": "^5.57.0", - "aws-sdk": "^2.1326.0", + "aws-sdk": "^2.1692.0", "eslint": "^8.37.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-jest": "^27.2.1", @@ -42,6 +42,28 @@ "node": ">=6.0.0" } }, + "node_modules/@anthropic-ai/sdk": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.32.1.tgz", + "integrity": "sha512-U9JwTrDvdQ9iWuABVsMLj8nJVwAyQz6QXvgLsVhryhCEPkLsbcP/MXxm+jYcAwLoV8ESbaTTjnD4kuAFa+Hyjg==", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + } + }, + "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { + "version": "18.19.103", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.103.tgz", + "integrity": "sha512-hHTHp+sEz6SxFsp+SA+Tqrua3AbmlAw+Y//aEwdHrdZkYVRWdvWD3y5uPZ0flYOkgskaFWqZ/YGFm3FaFQ0pRw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@aws-crypto/crc32": { "version": "3.0.0", "license": "Apache-2.0", @@ -177,6 +199,1069 @@ "tslib": "^2.3.1" } }, + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.812.0.tgz", + "integrity": "sha512-LWkP+Vb2f6aNaway06XvFZG3altSXltAClzCz9cTFuOfKG6V2X+0VWsW9cnFRV4+MFFJW3iQAaPMQ1fBO9Rusg==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.812.0", + "@aws-sdk/credential-provider-node": "3.812.0", + "@aws-sdk/middleware-host-header": "3.804.0", + "@aws-sdk/middleware-logger": "3.804.0", + "@aws-sdk/middleware-recursion-detection": "3.804.0", + "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/region-config-resolver": "3.808.0", + "@aws-sdk/types": "3.804.0", + "@aws-sdk/util-endpoints": "3.808.0", + "@aws-sdk/util-user-agent-browser": "3.804.0", + "@aws-sdk/util-user-agent-node": "3.812.0", + "@smithy/config-resolver": "^4.1.2", + "@smithy/core": "^3.3.3", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/hash-node": "^4.0.2", + "@smithy/invalid-dependency": "^4.0.2", + "@smithy/middleware-content-length": "^4.0.2", + "@smithy/middleware-endpoint": "^4.1.6", + "@smithy/middleware-retry": "^4.1.7", + "@smithy/middleware-serde": "^4.0.5", + "@smithy/middleware-stack": "^4.0.2", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.6", + "@smithy/types": "^4.2.0", + "@smithy/url-parser": "^4.0.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.14", + "@smithy/util-defaults-mode-node": "^4.0.14", + "@smithy/util-endpoints": "^3.0.4", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-retry": "^4.0.3", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/client-sso": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.812.0.tgz", + "integrity": "sha512-O//smQRj1+RXELB7xX54s5pZB0V69KHXpUZmz8V+8GAYO1FKTHfbpUgK+zyMNb+lFZxG9B69yl8pWPZ/K8bvxA==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.812.0", + "@aws-sdk/middleware-host-header": "3.804.0", + "@aws-sdk/middleware-logger": "3.804.0", + "@aws-sdk/middleware-recursion-detection": "3.804.0", + "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/region-config-resolver": "3.808.0", + "@aws-sdk/types": "3.804.0", + "@aws-sdk/util-endpoints": "3.808.0", + "@aws-sdk/util-user-agent-browser": "3.804.0", + "@aws-sdk/util-user-agent-node": "3.812.0", + "@smithy/config-resolver": "^4.1.2", + "@smithy/core": "^3.3.3", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/hash-node": "^4.0.2", + "@smithy/invalid-dependency": "^4.0.2", + "@smithy/middleware-content-length": "^4.0.2", + "@smithy/middleware-endpoint": "^4.1.6", + "@smithy/middleware-retry": "^4.1.7", + "@smithy/middleware-serde": "^4.0.5", + "@smithy/middleware-stack": "^4.0.2", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.6", + "@smithy/types": "^4.2.0", + "@smithy/url-parser": "^4.0.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.14", + "@smithy/util-defaults-mode-node": "^4.0.14", + "@smithy/util-endpoints": "^3.0.4", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-retry": "^4.0.3", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/core": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.812.0.tgz", + "integrity": "sha512-myWA9oHMBVDObKrxG+puAkIGs8igcWInQ1PWCRTS/zN4BkhUMFjjh/JPV/4Vzvtvj5E36iujq2WtlrDLl1PpOw==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/core": "^3.3.3", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/property-provider": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/signature-v4": "^5.1.0", + "@smithy/smithy-client": "^4.2.6", + "@smithy/types": "^4.2.0", + "@smithy/util-middleware": "^4.0.2", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.812.0.tgz", + "integrity": "sha512-Ge7IEu06ANurGBZx39q9CNN/ncqb1K8lpKZCY969uNWO0/7YPhnplrRJGMZYIS35nD2mBm3ortEKjY/wMZZd5g==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.812.0.tgz", + "integrity": "sha512-Vux2U42vPGXeE407Lp6v3yVA65J7hBO9rB67LXshyGVi7VZLAYWc4mrZxNJNqabEkjcDEmMQQakLPT6zc5SvFw==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/property-provider": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.6", + "@smithy/types": "^4.2.0", + "@smithy/util-stream": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.812.0.tgz", + "integrity": "sha512-oltqGvQ488xtPY5wrNjbD+qQYYkuCjn30IDE1qKMxJ58EM6UVTQl3XV44Xq07xfF5gKwVJQkfIyOkRAguOVybg==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/credential-provider-env": "3.812.0", + "@aws-sdk/credential-provider-http": "3.812.0", + "@aws-sdk/credential-provider-process": "3.812.0", + "@aws-sdk/credential-provider-sso": "3.812.0", + "@aws-sdk/credential-provider-web-identity": "3.812.0", + "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/credential-provider-imds": "^4.0.4", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.812.0.tgz", + "integrity": "sha512-SnvSWBP6cr9nqx784eETnL2Zl7ZnMB/oJgFVEG1aejAGbT1H9gTpMwuUsBXk4u/mEYe3f1lh1Wqo+HwDgNkfrg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.812.0", + "@aws-sdk/credential-provider-http": "3.812.0", + "@aws-sdk/credential-provider-ini": "3.812.0", + "@aws-sdk/credential-provider-process": "3.812.0", + "@aws-sdk/credential-provider-sso": "3.812.0", + "@aws-sdk/credential-provider-web-identity": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/credential-provider-imds": "^4.0.4", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.812.0.tgz", + "integrity": "sha512-YI8bb153XeEOb59F9KtTZEwDAc14s2YHZz58+OFiJ2udnKsPV87mNiFhJPW6ba9nmOLXVat5XDcwtVT1b664wg==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.812.0.tgz", + "integrity": "sha512-ODsPcNhgiO6GOa82TVNskM97mml9rioe9Cbhemz48lkfDQPv1u06NaCR0o3FsvprX1sEhMvJTR3sE1fyEOzvJQ==", + "dependencies": { + "@aws-sdk/client-sso": "3.812.0", + "@aws-sdk/core": "3.812.0", + "@aws-sdk/token-providers": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.812.0.tgz", + "integrity": "sha512-E9Bmiujvm/Hp9DM/Vc1S+D0pQbx8/x4dR/zyAEZU9EoRq0duQOQ1reWYWbebYmL1OklcVpTfKV0a/VCwuAtGSg==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.804.0.tgz", + "integrity": "sha512-bum1hLVBrn2lJCi423Z2fMUYtsbkGI2s4N+2RI2WSjvbaVyMSv/WcejIrjkqiiMR+2Y7m5exgoKeg4/TODLDPQ==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-logger": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.804.0.tgz", + "integrity": "sha512-w/qLwL3iq0KOPQNat0Kb7sKndl9BtceigINwBU7SpkYWX9L/Lem6f8NPEKrC9Tl4wDBht3Yztub4oRTy/horJA==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.804.0.tgz", + "integrity": "sha512-zqHOrvLRdsUdN/ehYfZ9Tf8svhbiLLz5VaWUz22YndFv6m9qaAcijkpAOlKexsv3nLBMJdSdJ6GUTAeIy3BZzw==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.812.0.tgz", + "integrity": "sha512-r+HFwtSvnAs6Fydp4mijylrTX0og9p/xfxOcKsqhMuk3HpZAIcf9sSjRQI6MBusYklg7pnM4sGEnPAZIrdRotA==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@aws-sdk/util-endpoints": "3.808.0", + "@smithy/core": "^3.3.3", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.808.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.808.0.tgz", + "integrity": "sha512-9x2QWfphkARZY5OGkl9dJxZlSlYM2l5inFeo2bKntGuwg4A4YUe5h7d5yJ6sZbam9h43eBrkOdumx03DAkQF9A==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/types": "^4.2.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/token-providers": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.812.0.tgz", + "integrity": "sha512-dbVBaKxrxE708ub5uH3w+cmKIeRQas+2Xf6rpckhohYY+IiflGOdK6aLrp3T6dOQgr/FJ37iQtcYNonAG+yVBQ==", + "dependencies": { + "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/types": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.804.0.tgz", + "integrity": "sha512-A9qnsy9zQ8G89vrPPlNG9d1d8QcKRGqJKqwyGgS0dclJpwy6d1EWgQLIolKPl6vcFpLoe6avLOLxr+h8ur5wpg==", + "dependencies": { + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/util-endpoints": { + "version": "3.808.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.808.0.tgz", + "integrity": "sha512-N6Lic98uc4ADB7fLWlzx+1uVnq04VgVjngZvwHoujcRg9YDhIg9dUDiTzD5VZv13g1BrPYmvYP1HhsildpGV6w==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/types": "^4.2.0", + "@smithy/util-endpoints": "^3.0.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.804.0.tgz", + "integrity": "sha512-KfW6T6nQHHM/vZBBdGn6fMyG/MgX5lq82TDdX4HRQRRuHKLgBWGpKXqqvBwqIaCdXwWHgDrg2VQups6GqOWW2A==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/types": "^4.2.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.812.0.tgz", + "integrity": "sha512-8pt+OkHhS2U0LDwnzwRnFxyKn8sjSe752OIZQCNv263odud8jQu9pYO2pKqb2kRBk9h9szynjZBDLXfnvSQ7Bg==", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/abort-controller": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.3.tgz", + "integrity": "sha512-AqXFf6DXnuRBXy4SoK/n1mfgHaKaq36bmkphmD1KO0nHq6xK/g9KHSW4HEsPQUBCGdIEfuJifGHwxFXPIFay9Q==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/config-resolver": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.3.tgz", + "integrity": "sha512-N5e7ofiyYDmHxnPnqF8L4KtsbSDwyxFRfDK9bp1d9OyPO4ytRLd0/XxCqi5xVaaqB65v4woW8uey6jND6zxzxQ==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.2", + "@smithy/types": "^4.3.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/core": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.4.0.tgz", + "integrity": "sha512-dDYISQo7k0Ml/rXlFIjkTmTcQze/LxhtIRAEmZ6HJ/EI0inVxVEVnrUXJ7jPx6ZP0GHUhFm40iQcCgS5apXIXA==", + "dependencies": { + "@smithy/middleware-serde": "^4.0.6", + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.3", + "@smithy/util-stream": "^4.2.1", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.5.tgz", + "integrity": "sha512-saEAGwrIlkb9XxX/m5S5hOtzjoJPEK6Qw2f9pYTbIsMPOFyGSXBBTw95WbOyru8A1vIS2jVCCU1Qhz50QWG3IA==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.2", + "@smithy/property-provider": "^4.0.3", + "@smithy/types": "^4.3.0", + "@smithy/url-parser": "^4.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/fetch-http-handler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.3.tgz", + "integrity": "sha512-yBZwavI31roqTndNI7ONHqesfH01JmjJK6L3uUpZAhyAmr86LN5QiPzfyZGIxQmed8VEK2NRSQT3/JX5V1njfQ==", + "dependencies": { + "@smithy/protocol-http": "^5.1.1", + "@smithy/querystring-builder": "^4.0.3", + "@smithy/types": "^4.3.0", + "@smithy/util-base64": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/hash-node": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.3.tgz", + "integrity": "sha512-W5Uhy6v/aYrgtjh9y0YP332gIQcwccQ+EcfWhllL0B9rPae42JngTTUpb8W6wuxaNFzqps4xq5klHckSSOy5fw==", + "dependencies": { + "@smithy/types": "^4.3.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/hash-node/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/invalid-dependency": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.3.tgz", + "integrity": "sha512-1Bo8Ur1ZGqxvwTqBmv6DZEn0rXtwJGeqiiO2/JFcCtz3nBakOqeXbJBElXJMMzd0ghe8+eB6Dkw98nMYctgizg==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-content-length": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.3.tgz", + "integrity": "sha512-NE/Zph4BP5u16bzYq2csq9qD0T6UBLeg4AuNrwNJ7Gv9uLYaGEgelZUOdRndGdMGcUfSGvNlXGb2aA2hPCwJ6g==", + "dependencies": { + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-endpoint": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.7.tgz", + "integrity": "sha512-KDzM7Iajo6K7eIWNNtukykRT4eWwlHjCEsULZUaSfi/SRSBK8BPRqG5FsVfp58lUxcvre8GT8AIPIqndA0ERKw==", + "dependencies": { + "@smithy/core": "^3.4.0", + "@smithy/middleware-serde": "^4.0.6", + "@smithy/node-config-provider": "^4.1.2", + "@smithy/shared-ini-file-loader": "^4.0.3", + "@smithy/types": "^4.3.0", + "@smithy/url-parser": "^4.0.3", + "@smithy/util-middleware": "^4.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-retry": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.8.tgz", + "integrity": "sha512-e2OtQgFzzlSG0uCjcJmi02QuFSRTrpT11Eh2EcqqDFy7DYriteHZJkkf+4AsxsrGDugAtPFcWBz1aq06sSX5fQ==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.2", + "@smithy/protocol-http": "^5.1.1", + "@smithy/service-error-classification": "^4.0.4", + "@smithy/smithy-client": "^4.3.0", + "@smithy/types": "^4.3.0", + "@smithy/util-middleware": "^4.0.3", + "@smithy/util-retry": "^4.0.4", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-serde": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.6.tgz", + "integrity": "sha512-YECyl7uNII+jCr/9qEmCu8xYL79cU0fqjo0qxpcVIU18dAPHam/iYwcknAu4Jiyw1uN+sAx7/SMf/Kmef/Jjsg==", + "dependencies": { + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-stack": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.3.tgz", + "integrity": "sha512-baeV7t4jQfQtFxBADFmnhmqBmqR38dNU5cvEgHcMK/Kp3D3bEI0CouoX2Sr/rGuntR+Eg0IjXdxnGGTc6SbIkw==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/node-config-provider": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.2.tgz", + "integrity": "sha512-SUvNup8iU1v7fmM8XPk+27m36udmGCfSz+VZP5Gb0aJ3Ne0X28K/25gnsrg3X1rWlhcnhzNUUysKW/Ied46ivQ==", + "dependencies": { + "@smithy/property-provider": "^4.0.3", + "@smithy/shared-ini-file-loader": "^4.0.3", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/node-http-handler": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.5.tgz", + "integrity": "sha512-T7QglZC1vS7SPT44/1qSIAQEx5bFKb3LfO6zw/o4Xzt1eC5HNoH1TkS4lMYA9cWFbacUhx4hRl/blLun4EOCkg==", + "dependencies": { + "@smithy/abort-controller": "^4.0.3", + "@smithy/protocol-http": "^5.1.1", + "@smithy/querystring-builder": "^4.0.3", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/property-provider": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.3.tgz", + "integrity": "sha512-Wcn17QNdawJZcZZPBuMuzyBENVi1AXl4TdE0jvzo4vWX2x5df/oMlmr/9M5XAAC6+yae4kWZlOYIsNsgDrMU9A==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/protocol-http": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.1.tgz", + "integrity": "sha512-Vsay2mzq05DwNi9jK01yCFtfvu9HimmgC7a4HTs7lhX12Sx8aWsH0mfz6q/02yspSp+lOB+Q2HJwi4IV2GKz7A==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/querystring-builder": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.3.tgz", + "integrity": "sha512-UUzIWMVfPmDZcOutk2/r1vURZqavvQW0OHvgsyNV0cKupChvqg+/NKPRMaMEe+i8tP96IthMFeZOZWpV+E4RAw==", + "dependencies": { + "@smithy/types": "^4.3.0", + "@smithy/util-uri-escape": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/querystring-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.3.tgz", + "integrity": "sha512-K5M4ZJQpFCblOJ5Oyw7diICpFg1qhhR47m2/5Ef1PhGE19RaIZf50tjYFrxa6usqcuXyTiFPGo4d1geZdH4YcQ==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/service-error-classification": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.4.tgz", + "integrity": "sha512-W5ScbQ1bTzgH91kNEE2CvOzM4gXlDOqdow4m8vMFSIXCel2scbHwjflpVNnC60Y3F1m5i7w2gQg9lSnR+JsJAA==", + "dependencies": { + "@smithy/types": "^4.3.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.3.tgz", + "integrity": "sha512-vHwlrqhZGIoLwaH8vvIjpHnloShqdJ7SUPNM2EQtEox+yEDFTVQ7E+DLZ+6OhnYEgFUwPByJyz6UZaOu2tny6A==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/signature-v4": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.1.tgz", + "integrity": "sha512-zy8Repr5zvT0ja+Tf5wjV/Ba6vRrhdiDcp/ww6cvqYbSEudIkziDe3uppNRlFoCViyJXdPnLcwyZdDLA4CHzSg==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.3", + "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/smithy-client": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.3.0.tgz", + "integrity": "sha512-DNsRA38pN6tYHUjebmwD9e4KcgqTLldYQb2gC6K+oxXYdCTxPn6wV9+FvOa6wrU2FQEnGJoi+3GULzOTKck/tg==", + "dependencies": { + "@smithy/core": "^3.4.0", + "@smithy/middleware-endpoint": "^4.1.7", + "@smithy/middleware-stack": "^4.0.3", + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "@smithy/util-stream": "^4.2.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/types": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.0.tgz", + "integrity": "sha512-+1iaIQHthDh9yaLhRzaoQxRk+l9xlk+JjMFxGRhNLz+m9vKOkjNeU8QuB4w3xvzHyVR/BVlp/4AXDHjoRIkfgQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/url-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.3.tgz", + "integrity": "sha512-n5/DnosDu/tweOqUUNtUbu7eRIR4J/Wz9nL7V5kFYQQVb8VYdj7a4G5NJHCw6o21ul7CvZoJkOpdTnsQDLT0tQ==", + "dependencies": { + "@smithy/querystring-parser": "^4.0.3", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.15.tgz", + "integrity": "sha512-bJJ/B8owQbHAflatSq92f9OcV8858DJBQF1Y3GRjB8psLyUjbISywszYPFw16beREHO/C3I3taW4VGH+tOuwrQ==", + "dependencies": { + "@smithy/property-provider": "^4.0.3", + "@smithy/smithy-client": "^4.3.0", + "@smithy/types": "^4.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.15.tgz", + "integrity": "sha512-8CUrEW2Ni5q+NmYkj8wsgkfqoP7l4ZquptFbq92yQE66xevc4SxqP2zH6tMtN158kgBqBDsZ+qlrRwXWOjCR8A==", + "dependencies": { + "@smithy/config-resolver": "^4.1.3", + "@smithy/credential-provider-imds": "^4.0.5", + "@smithy/node-config-provider": "^4.1.2", + "@smithy/property-provider": "^4.0.3", + "@smithy/smithy-client": "^4.3.0", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-endpoints": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.5.tgz", + "integrity": "sha512-PjDpqLk24/vAl340tmtCA++Q01GRRNH9cwL9qh46NspAX9S+IQVcK+GOzPt0GLJ6KYGyn8uOgo2kvJhiThclJw==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.2", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-middleware": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.3.tgz", + "integrity": "sha512-iIsC6qZXxkD7V3BzTw3b1uK8RVC1M8WvwNxK1PKrH9FnxntCd30CSunXjL/8iJBE8Z0J14r2P69njwIpRG4FBQ==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-retry": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.4.tgz", + "integrity": "sha512-Aoqr9W2jDYGrI6OxljN8VmLDQIGO4VdMAUKMf9RGqLG8hn6or+K41NEy1Y5dtum9q8F7e0obYAuKl2mt/GnpZg==", + "dependencies": { + "@smithy/service-error-classification": "^4.0.4", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-stream": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.1.tgz", + "integrity": "sha512-W3IR0x5DY6iVtjj5p902oNhD+Bz7vs5S+p6tppbPa509rV9BdeXZjGuRSCtVEad9FA0Mba+tNUtUmtnSI1nwUw==", + "dependencies": { + "@smithy/fetch-http-handler": "^5.0.3", + "@smithy/node-http-handler": "^4.0.5", + "@smithy/types": "^4.3.0", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-stream/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@aws-sdk/client-lambda": { "version": "3.635.0", "license": "Apache-2.0", @@ -1732,6 +2817,1085 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/client-sagemaker": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker/-/client-sagemaker-3.812.0.tgz", + "integrity": "sha512-KX+/Iu8Cde32low/0c+MGx03CShRJ9PB57qJtPtG6qgz0PeZc8e+t6lBjyZt33iUKZ25/Mt9277tXaSmxGpktw==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.812.0", + "@aws-sdk/credential-provider-node": "3.812.0", + "@aws-sdk/middleware-host-header": "3.804.0", + "@aws-sdk/middleware-logger": "3.804.0", + "@aws-sdk/middleware-recursion-detection": "3.804.0", + "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/region-config-resolver": "3.808.0", + "@aws-sdk/types": "3.804.0", + "@aws-sdk/util-endpoints": "3.808.0", + "@aws-sdk/util-user-agent-browser": "3.804.0", + "@aws-sdk/util-user-agent-node": "3.812.0", + "@smithy/config-resolver": "^4.1.2", + "@smithy/core": "^3.3.3", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/hash-node": "^4.0.2", + "@smithy/invalid-dependency": "^4.0.2", + "@smithy/middleware-content-length": "^4.0.2", + "@smithy/middleware-endpoint": "^4.1.6", + "@smithy/middleware-retry": "^4.1.7", + "@smithy/middleware-serde": "^4.0.5", + "@smithy/middleware-stack": "^4.0.2", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.6", + "@smithy/types": "^4.2.0", + "@smithy/url-parser": "^4.0.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.14", + "@smithy/util-defaults-mode-node": "^4.0.14", + "@smithy/util-endpoints": "^3.0.4", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-retry": "^4.0.3", + "@smithy/util-utf8": "^4.0.0", + "@smithy/util-waiter": "^4.0.3", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/client-sso": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.812.0.tgz", + "integrity": "sha512-O//smQRj1+RXELB7xX54s5pZB0V69KHXpUZmz8V+8GAYO1FKTHfbpUgK+zyMNb+lFZxG9B69yl8pWPZ/K8bvxA==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.812.0", + "@aws-sdk/middleware-host-header": "3.804.0", + "@aws-sdk/middleware-logger": "3.804.0", + "@aws-sdk/middleware-recursion-detection": "3.804.0", + "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/region-config-resolver": "3.808.0", + "@aws-sdk/types": "3.804.0", + "@aws-sdk/util-endpoints": "3.808.0", + "@aws-sdk/util-user-agent-browser": "3.804.0", + "@aws-sdk/util-user-agent-node": "3.812.0", + "@smithy/config-resolver": "^4.1.2", + "@smithy/core": "^3.3.3", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/hash-node": "^4.0.2", + "@smithy/invalid-dependency": "^4.0.2", + "@smithy/middleware-content-length": "^4.0.2", + "@smithy/middleware-endpoint": "^4.1.6", + "@smithy/middleware-retry": "^4.1.7", + "@smithy/middleware-serde": "^4.0.5", + "@smithy/middleware-stack": "^4.0.2", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.6", + "@smithy/types": "^4.2.0", + "@smithy/url-parser": "^4.0.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.14", + "@smithy/util-defaults-mode-node": "^4.0.14", + "@smithy/util-endpoints": "^3.0.4", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-retry": "^4.0.3", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/core": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.812.0.tgz", + "integrity": "sha512-myWA9oHMBVDObKrxG+puAkIGs8igcWInQ1PWCRTS/zN4BkhUMFjjh/JPV/4Vzvtvj5E36iujq2WtlrDLl1PpOw==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/core": "^3.3.3", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/property-provider": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/signature-v4": "^5.1.0", + "@smithy/smithy-client": "^4.2.6", + "@smithy/types": "^4.2.0", + "@smithy/util-middleware": "^4.0.2", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.812.0.tgz", + "integrity": "sha512-Ge7IEu06ANurGBZx39q9CNN/ncqb1K8lpKZCY969uNWO0/7YPhnplrRJGMZYIS35nD2mBm3ortEKjY/wMZZd5g==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.812.0.tgz", + "integrity": "sha512-Vux2U42vPGXeE407Lp6v3yVA65J7hBO9rB67LXshyGVi7VZLAYWc4mrZxNJNqabEkjcDEmMQQakLPT6zc5SvFw==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/property-provider": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.6", + "@smithy/types": "^4.2.0", + "@smithy/util-stream": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.812.0.tgz", + "integrity": "sha512-oltqGvQ488xtPY5wrNjbD+qQYYkuCjn30IDE1qKMxJ58EM6UVTQl3XV44Xq07xfF5gKwVJQkfIyOkRAguOVybg==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/credential-provider-env": "3.812.0", + "@aws-sdk/credential-provider-http": "3.812.0", + "@aws-sdk/credential-provider-process": "3.812.0", + "@aws-sdk/credential-provider-sso": "3.812.0", + "@aws-sdk/credential-provider-web-identity": "3.812.0", + "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/credential-provider-imds": "^4.0.4", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.812.0.tgz", + "integrity": "sha512-SnvSWBP6cr9nqx784eETnL2Zl7ZnMB/oJgFVEG1aejAGbT1H9gTpMwuUsBXk4u/mEYe3f1lh1Wqo+HwDgNkfrg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.812.0", + "@aws-sdk/credential-provider-http": "3.812.0", + "@aws-sdk/credential-provider-ini": "3.812.0", + "@aws-sdk/credential-provider-process": "3.812.0", + "@aws-sdk/credential-provider-sso": "3.812.0", + "@aws-sdk/credential-provider-web-identity": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/credential-provider-imds": "^4.0.4", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.812.0.tgz", + "integrity": "sha512-YI8bb153XeEOb59F9KtTZEwDAc14s2YHZz58+OFiJ2udnKsPV87mNiFhJPW6ba9nmOLXVat5XDcwtVT1b664wg==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.812.0.tgz", + "integrity": "sha512-ODsPcNhgiO6GOa82TVNskM97mml9rioe9Cbhemz48lkfDQPv1u06NaCR0o3FsvprX1sEhMvJTR3sE1fyEOzvJQ==", + "dependencies": { + "@aws-sdk/client-sso": "3.812.0", + "@aws-sdk/core": "3.812.0", + "@aws-sdk/token-providers": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.812.0.tgz", + "integrity": "sha512-E9Bmiujvm/Hp9DM/Vc1S+D0pQbx8/x4dR/zyAEZU9EoRq0duQOQ1reWYWbebYmL1OklcVpTfKV0a/VCwuAtGSg==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.804.0.tgz", + "integrity": "sha512-bum1hLVBrn2lJCi423Z2fMUYtsbkGI2s4N+2RI2WSjvbaVyMSv/WcejIrjkqiiMR+2Y7m5exgoKeg4/TODLDPQ==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-logger": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.804.0.tgz", + "integrity": "sha512-w/qLwL3iq0KOPQNat0Kb7sKndl9BtceigINwBU7SpkYWX9L/Lem6f8NPEKrC9Tl4wDBht3Yztub4oRTy/horJA==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.804.0.tgz", + "integrity": "sha512-zqHOrvLRdsUdN/ehYfZ9Tf8svhbiLLz5VaWUz22YndFv6m9qaAcijkpAOlKexsv3nLBMJdSdJ6GUTAeIy3BZzw==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.812.0.tgz", + "integrity": "sha512-r+HFwtSvnAs6Fydp4mijylrTX0og9p/xfxOcKsqhMuk3HpZAIcf9sSjRQI6MBusYklg7pnM4sGEnPAZIrdRotA==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@aws-sdk/util-endpoints": "3.808.0", + "@smithy/core": "^3.3.3", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.808.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.808.0.tgz", + "integrity": "sha512-9x2QWfphkARZY5OGkl9dJxZlSlYM2l5inFeo2bKntGuwg4A4YUe5h7d5yJ6sZbam9h43eBrkOdumx03DAkQF9A==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/types": "^4.2.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/token-providers": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.812.0.tgz", + "integrity": "sha512-dbVBaKxrxE708ub5uH3w+cmKIeRQas+2Xf6rpckhohYY+IiflGOdK6aLrp3T6dOQgr/FJ37iQtcYNonAG+yVBQ==", + "dependencies": { + "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/types": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.804.0.tgz", + "integrity": "sha512-A9qnsy9zQ8G89vrPPlNG9d1d8QcKRGqJKqwyGgS0dclJpwy6d1EWgQLIolKPl6vcFpLoe6avLOLxr+h8ur5wpg==", + "dependencies": { + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-endpoints": { + "version": "3.808.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.808.0.tgz", + "integrity": "sha512-N6Lic98uc4ADB7fLWlzx+1uVnq04VgVjngZvwHoujcRg9YDhIg9dUDiTzD5VZv13g1BrPYmvYP1HhsildpGV6w==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/types": "^4.2.0", + "@smithy/util-endpoints": "^3.0.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.804.0.tgz", + "integrity": "sha512-KfW6T6nQHHM/vZBBdGn6fMyG/MgX5lq82TDdX4HRQRRuHKLgBWGpKXqqvBwqIaCdXwWHgDrg2VQups6GqOWW2A==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/types": "^4.2.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.812.0.tgz", + "integrity": "sha512-8pt+OkHhS2U0LDwnzwRnFxyKn8sjSe752OIZQCNv263odud8jQu9pYO2pKqb2kRBk9h9szynjZBDLXfnvSQ7Bg==", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/abort-controller": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.3.tgz", + "integrity": "sha512-AqXFf6DXnuRBXy4SoK/n1mfgHaKaq36bmkphmD1KO0nHq6xK/g9KHSW4HEsPQUBCGdIEfuJifGHwxFXPIFay9Q==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/config-resolver": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.3.tgz", + "integrity": "sha512-N5e7ofiyYDmHxnPnqF8L4KtsbSDwyxFRfDK9bp1d9OyPO4ytRLd0/XxCqi5xVaaqB65v4woW8uey6jND6zxzxQ==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.2", + "@smithy/types": "^4.3.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/core": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.4.0.tgz", + "integrity": "sha512-dDYISQo7k0Ml/rXlFIjkTmTcQze/LxhtIRAEmZ6HJ/EI0inVxVEVnrUXJ7jPx6ZP0GHUhFm40iQcCgS5apXIXA==", + "dependencies": { + "@smithy/middleware-serde": "^4.0.6", + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.3", + "@smithy/util-stream": "^4.2.1", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.5.tgz", + "integrity": "sha512-saEAGwrIlkb9XxX/m5S5hOtzjoJPEK6Qw2f9pYTbIsMPOFyGSXBBTw95WbOyru8A1vIS2jVCCU1Qhz50QWG3IA==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.2", + "@smithy/property-provider": "^4.0.3", + "@smithy/types": "^4.3.0", + "@smithy/url-parser": "^4.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/fetch-http-handler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.3.tgz", + "integrity": "sha512-yBZwavI31roqTndNI7ONHqesfH01JmjJK6L3uUpZAhyAmr86LN5QiPzfyZGIxQmed8VEK2NRSQT3/JX5V1njfQ==", + "dependencies": { + "@smithy/protocol-http": "^5.1.1", + "@smithy/querystring-builder": "^4.0.3", + "@smithy/types": "^4.3.0", + "@smithy/util-base64": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/hash-node": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.3.tgz", + "integrity": "sha512-W5Uhy6v/aYrgtjh9y0YP332gIQcwccQ+EcfWhllL0B9rPae42JngTTUpb8W6wuxaNFzqps4xq5klHckSSOy5fw==", + "dependencies": { + "@smithy/types": "^4.3.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/hash-node/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/invalid-dependency": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.3.tgz", + "integrity": "sha512-1Bo8Ur1ZGqxvwTqBmv6DZEn0rXtwJGeqiiO2/JFcCtz3nBakOqeXbJBElXJMMzd0ghe8+eB6Dkw98nMYctgizg==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/middleware-content-length": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.3.tgz", + "integrity": "sha512-NE/Zph4BP5u16bzYq2csq9qD0T6UBLeg4AuNrwNJ7Gv9uLYaGEgelZUOdRndGdMGcUfSGvNlXGb2aA2hPCwJ6g==", + "dependencies": { + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/middleware-endpoint": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.7.tgz", + "integrity": "sha512-KDzM7Iajo6K7eIWNNtukykRT4eWwlHjCEsULZUaSfi/SRSBK8BPRqG5FsVfp58lUxcvre8GT8AIPIqndA0ERKw==", + "dependencies": { + "@smithy/core": "^3.4.0", + "@smithy/middleware-serde": "^4.0.6", + "@smithy/node-config-provider": "^4.1.2", + "@smithy/shared-ini-file-loader": "^4.0.3", + "@smithy/types": "^4.3.0", + "@smithy/url-parser": "^4.0.3", + "@smithy/util-middleware": "^4.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/middleware-retry": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.8.tgz", + "integrity": "sha512-e2OtQgFzzlSG0uCjcJmi02QuFSRTrpT11Eh2EcqqDFy7DYriteHZJkkf+4AsxsrGDugAtPFcWBz1aq06sSX5fQ==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.2", + "@smithy/protocol-http": "^5.1.1", + "@smithy/service-error-classification": "^4.0.4", + "@smithy/smithy-client": "^4.3.0", + "@smithy/types": "^4.3.0", + "@smithy/util-middleware": "^4.0.3", + "@smithy/util-retry": "^4.0.4", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/middleware-serde": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.6.tgz", + "integrity": "sha512-YECyl7uNII+jCr/9qEmCu8xYL79cU0fqjo0qxpcVIU18dAPHam/iYwcknAu4Jiyw1uN+sAx7/SMf/Kmef/Jjsg==", + "dependencies": { + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/middleware-stack": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.3.tgz", + "integrity": "sha512-baeV7t4jQfQtFxBADFmnhmqBmqR38dNU5cvEgHcMK/Kp3D3bEI0CouoX2Sr/rGuntR+Eg0IjXdxnGGTc6SbIkw==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/node-config-provider": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.2.tgz", + "integrity": "sha512-SUvNup8iU1v7fmM8XPk+27m36udmGCfSz+VZP5Gb0aJ3Ne0X28K/25gnsrg3X1rWlhcnhzNUUysKW/Ied46ivQ==", + "dependencies": { + "@smithy/property-provider": "^4.0.3", + "@smithy/shared-ini-file-loader": "^4.0.3", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/node-http-handler": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.5.tgz", + "integrity": "sha512-T7QglZC1vS7SPT44/1qSIAQEx5bFKb3LfO6zw/o4Xzt1eC5HNoH1TkS4lMYA9cWFbacUhx4hRl/blLun4EOCkg==", + "dependencies": { + "@smithy/abort-controller": "^4.0.3", + "@smithy/protocol-http": "^5.1.1", + "@smithy/querystring-builder": "^4.0.3", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/property-provider": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.3.tgz", + "integrity": "sha512-Wcn17QNdawJZcZZPBuMuzyBENVi1AXl4TdE0jvzo4vWX2x5df/oMlmr/9M5XAAC6+yae4kWZlOYIsNsgDrMU9A==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/protocol-http": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.1.tgz", + "integrity": "sha512-Vsay2mzq05DwNi9jK01yCFtfvu9HimmgC7a4HTs7lhX12Sx8aWsH0mfz6q/02yspSp+lOB+Q2HJwi4IV2GKz7A==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/querystring-builder": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.3.tgz", + "integrity": "sha512-UUzIWMVfPmDZcOutk2/r1vURZqavvQW0OHvgsyNV0cKupChvqg+/NKPRMaMEe+i8tP96IthMFeZOZWpV+E4RAw==", + "dependencies": { + "@smithy/types": "^4.3.0", + "@smithy/util-uri-escape": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/querystring-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.3.tgz", + "integrity": "sha512-K5M4ZJQpFCblOJ5Oyw7diICpFg1qhhR47m2/5Ef1PhGE19RaIZf50tjYFrxa6usqcuXyTiFPGo4d1geZdH4YcQ==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/service-error-classification": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.4.tgz", + "integrity": "sha512-W5ScbQ1bTzgH91kNEE2CvOzM4gXlDOqdow4m8vMFSIXCel2scbHwjflpVNnC60Y3F1m5i7w2gQg9lSnR+JsJAA==", + "dependencies": { + "@smithy/types": "^4.3.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.3.tgz", + "integrity": "sha512-vHwlrqhZGIoLwaH8vvIjpHnloShqdJ7SUPNM2EQtEox+yEDFTVQ7E+DLZ+6OhnYEgFUwPByJyz6UZaOu2tny6A==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/signature-v4": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.1.tgz", + "integrity": "sha512-zy8Repr5zvT0ja+Tf5wjV/Ba6vRrhdiDcp/ww6cvqYbSEudIkziDe3uppNRlFoCViyJXdPnLcwyZdDLA4CHzSg==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.3", + "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/smithy-client": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.3.0.tgz", + "integrity": "sha512-DNsRA38pN6tYHUjebmwD9e4KcgqTLldYQb2gC6K+oxXYdCTxPn6wV9+FvOa6wrU2FQEnGJoi+3GULzOTKck/tg==", + "dependencies": { + "@smithy/core": "^3.4.0", + "@smithy/middleware-endpoint": "^4.1.7", + "@smithy/middleware-stack": "^4.0.3", + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "@smithy/util-stream": "^4.2.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/types": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.0.tgz", + "integrity": "sha512-+1iaIQHthDh9yaLhRzaoQxRk+l9xlk+JjMFxGRhNLz+m9vKOkjNeU8QuB4w3xvzHyVR/BVlp/4AXDHjoRIkfgQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/url-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.3.tgz", + "integrity": "sha512-n5/DnosDu/tweOqUUNtUbu7eRIR4J/Wz9nL7V5kFYQQVb8VYdj7a4G5NJHCw6o21ul7CvZoJkOpdTnsQDLT0tQ==", + "dependencies": { + "@smithy/querystring-parser": "^4.0.3", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.15.tgz", + "integrity": "sha512-bJJ/B8owQbHAflatSq92f9OcV8858DJBQF1Y3GRjB8psLyUjbISywszYPFw16beREHO/C3I3taW4VGH+tOuwrQ==", + "dependencies": { + "@smithy/property-provider": "^4.0.3", + "@smithy/smithy-client": "^4.3.0", + "@smithy/types": "^4.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.15.tgz", + "integrity": "sha512-8CUrEW2Ni5q+NmYkj8wsgkfqoP7l4ZquptFbq92yQE66xevc4SxqP2zH6tMtN158kgBqBDsZ+qlrRwXWOjCR8A==", + "dependencies": { + "@smithy/config-resolver": "^4.1.3", + "@smithy/credential-provider-imds": "^4.0.5", + "@smithy/node-config-provider": "^4.1.2", + "@smithy/property-provider": "^4.0.3", + "@smithy/smithy-client": "^4.3.0", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-endpoints": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.5.tgz", + "integrity": "sha512-PjDpqLk24/vAl340tmtCA++Q01GRRNH9cwL9qh46NspAX9S+IQVcK+GOzPt0GLJ6KYGyn8uOgo2kvJhiThclJw==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.2", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-middleware": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.3.tgz", + "integrity": "sha512-iIsC6qZXxkD7V3BzTw3b1uK8RVC1M8WvwNxK1PKrH9FnxntCd30CSunXjL/8iJBE8Z0J14r2P69njwIpRG4FBQ==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-retry": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.4.tgz", + "integrity": "sha512-Aoqr9W2jDYGrI6OxljN8VmLDQIGO4VdMAUKMf9RGqLG8hn6or+K41NEy1Y5dtum9q8F7e0obYAuKl2mt/GnpZg==", + "dependencies": { + "@smithy/service-error-classification": "^4.0.4", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-stream": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.1.tgz", + "integrity": "sha512-W3IR0x5DY6iVtjj5p902oNhD+Bz7vs5S+p6tppbPa509rV9BdeXZjGuRSCtVEad9FA0Mba+tNUtUmtnSI1nwUw==", + "dependencies": { + "@smithy/fetch-http-handler": "^5.0.3", + "@smithy/node-http-handler": "^4.0.5", + "@smithy/types": "^4.3.0", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-stream/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-waiter": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.4.tgz", + "integrity": "sha512-73aeIvHjtSB6fd9I08iFaQIGTICKpLrI3EtlWAkStVENGo1ARMq9qdoD4QwkY0RUp6A409xlgbD9NCCfCF5ieg==", + "dependencies": { + "@smithy/abort-controller": "^4.0.3", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@aws-sdk/client-sso": { "version": "3.282.0", "license": "Apache-2.0", @@ -3080,6 +5244,56 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.812.0.tgz", + "integrity": "sha512-SrEGXP1zs2Cy3jjOwM8eh+UZkr28z7rvjF+cgV4bpOti5F/mzPyVoIxDkG8BQ2sZdAwa9rgEhhOl4CcKjoJoTA==", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/types": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.804.0.tgz", + "integrity": "sha512-A9qnsy9zQ8G89vrPPlNG9d1d8QcKRGqJKqwyGgS0dclJpwy6d1EWgQLIolKPl6vcFpLoe6avLOLxr+h8ur5wpg==", + "dependencies": { + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/property-provider": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.3.tgz", + "integrity": "sha512-Wcn17QNdawJZcZZPBuMuzyBENVi1AXl4TdE0jvzo4vWX2x5df/oMlmr/9M5XAAC6+yae4kWZlOYIsNsgDrMU9A==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/types": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.0.tgz", + "integrity": "sha512-+1iaIQHthDh9yaLhRzaoQxRk+l9xlk+JjMFxGRhNLz+m9vKOkjNeU8QuB4w3xvzHyVR/BVlp/4AXDHjoRIkfgQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@aws-sdk/credential-provider-env": { "version": "3.272.0", "license": "Apache-2.0", @@ -3212,6 +5426,1049 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.812.0.tgz", + "integrity": "sha512-hT7Kr8Ao+NS9b8KCB/U8cmpr0DcWOZNZNRBGAOc4eq65JpsRv177QmSqjh75vhM9BzchH3VymcP4GeMoy4SuvA==", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.812.0", + "@aws-sdk/core": "3.812.0", + "@aws-sdk/credential-provider-cognito-identity": "3.812.0", + "@aws-sdk/credential-provider-env": "3.812.0", + "@aws-sdk/credential-provider-http": "3.812.0", + "@aws-sdk/credential-provider-ini": "3.812.0", + "@aws-sdk/credential-provider-node": "3.812.0", + "@aws-sdk/credential-provider-process": "3.812.0", + "@aws-sdk/credential-provider-sso": "3.812.0", + "@aws-sdk/credential-provider-web-identity": "3.812.0", + "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/config-resolver": "^4.1.2", + "@smithy/core": "^3.3.3", + "@smithy/credential-provider-imds": "^4.0.4", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/property-provider": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/client-sso": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.812.0.tgz", + "integrity": "sha512-O//smQRj1+RXELB7xX54s5pZB0V69KHXpUZmz8V+8GAYO1FKTHfbpUgK+zyMNb+lFZxG9B69yl8pWPZ/K8bvxA==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.812.0", + "@aws-sdk/middleware-host-header": "3.804.0", + "@aws-sdk/middleware-logger": "3.804.0", + "@aws-sdk/middleware-recursion-detection": "3.804.0", + "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/region-config-resolver": "3.808.0", + "@aws-sdk/types": "3.804.0", + "@aws-sdk/util-endpoints": "3.808.0", + "@aws-sdk/util-user-agent-browser": "3.804.0", + "@aws-sdk/util-user-agent-node": "3.812.0", + "@smithy/config-resolver": "^4.1.2", + "@smithy/core": "^3.3.3", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/hash-node": "^4.0.2", + "@smithy/invalid-dependency": "^4.0.2", + "@smithy/middleware-content-length": "^4.0.2", + "@smithy/middleware-endpoint": "^4.1.6", + "@smithy/middleware-retry": "^4.1.7", + "@smithy/middleware-serde": "^4.0.5", + "@smithy/middleware-stack": "^4.0.2", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.6", + "@smithy/types": "^4.2.0", + "@smithy/url-parser": "^4.0.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.14", + "@smithy/util-defaults-mode-node": "^4.0.14", + "@smithy/util-endpoints": "^3.0.4", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-retry": "^4.0.3", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/core": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.812.0.tgz", + "integrity": "sha512-myWA9oHMBVDObKrxG+puAkIGs8igcWInQ1PWCRTS/zN4BkhUMFjjh/JPV/4Vzvtvj5E36iujq2WtlrDLl1PpOw==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/core": "^3.3.3", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/property-provider": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/signature-v4": "^5.1.0", + "@smithy/smithy-client": "^4.2.6", + "@smithy/types": "^4.2.0", + "@smithy/util-middleware": "^4.0.2", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.812.0.tgz", + "integrity": "sha512-Ge7IEu06ANurGBZx39q9CNN/ncqb1K8lpKZCY969uNWO0/7YPhnplrRJGMZYIS35nD2mBm3ortEKjY/wMZZd5g==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.812.0.tgz", + "integrity": "sha512-Vux2U42vPGXeE407Lp6v3yVA65J7hBO9rB67LXshyGVi7VZLAYWc4mrZxNJNqabEkjcDEmMQQakLPT6zc5SvFw==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/property-provider": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.6", + "@smithy/types": "^4.2.0", + "@smithy/util-stream": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.812.0.tgz", + "integrity": "sha512-oltqGvQ488xtPY5wrNjbD+qQYYkuCjn30IDE1qKMxJ58EM6UVTQl3XV44Xq07xfF5gKwVJQkfIyOkRAguOVybg==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/credential-provider-env": "3.812.0", + "@aws-sdk/credential-provider-http": "3.812.0", + "@aws-sdk/credential-provider-process": "3.812.0", + "@aws-sdk/credential-provider-sso": "3.812.0", + "@aws-sdk/credential-provider-web-identity": "3.812.0", + "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/credential-provider-imds": "^4.0.4", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.812.0.tgz", + "integrity": "sha512-SnvSWBP6cr9nqx784eETnL2Zl7ZnMB/oJgFVEG1aejAGbT1H9gTpMwuUsBXk4u/mEYe3f1lh1Wqo+HwDgNkfrg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.812.0", + "@aws-sdk/credential-provider-http": "3.812.0", + "@aws-sdk/credential-provider-ini": "3.812.0", + "@aws-sdk/credential-provider-process": "3.812.0", + "@aws-sdk/credential-provider-sso": "3.812.0", + "@aws-sdk/credential-provider-web-identity": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/credential-provider-imds": "^4.0.4", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.812.0.tgz", + "integrity": "sha512-YI8bb153XeEOb59F9KtTZEwDAc14s2YHZz58+OFiJ2udnKsPV87mNiFhJPW6ba9nmOLXVat5XDcwtVT1b664wg==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.812.0.tgz", + "integrity": "sha512-ODsPcNhgiO6GOa82TVNskM97mml9rioe9Cbhemz48lkfDQPv1u06NaCR0o3FsvprX1sEhMvJTR3sE1fyEOzvJQ==", + "dependencies": { + "@aws-sdk/client-sso": "3.812.0", + "@aws-sdk/core": "3.812.0", + "@aws-sdk/token-providers": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.812.0.tgz", + "integrity": "sha512-E9Bmiujvm/Hp9DM/Vc1S+D0pQbx8/x4dR/zyAEZU9EoRq0duQOQ1reWYWbebYmL1OklcVpTfKV0a/VCwuAtGSg==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.804.0.tgz", + "integrity": "sha512-bum1hLVBrn2lJCi423Z2fMUYtsbkGI2s4N+2RI2WSjvbaVyMSv/WcejIrjkqiiMR+2Y7m5exgoKeg4/TODLDPQ==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-logger": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.804.0.tgz", + "integrity": "sha512-w/qLwL3iq0KOPQNat0Kb7sKndl9BtceigINwBU7SpkYWX9L/Lem6f8NPEKrC9Tl4wDBht3Yztub4oRTy/horJA==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.804.0.tgz", + "integrity": "sha512-zqHOrvLRdsUdN/ehYfZ9Tf8svhbiLLz5VaWUz22YndFv6m9qaAcijkpAOlKexsv3nLBMJdSdJ6GUTAeIy3BZzw==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.812.0.tgz", + "integrity": "sha512-r+HFwtSvnAs6Fydp4mijylrTX0og9p/xfxOcKsqhMuk3HpZAIcf9sSjRQI6MBusYklg7pnM4sGEnPAZIrdRotA==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@aws-sdk/util-endpoints": "3.808.0", + "@smithy/core": "^3.3.3", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.808.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.808.0.tgz", + "integrity": "sha512-9x2QWfphkARZY5OGkl9dJxZlSlYM2l5inFeo2bKntGuwg4A4YUe5h7d5yJ6sZbam9h43eBrkOdumx03DAkQF9A==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/types": "^4.2.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/token-providers": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.812.0.tgz", + "integrity": "sha512-dbVBaKxrxE708ub5uH3w+cmKIeRQas+2Xf6rpckhohYY+IiflGOdK6aLrp3T6dOQgr/FJ37iQtcYNonAG+yVBQ==", + "dependencies": { + "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/types": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.804.0.tgz", + "integrity": "sha512-A9qnsy9zQ8G89vrPPlNG9d1d8QcKRGqJKqwyGgS0dclJpwy6d1EWgQLIolKPl6vcFpLoe6avLOLxr+h8ur5wpg==", + "dependencies": { + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-endpoints": { + "version": "3.808.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.808.0.tgz", + "integrity": "sha512-N6Lic98uc4ADB7fLWlzx+1uVnq04VgVjngZvwHoujcRg9YDhIg9dUDiTzD5VZv13g1BrPYmvYP1HhsildpGV6w==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/types": "^4.2.0", + "@smithy/util-endpoints": "^3.0.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.804.0.tgz", + "integrity": "sha512-KfW6T6nQHHM/vZBBdGn6fMyG/MgX5lq82TDdX4HRQRRuHKLgBWGpKXqqvBwqIaCdXwWHgDrg2VQups6GqOWW2A==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/types": "^4.2.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.812.0.tgz", + "integrity": "sha512-8pt+OkHhS2U0LDwnzwRnFxyKn8sjSe752OIZQCNv263odud8jQu9pYO2pKqb2kRBk9h9szynjZBDLXfnvSQ7Bg==", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/abort-controller": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.3.tgz", + "integrity": "sha512-AqXFf6DXnuRBXy4SoK/n1mfgHaKaq36bmkphmD1KO0nHq6xK/g9KHSW4HEsPQUBCGdIEfuJifGHwxFXPIFay9Q==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/config-resolver": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.3.tgz", + "integrity": "sha512-N5e7ofiyYDmHxnPnqF8L4KtsbSDwyxFRfDK9bp1d9OyPO4ytRLd0/XxCqi5xVaaqB65v4woW8uey6jND6zxzxQ==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.2", + "@smithy/types": "^4.3.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/core": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.4.0.tgz", + "integrity": "sha512-dDYISQo7k0Ml/rXlFIjkTmTcQze/LxhtIRAEmZ6HJ/EI0inVxVEVnrUXJ7jPx6ZP0GHUhFm40iQcCgS5apXIXA==", + "dependencies": { + "@smithy/middleware-serde": "^4.0.6", + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.3", + "@smithy/util-stream": "^4.2.1", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/core/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.5.tgz", + "integrity": "sha512-saEAGwrIlkb9XxX/m5S5hOtzjoJPEK6Qw2f9pYTbIsMPOFyGSXBBTw95WbOyru8A1vIS2jVCCU1Qhz50QWG3IA==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.2", + "@smithy/property-provider": "^4.0.3", + "@smithy/types": "^4.3.0", + "@smithy/url-parser": "^4.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/fetch-http-handler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.3.tgz", + "integrity": "sha512-yBZwavI31roqTndNI7ONHqesfH01JmjJK6L3uUpZAhyAmr86LN5QiPzfyZGIxQmed8VEK2NRSQT3/JX5V1njfQ==", + "dependencies": { + "@smithy/protocol-http": "^5.1.1", + "@smithy/querystring-builder": "^4.0.3", + "@smithy/types": "^4.3.0", + "@smithy/util-base64": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/hash-node": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.3.tgz", + "integrity": "sha512-W5Uhy6v/aYrgtjh9y0YP332gIQcwccQ+EcfWhllL0B9rPae42JngTTUpb8W6wuxaNFzqps4xq5klHckSSOy5fw==", + "dependencies": { + "@smithy/types": "^4.3.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/hash-node/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/invalid-dependency": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.3.tgz", + "integrity": "sha512-1Bo8Ur1ZGqxvwTqBmv6DZEn0rXtwJGeqiiO2/JFcCtz3nBakOqeXbJBElXJMMzd0ghe8+eB6Dkw98nMYctgizg==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-content-length": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.3.tgz", + "integrity": "sha512-NE/Zph4BP5u16bzYq2csq9qD0T6UBLeg4AuNrwNJ7Gv9uLYaGEgelZUOdRndGdMGcUfSGvNlXGb2aA2hPCwJ6g==", + "dependencies": { + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-endpoint": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.7.tgz", + "integrity": "sha512-KDzM7Iajo6K7eIWNNtukykRT4eWwlHjCEsULZUaSfi/SRSBK8BPRqG5FsVfp58lUxcvre8GT8AIPIqndA0ERKw==", + "dependencies": { + "@smithy/core": "^3.4.0", + "@smithy/middleware-serde": "^4.0.6", + "@smithy/node-config-provider": "^4.1.2", + "@smithy/shared-ini-file-loader": "^4.0.3", + "@smithy/types": "^4.3.0", + "@smithy/url-parser": "^4.0.3", + "@smithy/util-middleware": "^4.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-retry": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.8.tgz", + "integrity": "sha512-e2OtQgFzzlSG0uCjcJmi02QuFSRTrpT11Eh2EcqqDFy7DYriteHZJkkf+4AsxsrGDugAtPFcWBz1aq06sSX5fQ==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.2", + "@smithy/protocol-http": "^5.1.1", + "@smithy/service-error-classification": "^4.0.4", + "@smithy/smithy-client": "^4.3.0", + "@smithy/types": "^4.3.0", + "@smithy/util-middleware": "^4.0.3", + "@smithy/util-retry": "^4.0.4", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-serde": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.6.tgz", + "integrity": "sha512-YECyl7uNII+jCr/9qEmCu8xYL79cU0fqjo0qxpcVIU18dAPHam/iYwcknAu4Jiyw1uN+sAx7/SMf/Kmef/Jjsg==", + "dependencies": { + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-stack": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.3.tgz", + "integrity": "sha512-baeV7t4jQfQtFxBADFmnhmqBmqR38dNU5cvEgHcMK/Kp3D3bEI0CouoX2Sr/rGuntR+Eg0IjXdxnGGTc6SbIkw==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/node-config-provider": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.2.tgz", + "integrity": "sha512-SUvNup8iU1v7fmM8XPk+27m36udmGCfSz+VZP5Gb0aJ3Ne0X28K/25gnsrg3X1rWlhcnhzNUUysKW/Ied46ivQ==", + "dependencies": { + "@smithy/property-provider": "^4.0.3", + "@smithy/shared-ini-file-loader": "^4.0.3", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/node-http-handler": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.5.tgz", + "integrity": "sha512-T7QglZC1vS7SPT44/1qSIAQEx5bFKb3LfO6zw/o4Xzt1eC5HNoH1TkS4lMYA9cWFbacUhx4hRl/blLun4EOCkg==", + "dependencies": { + "@smithy/abort-controller": "^4.0.3", + "@smithy/protocol-http": "^5.1.1", + "@smithy/querystring-builder": "^4.0.3", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/property-provider": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.3.tgz", + "integrity": "sha512-Wcn17QNdawJZcZZPBuMuzyBENVi1AXl4TdE0jvzo4vWX2x5df/oMlmr/9M5XAAC6+yae4kWZlOYIsNsgDrMU9A==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/protocol-http": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.1.tgz", + "integrity": "sha512-Vsay2mzq05DwNi9jK01yCFtfvu9HimmgC7a4HTs7lhX12Sx8aWsH0mfz6q/02yspSp+lOB+Q2HJwi4IV2GKz7A==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/querystring-builder": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.3.tgz", + "integrity": "sha512-UUzIWMVfPmDZcOutk2/r1vURZqavvQW0OHvgsyNV0cKupChvqg+/NKPRMaMEe+i8tP96IthMFeZOZWpV+E4RAw==", + "dependencies": { + "@smithy/types": "^4.3.0", + "@smithy/util-uri-escape": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/querystring-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.3.tgz", + "integrity": "sha512-K5M4ZJQpFCblOJ5Oyw7diICpFg1qhhR47m2/5Ef1PhGE19RaIZf50tjYFrxa6usqcuXyTiFPGo4d1geZdH4YcQ==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/service-error-classification": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.4.tgz", + "integrity": "sha512-W5ScbQ1bTzgH91kNEE2CvOzM4gXlDOqdow4m8vMFSIXCel2scbHwjflpVNnC60Y3F1m5i7w2gQg9lSnR+JsJAA==", + "dependencies": { + "@smithy/types": "^4.3.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.3.tgz", + "integrity": "sha512-vHwlrqhZGIoLwaH8vvIjpHnloShqdJ7SUPNM2EQtEox+yEDFTVQ7E+DLZ+6OhnYEgFUwPByJyz6UZaOu2tny6A==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/signature-v4": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.1.tgz", + "integrity": "sha512-zy8Repr5zvT0ja+Tf5wjV/Ba6vRrhdiDcp/ww6cvqYbSEudIkziDe3uppNRlFoCViyJXdPnLcwyZdDLA4CHzSg==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.3", + "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/signature-v4/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/smithy-client": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.3.0.tgz", + "integrity": "sha512-DNsRA38pN6tYHUjebmwD9e4KcgqTLldYQb2gC6K+oxXYdCTxPn6wV9+FvOa6wrU2FQEnGJoi+3GULzOTKck/tg==", + "dependencies": { + "@smithy/core": "^3.4.0", + "@smithy/middleware-endpoint": "^4.1.7", + "@smithy/middleware-stack": "^4.0.3", + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "@smithy/util-stream": "^4.2.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/types": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.0.tgz", + "integrity": "sha512-+1iaIQHthDh9yaLhRzaoQxRk+l9xlk+JjMFxGRhNLz+m9vKOkjNeU8QuB4w3xvzHyVR/BVlp/4AXDHjoRIkfgQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/url-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.3.tgz", + "integrity": "sha512-n5/DnosDu/tweOqUUNtUbu7eRIR4J/Wz9nL7V5kFYQQVb8VYdj7a4G5NJHCw6o21ul7CvZoJkOpdTnsQDLT0tQ==", + "dependencies": { + "@smithy/querystring-parser": "^4.0.3", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-base64/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.15.tgz", + "integrity": "sha512-bJJ/B8owQbHAflatSq92f9OcV8858DJBQF1Y3GRjB8psLyUjbISywszYPFw16beREHO/C3I3taW4VGH+tOuwrQ==", + "dependencies": { + "@smithy/property-provider": "^4.0.3", + "@smithy/smithy-client": "^4.3.0", + "@smithy/types": "^4.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.15.tgz", + "integrity": "sha512-8CUrEW2Ni5q+NmYkj8wsgkfqoP7l4ZquptFbq92yQE66xevc4SxqP2zH6tMtN158kgBqBDsZ+qlrRwXWOjCR8A==", + "dependencies": { + "@smithy/config-resolver": "^4.1.3", + "@smithy/credential-provider-imds": "^4.0.5", + "@smithy/node-config-provider": "^4.1.2", + "@smithy/property-provider": "^4.0.3", + "@smithy/smithy-client": "^4.3.0", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-endpoints": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.5.tgz", + "integrity": "sha512-PjDpqLk24/vAl340tmtCA++Q01GRRNH9cwL9qh46NspAX9S+IQVcK+GOzPt0GLJ6KYGyn8uOgo2kvJhiThclJw==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.2", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-middleware": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.3.tgz", + "integrity": "sha512-iIsC6qZXxkD7V3BzTw3b1uK8RVC1M8WvwNxK1PKrH9FnxntCd30CSunXjL/8iJBE8Z0J14r2P69njwIpRG4FBQ==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-retry": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.4.tgz", + "integrity": "sha512-Aoqr9W2jDYGrI6OxljN8VmLDQIGO4VdMAUKMf9RGqLG8hn6or+K41NEy1Y5dtum9q8F7e0obYAuKl2mt/GnpZg==", + "dependencies": { + "@smithy/service-error-classification": "^4.0.4", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-stream": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.1.tgz", + "integrity": "sha512-W3IR0x5DY6iVtjj5p902oNhD+Bz7vs5S+p6tppbPa509rV9BdeXZjGuRSCtVEad9FA0Mba+tNUtUmtnSI1nwUw==", + "dependencies": { + "@smithy/fetch-http-handler": "^5.0.3", + "@smithy/node-http-handler": "^4.0.5", + "@smithy/types": "^4.3.0", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-stream/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@aws-sdk/eventstream-codec": { "version": "3.272.0", "license": "Apache-2.0", @@ -3569,6 +6826,874 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.812.0.tgz", + "integrity": "sha512-FS/fImbEpJU3cXtBGR9fyVd+CP51eNKlvTMi3f4/6lSk3RmHjudNC9yEF/og3jtpT3O+7vsNOUW9mHco5IjdQQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.812.0", + "@aws-sdk/middleware-host-header": "3.804.0", + "@aws-sdk/middleware-logger": "3.804.0", + "@aws-sdk/middleware-recursion-detection": "3.804.0", + "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/region-config-resolver": "3.808.0", + "@aws-sdk/types": "3.804.0", + "@aws-sdk/util-endpoints": "3.808.0", + "@aws-sdk/util-user-agent-browser": "3.804.0", + "@aws-sdk/util-user-agent-node": "3.812.0", + "@smithy/config-resolver": "^4.1.2", + "@smithy/core": "^3.3.3", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/hash-node": "^4.0.2", + "@smithy/invalid-dependency": "^4.0.2", + "@smithy/middleware-content-length": "^4.0.2", + "@smithy/middleware-endpoint": "^4.1.6", + "@smithy/middleware-retry": "^4.1.7", + "@smithy/middleware-serde": "^4.0.5", + "@smithy/middleware-stack": "^4.0.2", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.6", + "@smithy/types": "^4.2.0", + "@smithy/url-parser": "^4.0.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.14", + "@smithy/util-defaults-mode-node": "^4.0.14", + "@smithy/util-endpoints": "^3.0.4", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-retry": "^4.0.3", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/core": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.812.0.tgz", + "integrity": "sha512-myWA9oHMBVDObKrxG+puAkIGs8igcWInQ1PWCRTS/zN4BkhUMFjjh/JPV/4Vzvtvj5E36iujq2WtlrDLl1PpOw==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/core": "^3.3.3", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/property-provider": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/signature-v4": "^5.1.0", + "@smithy/smithy-client": "^4.2.6", + "@smithy/types": "^4.2.0", + "@smithy/util-middleware": "^4.0.2", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.804.0.tgz", + "integrity": "sha512-bum1hLVBrn2lJCi423Z2fMUYtsbkGI2s4N+2RI2WSjvbaVyMSv/WcejIrjkqiiMR+2Y7m5exgoKeg4/TODLDPQ==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-logger": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.804.0.tgz", + "integrity": "sha512-w/qLwL3iq0KOPQNat0Kb7sKndl9BtceigINwBU7SpkYWX9L/Lem6f8NPEKrC9Tl4wDBht3Yztub4oRTy/horJA==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.804.0.tgz", + "integrity": "sha512-zqHOrvLRdsUdN/ehYfZ9Tf8svhbiLLz5VaWUz22YndFv6m9qaAcijkpAOlKexsv3nLBMJdSdJ6GUTAeIy3BZzw==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.812.0.tgz", + "integrity": "sha512-r+HFwtSvnAs6Fydp4mijylrTX0og9p/xfxOcKsqhMuk3HpZAIcf9sSjRQI6MBusYklg7pnM4sGEnPAZIrdRotA==", + "dependencies": { + "@aws-sdk/core": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@aws-sdk/util-endpoints": "3.808.0", + "@smithy/core": "^3.3.3", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.808.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.808.0.tgz", + "integrity": "sha512-9x2QWfphkARZY5OGkl9dJxZlSlYM2l5inFeo2bKntGuwg4A4YUe5h7d5yJ6sZbam9h43eBrkOdumx03DAkQF9A==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/types": "^4.2.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/types": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.804.0.tgz", + "integrity": "sha512-A9qnsy9zQ8G89vrPPlNG9d1d8QcKRGqJKqwyGgS0dclJpwy6d1EWgQLIolKPl6vcFpLoe6avLOLxr+h8ur5wpg==", + "dependencies": { + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-endpoints": { + "version": "3.808.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.808.0.tgz", + "integrity": "sha512-N6Lic98uc4ADB7fLWlzx+1uVnq04VgVjngZvwHoujcRg9YDhIg9dUDiTzD5VZv13g1BrPYmvYP1HhsildpGV6w==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/types": "^4.2.0", + "@smithy/util-endpoints": "^3.0.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.804.0.tgz", + "integrity": "sha512-KfW6T6nQHHM/vZBBdGn6fMyG/MgX5lq82TDdX4HRQRRuHKLgBWGpKXqqvBwqIaCdXwWHgDrg2VQups6GqOWW2A==", + "dependencies": { + "@aws-sdk/types": "3.804.0", + "@smithy/types": "^4.2.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.812.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.812.0.tgz", + "integrity": "sha512-8pt+OkHhS2U0LDwnzwRnFxyKn8sjSe752OIZQCNv263odud8jQu9pYO2pKqb2kRBk9h9szynjZBDLXfnvSQ7Bg==", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/types": "3.804.0", + "@smithy/node-config-provider": "^4.1.1", + "@smithy/types": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/abort-controller": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.3.tgz", + "integrity": "sha512-AqXFf6DXnuRBXy4SoK/n1mfgHaKaq36bmkphmD1KO0nHq6xK/g9KHSW4HEsPQUBCGdIEfuJifGHwxFXPIFay9Q==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/config-resolver": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.3.tgz", + "integrity": "sha512-N5e7ofiyYDmHxnPnqF8L4KtsbSDwyxFRfDK9bp1d9OyPO4ytRLd0/XxCqi5xVaaqB65v4woW8uey6jND6zxzxQ==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.2", + "@smithy/types": "^4.3.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/core": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.4.0.tgz", + "integrity": "sha512-dDYISQo7k0Ml/rXlFIjkTmTcQze/LxhtIRAEmZ6HJ/EI0inVxVEVnrUXJ7jPx6ZP0GHUhFm40iQcCgS5apXIXA==", + "dependencies": { + "@smithy/middleware-serde": "^4.0.6", + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.3", + "@smithy/util-stream": "^4.2.1", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.5.tgz", + "integrity": "sha512-saEAGwrIlkb9XxX/m5S5hOtzjoJPEK6Qw2f9pYTbIsMPOFyGSXBBTw95WbOyru8A1vIS2jVCCU1Qhz50QWG3IA==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.2", + "@smithy/property-provider": "^4.0.3", + "@smithy/types": "^4.3.0", + "@smithy/url-parser": "^4.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/fetch-http-handler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.3.tgz", + "integrity": "sha512-yBZwavI31roqTndNI7ONHqesfH01JmjJK6L3uUpZAhyAmr86LN5QiPzfyZGIxQmed8VEK2NRSQT3/JX5V1njfQ==", + "dependencies": { + "@smithy/protocol-http": "^5.1.1", + "@smithy/querystring-builder": "^4.0.3", + "@smithy/types": "^4.3.0", + "@smithy/util-base64": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/hash-node": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.3.tgz", + "integrity": "sha512-W5Uhy6v/aYrgtjh9y0YP332gIQcwccQ+EcfWhllL0B9rPae42JngTTUpb8W6wuxaNFzqps4xq5klHckSSOy5fw==", + "dependencies": { + "@smithy/types": "^4.3.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/hash-node/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/invalid-dependency": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.3.tgz", + "integrity": "sha512-1Bo8Ur1ZGqxvwTqBmv6DZEn0rXtwJGeqiiO2/JFcCtz3nBakOqeXbJBElXJMMzd0ghe8+eB6Dkw98nMYctgizg==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-content-length": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.3.tgz", + "integrity": "sha512-NE/Zph4BP5u16bzYq2csq9qD0T6UBLeg4AuNrwNJ7Gv9uLYaGEgelZUOdRndGdMGcUfSGvNlXGb2aA2hPCwJ6g==", + "dependencies": { + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-endpoint": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.7.tgz", + "integrity": "sha512-KDzM7Iajo6K7eIWNNtukykRT4eWwlHjCEsULZUaSfi/SRSBK8BPRqG5FsVfp58lUxcvre8GT8AIPIqndA0ERKw==", + "dependencies": { + "@smithy/core": "^3.4.0", + "@smithy/middleware-serde": "^4.0.6", + "@smithy/node-config-provider": "^4.1.2", + "@smithy/shared-ini-file-loader": "^4.0.3", + "@smithy/types": "^4.3.0", + "@smithy/url-parser": "^4.0.3", + "@smithy/util-middleware": "^4.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-retry": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.8.tgz", + "integrity": "sha512-e2OtQgFzzlSG0uCjcJmi02QuFSRTrpT11Eh2EcqqDFy7DYriteHZJkkf+4AsxsrGDugAtPFcWBz1aq06sSX5fQ==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.2", + "@smithy/protocol-http": "^5.1.1", + "@smithy/service-error-classification": "^4.0.4", + "@smithy/smithy-client": "^4.3.0", + "@smithy/types": "^4.3.0", + "@smithy/util-middleware": "^4.0.3", + "@smithy/util-retry": "^4.0.4", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-serde": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.6.tgz", + "integrity": "sha512-YECyl7uNII+jCr/9qEmCu8xYL79cU0fqjo0qxpcVIU18dAPHam/iYwcknAu4Jiyw1uN+sAx7/SMf/Kmef/Jjsg==", + "dependencies": { + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-stack": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.3.tgz", + "integrity": "sha512-baeV7t4jQfQtFxBADFmnhmqBmqR38dNU5cvEgHcMK/Kp3D3bEI0CouoX2Sr/rGuntR+Eg0IjXdxnGGTc6SbIkw==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-config-provider": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.2.tgz", + "integrity": "sha512-SUvNup8iU1v7fmM8XPk+27m36udmGCfSz+VZP5Gb0aJ3Ne0X28K/25gnsrg3X1rWlhcnhzNUUysKW/Ied46ivQ==", + "dependencies": { + "@smithy/property-provider": "^4.0.3", + "@smithy/shared-ini-file-loader": "^4.0.3", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-http-handler": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.5.tgz", + "integrity": "sha512-T7QglZC1vS7SPT44/1qSIAQEx5bFKb3LfO6zw/o4Xzt1eC5HNoH1TkS4lMYA9cWFbacUhx4hRl/blLun4EOCkg==", + "dependencies": { + "@smithy/abort-controller": "^4.0.3", + "@smithy/protocol-http": "^5.1.1", + "@smithy/querystring-builder": "^4.0.3", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/property-provider": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.3.tgz", + "integrity": "sha512-Wcn17QNdawJZcZZPBuMuzyBENVi1AXl4TdE0jvzo4vWX2x5df/oMlmr/9M5XAAC6+yae4kWZlOYIsNsgDrMU9A==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/protocol-http": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.1.tgz", + "integrity": "sha512-Vsay2mzq05DwNi9jK01yCFtfvu9HimmgC7a4HTs7lhX12Sx8aWsH0mfz6q/02yspSp+lOB+Q2HJwi4IV2GKz7A==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/querystring-builder": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.3.tgz", + "integrity": "sha512-UUzIWMVfPmDZcOutk2/r1vURZqavvQW0OHvgsyNV0cKupChvqg+/NKPRMaMEe+i8tP96IthMFeZOZWpV+E4RAw==", + "dependencies": { + "@smithy/types": "^4.3.0", + "@smithy/util-uri-escape": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/querystring-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.3.tgz", + "integrity": "sha512-K5M4ZJQpFCblOJ5Oyw7diICpFg1qhhR47m2/5Ef1PhGE19RaIZf50tjYFrxa6usqcuXyTiFPGo4d1geZdH4YcQ==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/service-error-classification": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.4.tgz", + "integrity": "sha512-W5ScbQ1bTzgH91kNEE2CvOzM4gXlDOqdow4m8vMFSIXCel2scbHwjflpVNnC60Y3F1m5i7w2gQg9lSnR+JsJAA==", + "dependencies": { + "@smithy/types": "^4.3.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.3.tgz", + "integrity": "sha512-vHwlrqhZGIoLwaH8vvIjpHnloShqdJ7SUPNM2EQtEox+yEDFTVQ7E+DLZ+6OhnYEgFUwPByJyz6UZaOu2tny6A==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/signature-v4": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.1.tgz", + "integrity": "sha512-zy8Repr5zvT0ja+Tf5wjV/Ba6vRrhdiDcp/ww6cvqYbSEudIkziDe3uppNRlFoCViyJXdPnLcwyZdDLA4CHzSg==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.3", + "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/smithy-client": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.3.0.tgz", + "integrity": "sha512-DNsRA38pN6tYHUjebmwD9e4KcgqTLldYQb2gC6K+oxXYdCTxPn6wV9+FvOa6wrU2FQEnGJoi+3GULzOTKck/tg==", + "dependencies": { + "@smithy/core": "^3.4.0", + "@smithy/middleware-endpoint": "^4.1.7", + "@smithy/middleware-stack": "^4.0.3", + "@smithy/protocol-http": "^5.1.1", + "@smithy/types": "^4.3.0", + "@smithy/util-stream": "^4.2.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/types": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.0.tgz", + "integrity": "sha512-+1iaIQHthDh9yaLhRzaoQxRk+l9xlk+JjMFxGRhNLz+m9vKOkjNeU8QuB4w3xvzHyVR/BVlp/4AXDHjoRIkfgQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/url-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.3.tgz", + "integrity": "sha512-n5/DnosDu/tweOqUUNtUbu7eRIR4J/Wz9nL7V5kFYQQVb8VYdj7a4G5NJHCw6o21ul7CvZoJkOpdTnsQDLT0tQ==", + "dependencies": { + "@smithy/querystring-parser": "^4.0.3", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.15.tgz", + "integrity": "sha512-bJJ/B8owQbHAflatSq92f9OcV8858DJBQF1Y3GRjB8psLyUjbISywszYPFw16beREHO/C3I3taW4VGH+tOuwrQ==", + "dependencies": { + "@smithy/property-provider": "^4.0.3", + "@smithy/smithy-client": "^4.3.0", + "@smithy/types": "^4.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.15.tgz", + "integrity": "sha512-8CUrEW2Ni5q+NmYkj8wsgkfqoP7l4ZquptFbq92yQE66xevc4SxqP2zH6tMtN158kgBqBDsZ+qlrRwXWOjCR8A==", + "dependencies": { + "@smithy/config-resolver": "^4.1.3", + "@smithy/credential-provider-imds": "^4.0.5", + "@smithy/node-config-provider": "^4.1.2", + "@smithy/property-provider": "^4.0.3", + "@smithy/smithy-client": "^4.3.0", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-endpoints": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.5.tgz", + "integrity": "sha512-PjDpqLk24/vAl340tmtCA++Q01GRRNH9cwL9qh46NspAX9S+IQVcK+GOzPt0GLJ6KYGyn8uOgo2kvJhiThclJw==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.2", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-middleware": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.3.tgz", + "integrity": "sha512-iIsC6qZXxkD7V3BzTw3b1uK8RVC1M8WvwNxK1PKrH9FnxntCd30CSunXjL/8iJBE8Z0J14r2P69njwIpRG4FBQ==", + "dependencies": { + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-retry": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.4.tgz", + "integrity": "sha512-Aoqr9W2jDYGrI6OxljN8VmLDQIGO4VdMAUKMf9RGqLG8hn6or+K41NEy1Y5dtum9q8F7e0obYAuKl2mt/GnpZg==", + "dependencies": { + "@smithy/service-error-classification": "^4.0.4", + "@smithy/types": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-stream": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.1.tgz", + "integrity": "sha512-W3IR0x5DY6iVtjj5p902oNhD+Bz7vs5S+p6tppbPa509rV9BdeXZjGuRSCtVEad9FA0Mba+tNUtUmtnSI1nwUw==", + "dependencies": { + "@smithy/fetch-http-handler": "^5.0.3", + "@smithy/node-http-handler": "^4.0.5", + "@smithy/types": "^4.3.0", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-stream/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@aws-sdk/node-config-provider": { "version": "3.272.0", "license": "Apache-2.0", @@ -4880,6 +9005,14 @@ "dev": true, "license": "MIT" }, + "node_modules/@google/generative-ai": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.21.0.tgz", + "integrity": "sha512-7XhUbtnlkSEZK15kN3t+tzIMxsbKm/dSkKBFalj+20NvPKe1kBY7mR2P7vuijEn+f06z5+A8bVGKO0v39cr6Wg==", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@grpc/grpc-js": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.12.2.tgz", @@ -5563,15 +9696,6 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/@js-sdsl/ordered-map": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", @@ -5950,6 +10074,17 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@mistralai/mistralai": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-1.6.0.tgz", + "integrity": "sha512-PQwGV3+n7FbE7Dp3Vnd8DAa3ffx6WuVV966Gfmf4QvzwcO3Mvxpz0SnJ/PjaZcsCwApBCZpNyQzvarAKEQLKeQ==", + "dependencies": { + "zod-to-json-schema": "^3.24.1" + }, + "peerDependencies": { + "zod": ">= 3" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "dev": true, @@ -7503,6 +11638,37 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, + "node_modules/@qdrant/js-client-rest": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@qdrant/js-client-rest/-/js-client-rest-1.14.0.tgz", + "integrity": "sha512-2sM2g17FSkN2sNCSeAfqxHRr+SPEVnUQLXBjVv/whm4YQ4JjZ53Jiy1iShk95G+xBf3hKBhJdj8itRnor03IYw==", + "dependencies": { + "@qdrant/openapi-typescript-fetch": "1.2.6", + "@sevinf/maybe": "0.5.0", + "undici": "~5.28.5" + }, + "engines": { + "node": ">=18.0.0", + "pnpm": ">=8" + }, + "peerDependencies": { + "typescript": ">=4.7" + } + }, + "node_modules/@qdrant/openapi-typescript-fetch": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@qdrant/openapi-typescript-fetch/-/openapi-typescript-fetch-1.2.6.tgz", + "integrity": "sha512-oQG/FejNpItrxRHoyctYvT3rwGZOnK4jr3JdppO/c78ktDvkWiPXPHNsrDf33K9sZdRb6PR7gi4noIapu5q4HA==", + "engines": { + "node": ">=18.0.0", + "pnpm": ">=8" + } + }, + "node_modules/@sevinf/maybe": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@sevinf/maybe/-/maybe-0.5.0.tgz", + "integrity": "sha512-ARhyoYDnY1LES3vYI0fiG6e9esWfTNcXcO6+MPJJXcnyMV3bim4lnFt45VXouV7y82F4x3YH8nOQ6VztuvUiWg==" + }, "node_modules/@sigstore/bundle": { "version": "1.1.0", "dev": true, @@ -7636,6 +11802,17 @@ "dev": true, "license": "MIT" }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, "node_modules/@sinonjs/commons": { "version": "2.0.0", "dev": true, @@ -8365,10 +12542,33 @@ "@supabase/storage-js": "2.5.5" } }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tooljet-marketplace/anthropic": { + "resolved": "plugins/anthropic", + "link": true + }, "node_modules/@tooljet-marketplace/awsredshift": { "resolved": "plugins/awsredshift", "link": true }, + "node_modules/@tooljet-marketplace/azurerepos": { + "resolved": "plugins/azurerepos", + "link": true + }, + "node_modules/@tooljet-marketplace/cohere": { + "resolved": "plugins/cohere", + "link": true + }, "node_modules/@tooljet-marketplace/common": { "resolved": "plugins/common", "link": true @@ -8377,6 +12577,10 @@ "resolved": "plugins/engagespot", "link": true }, + "node_modules/@tooljet-marketplace/gemini": { + "resolved": "plugins/gemini", + "link": true + }, "node_modules/@tooljet-marketplace/github": { "resolved": "plugins/github", "link": true @@ -8385,6 +12589,14 @@ "resolved": "plugins/harperdb", "link": true }, + "node_modules/@tooljet-marketplace/huggingface": { + "resolved": "plugins/hugging_face", + "link": true + }, + "node_modules/@tooljet-marketplace/mistral": { + "resolved": "plugins/mistral_ai", + "link": true + }, "node_modules/@tooljet-marketplace/openai": { "resolved": "plugins/openai", "link": true @@ -8409,6 +12621,10 @@ "resolved": "plugins/presto", "link": true }, + "node_modules/@tooljet-marketplace/qdrant": { + "resolved": "plugins/qdrant", + "link": true + }, "node_modules/@tooljet-marketplace/s3": { "resolved": "plugins/s3", "link": true @@ -8429,6 +12645,10 @@ "resolved": "plugins/textract", "link": true }, + "node_modules/@tooljet-marketplace/weaviate": { + "resolved": "plugins/weaviate", + "link": true + }, "node_modules/@tooljet-plugins/aws-lambda": { "resolved": "plugins/aws-lambda", "link": true @@ -8536,6 +12756,17 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, "node_modules/@types/graceful-fs": { "version": "4.1.6", "dev": true, @@ -8545,6 +12776,11 @@ "@types/node": "*" } }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "dev": true, @@ -8580,6 +12816,14 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/minimatch": { "version": "3.0.5", "dev": true, @@ -8622,6 +12866,14 @@ "license": "MIT", "peer": true }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/semver": { "version": "7.3.13", "dev": true, @@ -8632,6 +12884,11 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==" + }, "node_modules/@types/ws": { "version": "8.5.10", "license": "MIT", @@ -9200,8 +13457,10 @@ } }, "node_modules/aws-sdk": { - "version": "2.1511.0", - "license": "Apache-2.0", + "version": "2.1692.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1692.0.tgz", + "integrity": "sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw==", + "hasInstallScript": true, "dependencies": { "buffer": "4.9.2", "events": "1.1.1", @@ -9212,15 +13471,16 @@ "url": "0.10.3", "util": "^0.12.4", "uuid": "8.0.0", - "xml2js": "0.5.0" + "xml2js": "0.6.2" }, "engines": { "node": ">= 10.0.0" } }, "node_modules/aws-sdk/node_modules/xml2js": { - "version": "0.5.0", - "license": "MIT", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -9231,7 +13491,8 @@ }, "node_modules/aws-sdk/node_modules/xmlbuilder": { "version": "11.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "engines": { "node": ">=4.0" } @@ -9254,6 +13515,18 @@ "follow-redirects": "^1.14.0" } }, + "node_modules/azure-devops-node-api": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-14.1.0.tgz", + "integrity": "sha512-QhpgjH1LQ+vgDJ7oBwcmsZ3+o4ZpjLVilw0D3oJQpYpRzN+L39lk5jZDLJ464hLUgsDzWn/Ksv7zLLMKLfoBzA==", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "2.1.0" + }, + "engines": { + "node": ">= 16.0.0" + } + }, "node_modules/babel-jest": { "version": "29.5.0", "dev": true, @@ -9692,6 +13965,45 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/call-bind": { "version": "1.0.2", "license": "MIT", @@ -9703,6 +14015,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "dev": true, @@ -9883,6 +14222,17 @@ "node": ">=0.10.0" } }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cmd-shim": { "version": "5.0.0", "dev": true, @@ -9904,6 +14254,267 @@ "node": ">= 0.12.0" } }, + "node_modules/cohere-ai": { + "version": "7.17.1", + "resolved": "https://registry.npmjs.org/cohere-ai/-/cohere-ai-7.17.1.tgz", + "integrity": "sha512-GI/uWVYYGIN3gdjJRlbjEaLJNJVXsUJyOlPqwBWgAmK18kP4CJoErxKwU0aLe3tHHOBcC2RqXe6PmGO0dz7dpQ==", + "dependencies": { + "@aws-sdk/client-sagemaker": "^3.583.0", + "@aws-sdk/credential-providers": "^3.583.0", + "@aws-sdk/protocol-http": "^3.374.0", + "@aws-sdk/signature-v4": "^3.374.0", + "convict": "^6.2.4", + "form-data": "^4.0.0", + "form-data-encoder": "^4.0.2", + "formdata-node": "^6.0.3", + "js-base64": "3.7.2", + "node-fetch": "2.7.0", + "qs": "6.11.2", + "readable-stream": "^4.5.2", + "url-join": "4.0.1" + } + }, + "node_modules/cohere-ai/node_modules/@aws-sdk/protocol-http": { + "version": "3.374.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.374.0.tgz", + "integrity": "sha512-9WpRUbINdGroV3HiZZIBoJvL2ndoWk39OfwxWs2otxByppJZNN14bg/lvCx5e8ggHUti7IBk5rb0nqQZ4m05pg==", + "deprecated": "This package has moved to @smithy/protocol-http", + "dependencies": { + "@smithy/protocol-http": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/cohere-ai/node_modules/@aws-sdk/signature-v4": { + "version": "3.374.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.374.0.tgz", + "integrity": "sha512-2xLJvSdzcZZAg0lsDLUAuSQuihzK0dcxIK7WmfuJeF7DGKJFmp9czQmz5f3qiDz6IDQzvgK1M9vtJSVCslJbyQ==", + "deprecated": "This package has moved to @smithy/signature-v4", + "dependencies": { + "@smithy/signature-v4": "^1.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/cohere-ai/node_modules/@smithy/eventstream-codec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-1.1.0.tgz", + "integrity": "sha512-3tEbUb8t8an226jKB6V/Q2XU/J53lCwCzULuBPEaF4JjSh+FlCMp7TmogE/Aij5J9DwlsZ4VAD/IRDuQ/0ZtMw==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^1.2.0", + "@smithy/util-hex-encoding": "^1.1.0", + "tslib": "^2.5.0" + } + }, + "node_modules/cohere-ai/node_modules/@smithy/is-array-buffer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.1.0.tgz", + "integrity": "sha512-twpQ/n+3OWZJ7Z+xu43MJErmhB/WO/mMTnqR6PwWQShvSJ/emx5d1N59LQZk6ZpTAeuRWrc+eHhkzTp9NFjNRQ==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/cohere-ai/node_modules/@smithy/protocol-http": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.2.0.tgz", + "integrity": "sha512-GfGfruksi3nXdFok5RhgtOnWe5f6BndzYfmEXISD+5gAGdayFGpjWu5pIqIweTudMtse20bGbc+7MFZXT1Tb8Q==", + "dependencies": { + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/cohere-ai/node_modules/@smithy/signature-v4": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-1.1.0.tgz", + "integrity": "sha512-fDo3m7YqXBs7neciOePPd/X9LPm5QLlDMdIC4m1H6dgNLnXfLMFNIxEfPyohGA8VW9Wn4X8lygnPSGxDZSmp0Q==", + "dependencies": { + "@smithy/eventstream-codec": "^1.1.0", + "@smithy/is-array-buffer": "^1.1.0", + "@smithy/types": "^1.2.0", + "@smithy/util-hex-encoding": "^1.1.0", + "@smithy/util-middleware": "^1.1.0", + "@smithy/util-uri-escape": "^1.1.0", + "@smithy/util-utf8": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/cohere-ai/node_modules/@smithy/types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", + "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/cohere-ai/node_modules/@smithy/util-buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.1.0.tgz", + "integrity": "sha512-9m6NXE0ww+ra5HKHCHig20T+FAwxBAm7DIdwc/767uGWbRcY720ybgPacQNB96JMOI7xVr/CDa3oMzKmW4a+kw==", + "dependencies": { + "@smithy/is-array-buffer": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/cohere-ai/node_modules/@smithy/util-hex-encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.1.0.tgz", + "integrity": "sha512-7UtIE9eH0u41zpB60Jzr0oNCQ3hMJUabMcKRUVjmyHTXiWDE4vjSqN6qlih7rCNeKGbioS7f/y2Jgym4QZcKFg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/cohere-ai/node_modules/@smithy/util-middleware": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-1.1.0.tgz", + "integrity": "sha512-6hhckcBqVgjWAqLy2vqlPZ3rfxLDhFWEmM7oLh2POGvsi7j0tHkbN7w4DFhuBExVJAbJ/qqxqZdRY6Fu7/OezQ==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/cohere-ai/node_modules/@smithy/util-uri-escape": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.1.0.tgz", + "integrity": "sha512-/jL/V1xdVRt5XppwiaEU8Etp5WHZj609n0xMTuehmCqdoOFbId1M+aEeDWZsQ+8JbEB/BJ6ynY2SlYmOaKtt8w==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/cohere-ai/node_modules/@smithy/util-utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-1.1.0.tgz", + "integrity": "sha512-p/MYV+JmqmPyjdgyN2UxAeYDj9cBqCjp0C/NsTWnnjoZUVqoeZ6IrW915L9CAKWVECgv9lVQGc4u/yz26/bI1A==", + "dependencies": { + "@smithy/util-buffer-from": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/cohere-ai/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/cohere-ai/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/cohere-ai/node_modules/form-data-encoder": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.0.2.tgz", + "integrity": "sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/cohere-ai/node_modules/formdata-node": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-6.0.3.tgz", + "integrity": "sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/cohere-ai/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/cohere-ai/node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/cohere-ai/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/collect-v8-coverage": { "version": "1.0.1", "dev": true, @@ -10185,6 +14796,26 @@ "license": "MIT", "peer": true }, + "node_modules/convict": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/convict/-/convict-6.2.4.tgz", + "integrity": "sha512-qN60BAwdMVdofckX7AlohVJ2x9UvjTNoKVXCL2LxFk1l7757EJqf1nySdMkPQer0bt8kQ5lQiyZ9/2NvrFBuwQ==", + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "yargs-parser": "^20.2.7" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/convict/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, "node_modules/core-js": { "version": "3.38.0", "hasInstallScript": true, @@ -10345,6 +14976,31 @@ "node": ">=0.10.0" } }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/dedent": { "version": "0.7.0", "dev": true, @@ -10375,6 +15031,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "engines": { + "node": ">=10" + } + }, "node_modules/define-lazy-prop": { "version": "2.0.0", "dev": true, @@ -10421,6 +15085,15 @@ "dev": true, "license": "ISC" }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, "node_modules/detect-indent": { "version": "5.0.0", "dev": true, @@ -10490,6 +15163,19 @@ "node": ">=10" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "dev": true, @@ -10570,7 +15256,6 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", - "dev": true, "license": "MIT", "dependencies": { "once": "^1.4.0" @@ -10619,6 +15304,33 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escalade": { "version": "3.1.1", "license": "MIT", @@ -11296,8 +16008,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "license": "MIT" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gauge": { "version": "4.0.4", @@ -11334,12 +16050,23 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "license": "MIT", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11429,6 +16156,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.0", "dev": true, @@ -11596,15 +16335,40 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "license": "ISC" @@ -11669,6 +16433,7 @@ }, "node_modules/has": { "version": "1.0.3", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.1" @@ -11685,8 +16450,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "license": "MIT", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -11712,6 +16478,17 @@ "dev": true, "license": "ISC" }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hosted-git-info": { "version": "6.1.1", "dev": true, @@ -11739,7 +16516,6 @@ }, "node_modules/http-cache-semantics": { "version": "4.1.1", - "dev": true, "license": "BSD-2-Clause" }, "node_modules/http-parser-js": { @@ -11772,6 +16548,29 @@ "npm": ">=1.3.7" } }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/http2-wrapper/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "license": "MIT", @@ -13280,6 +18079,16 @@ "node": ">= 0.6.0" } }, + "node_modules/js-base64": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.2.tgz", + "integrity": "sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ==" + }, + "node_modules/js-md4": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz", + "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==" + }, "node_modules/js-sdsl": { "version": "4.4.0", "dev": true, @@ -13451,6 +18260,11 @@ "node": ">=4.0" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "dev": true, @@ -13599,6 +18413,14 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "dev": true, @@ -14102,6 +18924,11 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, "node_modules/lodash.includes": { "version": "4.3.0", "license": "MIT" @@ -14175,6 +19002,14 @@ "loose-envify": "cli.js" } }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "license": "ISC", @@ -14412,6 +19247,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/meow": { "version": "8.1.2", "dev": true, @@ -14650,6 +19493,14 @@ "node": ">=6" } }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, "node_modules/min-indent": { "version": "1.0.1", "dev": true, @@ -14658,6 +19509,11 @@ "node": ">=4" } }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, "node_modules/minimatch": { "version": "3.1.2", "license": "ISC", @@ -14975,8 +19831,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.9", - "license": "MIT", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -15116,6 +19973,17 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/npm-bundled": { "version": "3.0.1", "dev": true, @@ -15689,6 +20557,17 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/octokit": { "version": "4.0.2", "license": "MIT", @@ -15973,6 +20852,14 @@ "node": ">=0.10.0" } }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "engines": { + "node": ">=8" + } + }, "node_modules/p-finally": { "version": "1.0.0", "dev": true, @@ -16685,6 +21572,14 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "dev": true, @@ -16785,6 +21680,15 @@ "version": "1.9.0", "license": "MIT" }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "1.3.2", "license": "MIT" @@ -17271,6 +22175,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, "node_modules/resolve-cwd": { "version": "3.0.0", "dev": true, @@ -17307,6 +22216,17 @@ "node": ">=10" } }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/restore-cursor": { "version": "3.1.0", "license": "MIT", @@ -17460,6 +22380,74 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "3.0.7", "license": "ISC" @@ -18321,6 +23309,14 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "license": "Apache-2.0", @@ -18366,6 +23362,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-rest-client": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-2.1.0.tgz", + "integrity": "sha512-Nel9aPbgSzRxfs1+4GoSB4wexCF+4Axlk7OSGVQCMa+4fWcyxIsN/YNmkp0xTT2iQzMD98h8yFLav/cNaULmRA==", + "dependencies": { + "des.js": "^1.1.0", + "js-md4": "^0.3.2", + "qs": "^6.10.3", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + }, + "engines": { + "node": ">= 16.0.0" + } + }, + "node_modules/typed-rest-client/node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typedarray": { "version": "0.0.6", "dev": true, @@ -18394,10 +23419,15 @@ "node": ">=0.8.0" } }, + "node_modules/underscore": { + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==" + }, "node_modules/undici": { - "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "version": "5.28.5", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.5.tgz", + "integrity": "sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -18522,6 +23552,11 @@ "querystring": "0.2.0" } }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" + }, "node_modules/utf8": { "version": "2.1.2", "license": "MIT" @@ -18934,6 +23969,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "3.25.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.13.tgz", + "integrity": "sha512-Q8mvk2iWi7rTDfpQBsu4ziE7A6AxgzJ5hzRyRYQkoV3A3niYsXVwDaP1Kbz3nWav6S+VZ6k2OznFn8ZyDHvIrg==", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "peerDependencies": { + "zod": "^3.24.1" + } + }, + "plugins/anthropic": { + "name": "@tooljet-marketplace/anthropic", + "version": "1.0.0", + "dependencies": { + "@anthropic-ai/sdk": "^0.32.1", + "@tooljet-marketplace/common": "^1.0.0" + }, + "devDependencies": { + "@vercel/ncc": "^0.34.0", + "typescript": "^4.7.4" + } + }, "plugins/aws-lambda": { "name": "@tooljet-plugins/aws-lambda", "version": "1.0.0", @@ -18957,6 +24021,30 @@ "typescript": "^4.7.4" } }, + "plugins/azurerepos": { + "name": "@tooljet-marketplace/azurerepos", + "version": "1.0.0", + "dependencies": { + "@tooljet-marketplace/common": "^1.0.0", + "azure-devops-node-api": "^14.1.0" + }, + "devDependencies": { + "@vercel/ncc": "^0.34.0", + "typescript": "^4.7.4" + } + }, + "plugins/cohere": { + "name": "@tooljet-marketplace/cohere", + "version": "1.0.0", + "dependencies": { + "@tooljet-marketplace/common": "^1.0.0", + "cohere-ai": "^7.15.4" + }, + "devDependencies": { + "@vercel/ncc": "^0.34.0", + "typescript": "^4.7.4" + } + }, "plugins/common": { "name": "@tooljet-marketplace/common", "version": "1.0.0", @@ -18976,6 +24064,18 @@ "typescript": "^4.7.4" } }, + "plugins/gemini": { + "name": "@tooljet-marketplace/gemini", + "version": "1.0.0", + "dependencies": { + "@google/generative-ai": "^0.21.0", + "@tooljet-marketplace/common": "^1.0.0" + }, + "devDependencies": { + "@vercel/ncc": "^0.34.0", + "typescript": "^4.7.4" + } + }, "plugins/github": { "name": "@tooljet-marketplace/github", "version": "1.0.0", @@ -19000,6 +24100,17 @@ "typescript": "^4.7.4" } }, + "plugins/hugging_face": { + "name": "@tooljet-marketplace/huggingface", + "version": "1.0.0", + "dependencies": { + "@tooljet-marketplace/common": "^1.0.0" + }, + "devDependencies": { + "@vercel/ncc": "^0.34.0", + "typescript": "^4.7.4" + } + }, "plugins/jira": { "name": "@tooljet-plugins/jira", "version": "1.0.0", @@ -19009,6 +24120,18 @@ "react": "^17.0.2" } }, + "plugins/mistral_ai": { + "name": "@tooljet-marketplace/mistral", + "version": "1.0.0", + "dependencies": { + "@mistralai/mistralai": "^1.4.0", + "@tooljet-marketplace/common": "^1.0.0" + }, + "devDependencies": { + "@vercel/ncc": "^0.34.0", + "typescript": "^4.7.4" + } + }, "plugins/openai": { "name": "@tooljet-marketplace/openai", "version": "1.0.0", @@ -19082,6 +24205,27 @@ "typescript": "^4.7.4" } }, + "plugins/qdrant": { + "name": "@tooljet-marketplace/qdrant", + "version": "1.0.0", + "dependencies": { + "@qdrant/js-client-rest": "^1.12.0", + "@tooljet-marketplace/common": "^1.0.0" + }, + "devDependencies": { + "@vercel/ncc": "^0.38.3", + "typescript": "^4.7.4" + } + }, + "plugins/qdrant/node_modules/@vercel/ncc": { + "version": "0.38.3", + "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.3.tgz", + "integrity": "sha512-rnK6hJBS6mwc+Bkab+PGPs9OiS0i/3kdTO+CkI8V0/VrW3vmz7O2Pxjw/owOlmo6PKEIxRSeZKv/kuL9itnpYA==", + "dev": true, + "bin": { + "ncc": "dist/ncc/cli.js" + } + }, "plugins/s3": { "name": "@tooljet-marketplace/s3", "version": "1.0.0", @@ -19141,6 +24285,18 @@ "@vercel/ncc": "^0.34.0", "typescript": "^4.7.4" } + }, + "plugins/weaviate": { + "name": "@tooljet-marketplace/weaviate", + "version": "1.0.0", + "dependencies": { + "@tooljet-marketplace/common": "^1.0.0", + "got": "^11.8.6" + }, + "devDependencies": { + "@vercel/ncc": "^0.34.0", + "typescript": "^4.7.4" + } } } -} \ No newline at end of file +} diff --git a/marketplace/package.json b/marketplace/package.json index 670dc0bf4e..5d69e411ec 100644 --- a/marketplace/package.json +++ b/marketplace/package.json @@ -9,7 +9,7 @@ "@types/jest": "^29.5.0", "@typescript-eslint/eslint-plugin": "^5.57.0", "@typescript-eslint/parser": "^5.57.0", - "aws-sdk": "^2.1326.0", + "aws-sdk": "^2.1692.0", "eslint": "^8.37.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-jest": "^27.2.1", diff --git a/marketplace/scripts/upload-to-s3.js b/marketplace/scripts/upload-to-s3.js index f6c281114a..6c490c972e 100644 --- a/marketplace/scripts/upload-to-s3.js +++ b/marketplace/scripts/upload-to-s3.js @@ -3,6 +3,7 @@ import readDir from 'recursive-readdir'; import { resolve as _resolve } from 'path'; import aws from 'aws-sdk'; import { lookup } from 'mime-types'; +import chalk from 'chalk'; const { config, S3 } = aws; const __dirname = _resolve(); @@ -30,7 +31,16 @@ const generateFileKey = (fileName) => { const s3 = new S3(); const uploadToS3 = async () => { + const start = Date.now(); + const errors = []; + let successCount = 0; + + console.log(chalk.cyanBright('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━')); + console.log(chalk.cyanBright('šŸ“¤ S3 ASSETS UPLOADER')); + console.log(chalk.cyanBright('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n')); + try { + console.log(`[${new Date().toLocaleTimeString()}] ℹ Scanning directory for files...`); const fileArray = await getDirectoryFilesRecursive(directoryPath, [ 'common', '.DS_Store', @@ -43,30 +53,76 @@ const uploadToS3 = async () => { 'tsconfig.json', ]); - fileArray.map((file) => { - // Configuring parameters for S3 Object - const S3params = { - Bucket: process.env.AWS_BUCKET, - Body: createReadStream(file), - Key: generateFileKey(file), - ContentType: lookup(file), - ContentEncoding: 'utf-8', - CacheControl: 'immutable,max-age=31536000,public', - }; - s3.upload(S3params, function (err, data) { - if (err) { - // Set the exit code while letting - // the process exit gracefully. - console.error(err); - process.exitCode = 1; - } else { - console.log(`Assets uploaded to S3: `, data); - } + console.log(`[${new Date().toLocaleTimeString()}] ℹ Found ${fileArray.length} files to upload`); + console.log(`[${new Date().toLocaleTimeString()}] ℹ Target bucket: ${process.env.AWS_BUCKET}\n`); + + const uploadPromises = fileArray.map((file, index) => { + return new Promise((resolve) => { + const S3params = { + Bucket: process.env.AWS_BUCKET, + Body: createReadStream(file), + Key: generateFileKey(file), + ContentType: lookup(file) || 'application/octet-stream', + ContentEncoding: 'utf-8', + CacheControl: 'immutable,max-age=31536000,public', + }; + + s3.upload(S3params, function (err, data) { + const indexStr = `[${(index + 1).toString().padStart(2, '0')}/${fileArray.length}]`; + if (err) { + console.log(chalk.redBright(`${indexStr} āŒ Failed to upload: ${file}`)); + console.error(chalk.gray(`↳ ${err.message}`)); + errors.push({ file, message: err.message }); + } else { + console.log(chalk.greenBright(`${indexStr} āœ… Uploaded: ${file}`)); + console.log( + chalk.gray( + JSON.stringify( + { + ETag: data.ETag, + Location: data.Location, + Key: data.Key, + Bucket: data.Bucket, + }, + null, + 2 + ) + ) + ); + successCount++; + } + resolve(); + }); }); }); + + await Promise.all(uploadPromises); + + const duration = ((Date.now() - start) / 1000).toFixed(1); + + console.log(chalk.cyanBright('\n━━━━━━━━━━━━━━━ UPLOAD SUMMARY ━━━━━━━━━━━━━━━━━')); + if (errors.length > 0) { + console.log(`[${new Date().toLocaleTimeString()}] āš ļø Upload completed with ${errors.length} error(s)`); + } else { + console.log(`[${new Date().toLocaleTimeString()}] šŸŽ‰ All files uploaded successfully`); + } + console.log(`[${new Date().toLocaleTimeString()}] āœ… Successfully uploaded: ${successCount}/${fileArray.length} files`); + console.log(`[${new Date().toLocaleTimeString()}] āŒ Failed uploads: ${errors.length}/${fileArray.length} files`); + console.log(`[${new Date().toLocaleTimeString()}] ℹ Total time: ${duration}s`); + + if (errors.length > 0) { + console.log(chalk.cyanBright('\n━━━━━━━━━━━━━━━ ERROR DETAILS ━━━━━━━━━━━━━━━━━')); + errors.forEach((err, idx) => { + console.log(chalk.red(`Error #${idx + 1}: ${err.file}`)); + console.log(chalk.gray(` ↳ ${err.message}`)); + }); + process.exitCode = 1; + } } catch (error) { + console.error(chalk.bgRed.white('āŒ Script failed with error:')); console.error(error); + process.exit(1); } }; -uploadToS3(); +uploadToS3(); \ No newline at end of file From cccd84d628d4d9f6604c9ef341bae2ef1546a8d9 Mon Sep 17 00:00:00 2001 From: Ganesh Kumar Date: Fri, 23 May 2025 13:38:34 +0530 Subject: [PATCH 04/19] submodule reference updated --- server/ee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/ee b/server/ee index 30dbfa7545..78ccb8918a 160000 --- a/server/ee +++ b/server/ee @@ -1 +1 @@ -Subproject commit 30dbfa754562d00f8d64181d5006e113798bd668 +Subproject commit 78ccb8918ac5b0dc3f82988dab3bc29fef48c1d6 From 64c8e8af9c928810787b6e763267eb78cdad2002 Mon Sep 17 00:00:00 2001 From: Ganesh Kumar <40178541+ganesh8056@users.noreply.github.com> Date: Fri, 23 May 2025 15:26:21 +0530 Subject: [PATCH 05/19] Feat: Restrict data source deletion if queries are present in any app within a instance (#12824) * datasource or marketplace plugin deletion should not delete queries so have a dependency check * removed a api from controller to check if marketplace plugins has dependent queries * info message updated * restrict uninstalling marketplace plugin when queries are used feature * submodule commit hash updated * dependent queries info modal title updated --- .../src/MarketplacePage/InstalledPlugins.jsx | 30 ++++++++++++++- .../src/_services/globalDatasource.service.js | 14 +++++++ .../dataSources/components/List/index.jsx | 29 +++++++++++++- .../src/modules/data-sources/ability/index.ts | 9 ++++- .../modules/data-sources/constants/feature.ts | 2 + .../modules/data-sources/constants/index.ts | 2 + server/src/modules/data-sources/controller.ts | 14 +++++++ server/src/modules/data-sources/module.ts | 4 ++ server/src/modules/data-sources/repository.ts | 22 +++++++++++ server/src/modules/data-sources/service.ts | 38 ++++++++++++++++++- .../src/modules/data-sources/types/index.ts | 2 + server/src/modules/plugins/ability/index.ts | 16 ++++---- server/src/modules/plugins/module.ts | 3 +- server/src/modules/plugins/service.ts | 17 ++++++++- 14 files changed, 183 insertions(+), 19 deletions(-) diff --git a/frontend/src/MarketplacePage/InstalledPlugins.jsx b/frontend/src/MarketplacePage/InstalledPlugins.jsx index d0da8512a5..6f67f559d7 100644 --- a/frontend/src/MarketplacePage/InstalledPlugins.jsx +++ b/frontend/src/MarketplacePage/InstalledPlugins.jsx @@ -1,12 +1,13 @@ import React from 'react'; import cx from 'classnames'; -import { pluginsService, marketplaceService } from '@/_services'; +import { pluginsService, marketplaceService, globalDatasourceService } from '@/_services'; import { toast } from 'react-hot-toast'; import Spinner from '@/_ui/Spinner'; import { capitalizeFirstLetter, useTagsByPluginId } from './utils'; import { ConfirmDialog } from '@/_components'; import Icon from '@/_ui/Icon/SolidIcons'; import config from 'config'; +import Modal from '@/HomePage/Modal'; export const InstalledPlugins = () => { const [allPlugins, setAllPlugins] = React.useState([]); @@ -81,6 +82,7 @@ const InstalledPluginCard = ({ plugin, marketplacePlugin, fetchPlugins, isDevMod const [updating, setUpdating] = React.useState(false); const [isDeleteModalVisible, setDeleteModalVisibility] = React.useState(false); const [isDeletingPlugin, setDeletingPlugin] = React.useState(false); + const [showDependentQueriesInfo, setShowDependentQueriesInfo] = React.useState(false); const darkMode = localStorage.getItem('darkMode') === 'true'; const { id, name, pluginId } = plugin; @@ -140,6 +142,21 @@ const InstalledPluginCard = ({ plugin, marketplacePlugin, fetchPlugins, isDevMod toast.success(`${capitalizeFirstLetter(name)} reloaded`); }; + const getQueriesLinkedToMarketplacePlugin = (plugin) => { + globalDatasourceService + .getQueriesLinkedToMarketplacePlugin(plugin.id) + .then((data) => { + if (data?.dependent_queries) { + setShowDependentQueriesInfo(true); + } else { + setDeleteModalVisibility(true); + } + }) + .catch(({ error }) => { + toast.error(error); + }); + }; + const pluginDeleteMessage = ( <> Deleting {capitalizeFirstLetter(name)} plugin will result in the permanent removal of all @@ -150,6 +167,15 @@ const InstalledPluginCard = ({ plugin, marketplacePlugin, fetchPlugins, isDevMod return ( <> + setShowDependentQueriesInfo(false)} + > +
+ Cannot delete the {plugin?.name} plugin as it is used in the apps +
+
setDeleteModalVisibility(true)} + onClick={() => getQueriesLinkedToMarketplacePlugin(plugin)} > Remove
diff --git a/frontend/src/_services/globalDatasource.service.js b/frontend/src/_services/globalDatasource.service.js index aebdcca0f1..14963c19f5 100644 --- a/frontend/src/_services/globalDatasource.service.js +++ b/frontend/src/_services/globalDatasource.service.js @@ -9,6 +9,8 @@ export const globalDatasourceService = { convertToGlobal, getDataSourceByEnvironmentId, getForApp, + getQueriesLinkedToDatasource, + getQueriesLinkedToMarketplacePlugin, }; function getForApp(organizationId, appVersionId, environmentId) { @@ -68,3 +70,15 @@ function getDataSourceByEnvironmentId(dataSourceId, environmentId) { handleResponse ); } + +function getQueriesLinkedToMarketplacePlugin(pluginId) { + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; + return fetch(`${config.apiUrl}/data-sources/dependent-queries/marketplace-plugin/${pluginId}`, requestOptions).then( + handleResponse + ); +} + +function getQueriesLinkedToDatasource(dataSourceId) { + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; + return fetch(`${config.apiUrl}/data-sources/dependent-queries/${dataSourceId}`, requestOptions).then(handleResponse); +} diff --git a/frontend/src/modules/dataSources/components/List/index.jsx b/frontend/src/modules/dataSources/components/List/index.jsx index f3c691ad66..3ceb1864dc 100644 --- a/frontend/src/modules/dataSources/components/List/index.jsx +++ b/frontend/src/modules/dataSources/components/List/index.jsx @@ -9,6 +9,7 @@ import SolidIcon from '@/_ui/Icon/SolidIcons'; import { SearchBox } from '@/_components/SearchBox'; import { DATA_SOURCE_TYPE } from '@/_helpers/constants'; import FolderSkeleton from '@/_ui/FolderSkeleton/FolderSkeleton'; +import Modal from '@/HomePage/Modal'; export const List = ({ updateSelectedDatasource }) => { const { @@ -28,6 +29,7 @@ export const List = ({ updateSelectedDatasource }) => { const [isDeleteModalVisible, setDeleteModalVisibility] = React.useState(false); const [filteredData, setFilteredData] = useState(dataSources); const [showInput, setShowInput] = useState(false); + const [showDependentQueriesInfo, setShowDependentQueriesInfo] = useState(false); const darkMode = localStorage.getItem('darkMode') === 'true'; @@ -50,7 +52,7 @@ export const List = ({ updateSelectedDatasource }) => { setCurrentEnvironment(environments[0]); toggleDataSourceManagerModal(true); updateSelectedDatasource(selectedSource?.name); - setDeleteModalVisibility(true); + getQueriesLinkedToDatasource(selectedSource); }; const executeDataSourceDeletion = () => { @@ -74,6 +76,21 @@ export const List = ({ updateSelectedDatasource }) => { }); }; + const getQueriesLinkedToDatasource = (selectedSource) => { + globalDatasourceService + .getQueriesLinkedToDatasource(selectedSource.id) + .then((data) => { + if (data?.dependent_queries) { + setShowDependentQueriesInfo(true); + } else { + setDeleteModalVisibility(true); + } + }) + .catch(({ error }) => { + toast.error(error); + }); + }; + const cancelDeleteDataSource = () => { setDeleteModalVisibility(false); }; @@ -171,6 +188,16 @@ export const List = ({ updateSelectedDatasource }) => { )} + setShowDependentQueriesInfo(false)} + > +
+ Cannot delete {selectedDataSource?.name ? selectedDataSource.name : 'datasource'} as it is used in the + apps +
+
| 'all'; export type FeatureAbility = Ability<[FEATURE_KEY, Subjects]>; @@ -33,10 +34,13 @@ export class FeatureAbilityFactory extends AbilityFactory const isAllViewable = !!resourcePermissions?.isAllUsable; const dataSourceId = request?.tj_resource_id; - + const toolJetEdition = getTooljetEdition(); // Oauth end points available to all can(FEATURE_KEY.GET_OAUTH2_BASE_URL, DataSource); can(FEATURE_KEY.AUTHORIZE, DataSource); + if ((toolJetEdition == 'ee' && superAdmin) || (toolJetEdition !== 'ee' && isAdmin)) { + can(FEATURE_KEY.QUERIES_DATASOURCE_LINKED_TO_MARKETPLACE_PLUGIN, DataSource); + } if (isBuilder) { // Only builder can do scope change, Get call is there on app builder @@ -56,6 +60,7 @@ export class FeatureAbilityFactory extends AbilityFactory FEATURE_KEY.TEST_CONNECTION, FEATURE_KEY.SCOPE_CHANGE, FEATURE_KEY.GET_FOR_APP, + FEATURE_KEY.QUERIES_LINKED_TO_DATASOURCE, ], DataSource ); @@ -70,7 +75,7 @@ export class FeatureAbilityFactory extends AbilityFactory ); if (isCanDelete) { - can(FEATURE_KEY.DELETE, DataSource); + can([FEATURE_KEY.DELETE, FEATURE_KEY.QUERIES_LINKED_TO_DATASOURCE], DataSource); } if (isCanCreate) { can(FEATURE_KEY.CREATE, DataSource); diff --git a/server/src/modules/data-sources/constants/feature.ts b/server/src/modules/data-sources/constants/feature.ts index 60f6d585d6..78ded94e26 100644 --- a/server/src/modules/data-sources/constants/feature.ts +++ b/server/src/modules/data-sources/constants/feature.ts @@ -20,5 +20,7 @@ export const FEATURES: FeaturesConfig = { [FEATURE_KEY.GET_OAUTH2_BASE_URL]: {}, [FEATURE_KEY.AUTHORIZE]: {}, [FEATURE_KEY.GET_FOR_APP]: {}, + [FEATURE_KEY.QUERIES_LINKED_TO_DATASOURCE]: {}, + [FEATURE_KEY.QUERIES_DATASOURCE_LINKED_TO_MARKETPLACE_PLUGIN]: {}, }, }; diff --git a/server/src/modules/data-sources/constants/index.ts b/server/src/modules/data-sources/constants/index.ts index 7a76daf665..ac09f78c3c 100644 --- a/server/src/modules/data-sources/constants/index.ts +++ b/server/src/modules/data-sources/constants/index.ts @@ -9,6 +9,8 @@ export enum FEATURE_KEY { TEST_CONNECTION = 'TEST_CONNECTION', GET_OAUTH2_BASE_URL = 'GET_OAUTH2_BASE_URL', AUTHORIZE = 'AUTHORIZE', + QUERIES_LINKED_TO_DATASOURCE = 'QUERIES_LINKED_TO_DATASOURCE', + QUERIES_DATASOURCE_LINKED_TO_MARKETPLACE_PLUGIN = 'QUERIES_DATASOURCE_LINKED_TO_MARKETPLACE_PLUGIN', } export enum DataSourceTypes { diff --git a/server/src/modules/data-sources/controller.ts b/server/src/modules/data-sources/controller.ts index d4352c9e9f..51d1df0af6 100644 --- a/server/src/modules/data-sources/controller.ts +++ b/server/src/modules/data-sources/controller.ts @@ -129,6 +129,20 @@ export class DataSourcesController implements IDataSourcesController { return; } + @InitFeature(FEATURE_KEY.QUERIES_DATASOURCE_LINKED_TO_MARKETPLACE_PLUGIN) + @UseGuards(FeatureAbilityGuard) + @Get('dependent-queries/marketplace-plugin/:plugin_id') + async findDatasourcesAndQueriesOfMarketplacePlugin(@User() user: UserEntity, @Param('plugin_id') pluginId) { + return await this.dataSourcesService.findDatasourcesAndQueriesOfMarketplacePlugin(pluginId); + } + + @InitFeature(FEATURE_KEY.QUERIES_LINKED_TO_DATASOURCE) + @UseGuards(FeatureAbilityGuard) + @Get('dependent-queries/:datasource_id') + async findQueriesLinkedToDatasource(@User() user: UserEntity, @Param('datasource_id') datasourceId: string) { + return await this.dataSourcesService.findQueriesLinkedToDatasource(datasourceId); + } + @InitFeature(FEATURE_KEY.AUTHORIZE) @UseGuards(FeatureAbilityGuard) @Post('decrypt') diff --git a/server/src/modules/data-sources/module.ts b/server/src/modules/data-sources/module.ts index f914bbcd2e..c8d9e51b50 100644 --- a/server/src/modules/data-sources/module.ts +++ b/server/src/modules/data-sources/module.ts @@ -10,6 +10,7 @@ import { InstanceSettingsModule } from '@modules/instance-settings/module'; import { VersionRepository } from '@modules/versions/repository'; import { AppsRepository } from '@modules/apps/repository'; import { TooljetDbModule } from '@modules/tooljet-db/module'; +import { OrganizationRepository } from '@modules/organizations/repository'; import { SessionModule } from '@modules/session/module'; import { SampleDBScheduler } from './schedulers/sample-db.scheduler'; @@ -21,6 +22,7 @@ export class DataSourcesModule { const { DataSourcesUtilService } = await import(`${importPath}/data-sources/util.service`); const { PluginsServiceSelector } = await import(`${importPath}/data-sources/services/plugin-selector.service`); const { SampleDataSourceService } = await import(`${importPath}/data-sources/services/sample-ds.service`); + const { OrganizationsService } = await import(`${importPath}/organizations/service`); return { module: DataSourcesModule, @@ -42,6 +44,8 @@ export class DataSourcesModule { PluginsRepository, SampleDataSourceService, FeatureAbilityFactory, + OrganizationsService, + OrganizationRepository, SampleDBScheduler, ], controllers: [DataSourcesController], diff --git a/server/src/modules/data-sources/repository.ts b/server/src/modules/data-sources/repository.ts index e3cb9a0fb5..0bc8195d47 100644 --- a/server/src/modules/data-sources/repository.ts +++ b/server/src/modules/data-sources/repository.ts @@ -168,4 +168,26 @@ export class DataSourcesRepository extends Repository { }); }, manager || this.manager); } + + getDatasourceByPluginId(pluginId: string) { + return dbTransactionWrap((manager: EntityManager) => { + return manager.find(DataSource, { + where: { + pluginId: pluginId, + }, + relations: ['dataQueries'], + }); + }); + } + + getQueriesByDatasourceId(datasourceId) { + return dbTransactionWrap((manager: EntityManager) => { + return manager.find(DataSource, { + where: { + id: datasourceId, + }, + relations: ['dataQueries'], + }); + }); + } } diff --git a/server/src/modules/data-sources/service.ts b/server/src/modules/data-sources/service.ts index ae10f903a5..f104f228f9 100644 --- a/server/src/modules/data-sources/service.ts +++ b/server/src/modules/data-sources/service.ts @@ -20,6 +20,8 @@ import { GetQueryVariables, UpdateOptions } from './types'; import { DataSource } from '@entities/data_source.entity'; import { PluginsServiceSelector } from './services/plugin-selector.service'; import { IDataSourcesService } from './interfaces/IService'; +// import { FEATURE_KEY } from './constants'; +import { OrganizationsService } from '@modules/organizations/service'; import { RequestContext } from '@modules/request-context/service'; import { AUDIT_LOGS_REQUEST_CONTEXT_KEY } from '@modules/app/constants'; @@ -30,7 +32,8 @@ export class DataSourcesService implements IDataSourcesService { protected readonly dataSourcesUtilService: DataSourcesUtilService, protected readonly abilityService: AbilityService, protected readonly appEnvironmentsUtilService: AppEnvironmentUtilService, - protected readonly pluginsServiceSelector: PluginsServiceSelector + protected readonly pluginsServiceSelector: PluginsServiceSelector, + protected readonly organizationsService: OrganizationsService ) {} async getForApp(query: GetQueryVariables, user: User): Promise<{ data_sources: object[] }> { @@ -43,7 +46,6 @@ export class DataSourcesService implements IDataSourcesService { const dataSources = await this.dataSourcesRepository.allGlobalDS(userPermissions, user.organizationId, query ?? {}); let staticDataSources = await this.dataSourcesRepository.getAllStaticDataSources(query.appVersionId); - if (!shouldIncludeWorkflows) { // remove workflowsdefault data source from static data sources staticDataSources = staticDataSources.filter((dataSource) => dataSource.kind !== 'workflows'); @@ -176,6 +178,12 @@ export class DataSourcesService implements IDataSourcesService { if (dataSource.type === DataSourceTypes.SAMPLE) { throw new BadRequestException('Cannot delete sample data source'); } + + const result = await this.findQueriesLinkedToDatasource(dataSourceId); + if (result.dependent_queries) { + throw new BadRequestException(`Datasource can't be deleted, queries are in use`); + } + await this.dataSourcesRepository.delete(dataSourceId); // Setting data for audit logs @@ -243,4 +251,30 @@ export class DataSourcesService implements IDataSourcesService { await this.dataSourcesUtilService.authorizeOauth2(dataSource, code, user.id, environmentId, user.organizationId); return; } + + async findQueriesLinkedToDatasource(datasourceId: string) { + const dataSourceDetails = await this.dataSourcesRepository.getQueriesByDatasourceId(datasourceId); + if (dataSourceDetails.length == 0) return { datasources: 0, dependent_queries: 0 }; + + const queries = []; + dataSourceDetails.forEach((datasourceDetail) => { + const { dataQueries = [] } = datasourceDetail; + if (dataQueries.length) queries.push(...dataQueries); + }); + + return { datasources: dataSourceDetails.length, dependent_queries: queries.length }; + } + + async findDatasourcesAndQueriesOfMarketplacePlugin(pluginId: string) { + const dataSourcesByMarketplacePlugin = await this.dataSourcesRepository.getDatasourceByPluginId(pluginId); + if (!dataSourcesByMarketplacePlugin.length) return { dependent_queries: 0 }; + + const queries = []; + dataSourcesByMarketplacePlugin?.forEach((datasource) => { + if (datasource.dataQueries.length) queries.push(...datasource.dataQueries); + }); + return { + dependent_queries: queries.length, + }; + } } diff --git a/server/src/modules/data-sources/types/index.ts b/server/src/modules/data-sources/types/index.ts index 22c56c3e31..791a5b8af0 100644 --- a/server/src/modules/data-sources/types/index.ts +++ b/server/src/modules/data-sources/types/index.ts @@ -14,6 +14,8 @@ interface Features { [FEATURE_KEY.GET_OAUTH2_BASE_URL]: FeatureConfig; [FEATURE_KEY.AUTHORIZE]: FeatureConfig; [FEATURE_KEY.GET_FOR_APP]: FeatureConfig; + [FEATURE_KEY.QUERIES_LINKED_TO_DATASOURCE]: FeatureConfig; + [FEATURE_KEY.QUERIES_DATASOURCE_LINKED_TO_MARKETPLACE_PLUGIN]: FeatureConfig; } export interface FeaturesConfig { diff --git a/server/src/modules/plugins/ability/index.ts b/server/src/modules/plugins/ability/index.ts index 1bdc0c1a96..9c31bb44e0 100644 --- a/server/src/modules/plugins/ability/index.ts +++ b/server/src/modules/plugins/ability/index.ts @@ -4,6 +4,7 @@ import { AbilityFactory } from '@modules/app/ability-factory'; import { UserAllPermissions } from '@modules/app/types'; import { FEATURE_KEY } from '../constants'; import { Plugin } from '@entities/plugin.entity'; +import { getTooljetEdition } from '@helpers/utils.helper'; type Subjects = InferSubjects | 'all'; export type FeatureAbility = Ability<[FEATURE_KEY, Subjects]>; @@ -16,17 +17,14 @@ export class FeatureAbilityFactory extends AbilityFactory protected defineAbilityFor(can: AbilityBuilder['can'], UserAllPermissions: UserAllPermissions): void { const { superAdmin, isAdmin, isBuilder } = UserAllPermissions; + const toolJetEdition = getTooljetEdition(); + if ((toolJetEdition == 'ee' && superAdmin) || (toolJetEdition !== 'ee' && isAdmin)) { + can([FEATURE_KEY.UNINSTALL_PLUGINS, FEATURE_KEY.DELETE], Plugin); + } + if (superAdmin || isAdmin || isBuilder) { - // Admin, super admin and Builder can do all operations can( - [ - FEATURE_KEY.INSTALL, - FEATURE_KEY.UPDATE, - FEATURE_KEY.DELETE, - FEATURE_KEY.INSTALL_DEPENDENT_PLUGINS, - FEATURE_KEY.UNINSTALL_PLUGINS, - FEATURE_KEY.DEPENDENT_PLUGINS, - ], + [FEATURE_KEY.INSTALL, FEATURE_KEY.UPDATE, FEATURE_KEY.INSTALL_DEPENDENT_PLUGINS, FEATURE_KEY.DEPENDENT_PLUGINS], Plugin ); } diff --git a/server/src/modules/plugins/module.ts b/server/src/modules/plugins/module.ts index ccc59f525e..a8e8b7f7ec 100644 --- a/server/src/modules/plugins/module.ts +++ b/server/src/modules/plugins/module.ts @@ -2,6 +2,7 @@ import { FilesRepository } from '@modules/files/repository'; import { getImportPath } from '@modules/app/constants'; import { DynamicModule } from '@nestjs/common'; import { FeatureAbilityFactory } from './ability'; +import { DataSourcesRepository } from '@modules/data-sources/repository'; export class PluginsModule { static async register(configs: { IS_GET_CONTEXT: boolean }): Promise { @@ -13,7 +14,7 @@ export class PluginsModule { return { module: PluginsModule, controllers: [PluginsController], - providers: [PluginsService, FilesRepository, PluginsUtilService, FeatureAbilityFactory], + providers: [PluginsService, FilesRepository, PluginsUtilService, FeatureAbilityFactory, DataSourcesRepository], exports: [PluginsUtilService], }; } diff --git a/server/src/modules/plugins/service.ts b/server/src/modules/plugins/service.ts index de1709eba7..4397827d02 100644 --- a/server/src/modules/plugins/service.ts +++ b/server/src/modules/plugins/service.ts @@ -10,13 +10,15 @@ import { FilesRepository } from '@modules/files/repository'; import { IPluginsService } from './interfaces/IService'; import * as path from 'path'; import { Injectable } from '@nestjs/common'; +import { DataSourcesRepository } from '@modules/data-sources/repository'; const fs = require('fs'); @Injectable() export class PluginsService implements IPluginsService { constructor( protected readonly pluginsUtilService: PluginsUtilService, - protected readonly fileRepository: FilesRepository + protected readonly fileRepository: FilesRepository, + protected readonly dataSourcesRepository: DataSourcesRepository ) {} async install(body: CreatePluginDto) { @@ -57,7 +59,18 @@ export class PluginsService implements IPluginsService { return await this.pluginsUtilService.upgrade(id, body, version, { index, operations, icon, manifest }); } - remove(id: string) { + async remove(id: string) { + const dataSourcesByMarketplacePlugin = await this.dataSourcesRepository.getDatasourceByPluginId(id); + if (dataSourcesByMarketplacePlugin.length) { + const queries = []; + dataSourcesByMarketplacePlugin?.forEach((datasource) => { + if (datasource.dataQueries.length) queries.push(...datasource.dataQueries); + }); + if (queries.length) { + throw new InternalServerErrorException(`Plugin can't be removed, queries of plugin are in use`); + } + } + return dbTransactionWrap((manager: EntityManager) => { return manager.delete(Plugin, id); }); From f28dc8b1f25cce25f3833ee6bb9d4533c9b6f6cf Mon Sep 17 00:00:00 2001 From: Kushagra Srivastava Date: Fri, 23 May 2025 20:32:56 +0530 Subject: [PATCH 06/19] Supabase error standardization (#12879) Signed-off-by: thesynthax --- marketplace/plugins/supabase/lib/index.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/marketplace/plugins/supabase/lib/index.ts b/marketplace/plugins/supabase/lib/index.ts index e82952a2b1..875c7bfe9a 100644 --- a/marketplace/plugins/supabase/lib/index.ts +++ b/marketplace/plugins/supabase/lib/index.ts @@ -69,7 +69,16 @@ export default class Supabase implements QueryService { } if (error) { - throw new QueryError('Query could not be completed', error, {}); + const errorMessage = error?.message || "An unknown error occurred."; + let errorDetails: any = {}; + + const supabaseError = error as any; + const { code, hint } = supabaseError; + + errorDetails.code = code; + errorDetails.hint = hint; + + throw new QueryError('Query could not be completed', errorMessage, errorDetails); } return { From ce6713aab483d049efc65e54d3fcc5b4f7a30918 Mon Sep 17 00:00:00 2001 From: Kushagra Srivastava Date: Fri, 23 May 2025 20:40:57 +0530 Subject: [PATCH 07/19] Firestore error standardization (#12813) * firestore error standardization Signed-off-by: thesynthax * removed error.stack Signed-off-by: thesynthax --------- Signed-off-by: thesynthax --- plugins/packages/firestore/lib/index.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins/packages/firestore/lib/index.ts b/plugins/packages/firestore/lib/index.ts index 64d91c4f58..f8c39815bd 100644 --- a/plugins/packages/firestore/lib/index.ts +++ b/plugins/packages/firestore/lib/index.ts @@ -57,7 +57,18 @@ export default class FirestoreQueryService implements QueryService { break; } } catch (error) { - throw new QueryError('Query could not be completed', error.message, {}); + const errorMessage = error.message || "An unknown error occurred."; + let errorDetails: any = {}; + + if (error && error instanceof Error) { + const firestoreError = error as any; + const { code, name } = firestoreError; + + errorDetails.code = code as string; + errorDetails.name = name; + } + + throw new QueryError('Query could not be completed', errorMessage, errorDetails); } return { From 2b989bbcea210f4e51e7438a5832b5ec522322bf Mon Sep 17 00:00:00 2001 From: Kushagra Srivastava Date: Tue, 27 May 2025 12:03:50 +0530 Subject: [PATCH 08/19] metadata label changed to payload in qdrant (#12800) Signed-off-by: thesynthax In Qdrant datasource, for the operation "Query Points", a property label has been updated from "Include metadata" to "Include payload" --- marketplace/plugins/qdrant/lib/operations.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/marketplace/plugins/qdrant/lib/operations.json b/marketplace/plugins/qdrant/lib/operations.json index 8d7fc70627..d71458f821 100644 --- a/marketplace/plugins/qdrant/lib/operations.json +++ b/marketplace/plugins/qdrant/lib/operations.json @@ -146,7 +146,7 @@ "height": "36px" }, "withPayload": { - "label": "Include metadata", + "label": "Include payload", "key": "withPayload", "type": "codehinter", "description": "Whether to return payload values.", @@ -163,4 +163,4 @@ } } } -} \ No newline at end of file +} From 86d60336a8013354170b1cc76b8cb9f3a807187a Mon Sep 17 00:00:00 2001 From: Kushagra Srivastava Date: Tue, 27 May 2025 12:13:16 +0530 Subject: [PATCH 09/19] Unique constraint on plugins to prevent plugin to be installed multiple times in a workspace (#12798) * fixed plugin duplication bug Signed-off-by: thesynthax * changed it on DB level Signed-off-by: thesynthax * changed id to name in error dialog Signed-off-by: thesynthax * migrations run Signed-off-by: thesynthax --------- Signed-off-by: thesynthax --- .../src/MarketplacePage/MarketplaceCard.jsx | 5 +++++ ...47133448781-AddPluginIdUniqueConstraint.ts | 22 +++++++++++++++++++ server/src/entities/plugin.entity.ts | 2 ++ server/src/modules/plugins/service.ts | 10 +++++++-- 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 server/migrations/1747133448781-AddPluginIdUniqueConstraint.ts diff --git a/frontend/src/MarketplacePage/MarketplaceCard.jsx b/frontend/src/MarketplacePage/MarketplaceCard.jsx index 5ed9bb6e82..1a2c07cf61 100644 --- a/frontend/src/MarketplacePage/MarketplaceCard.jsx +++ b/frontend/src/MarketplacePage/MarketplaceCard.jsx @@ -17,6 +17,11 @@ export const MarketplaceCard = ({ id, name, repo, description, version, isInstal }, [isInstalled]); const installPlugin = async () => { + if (installed) { + toast.error(`${capitalizeFirstLetter(name)} is already installed.`); + return; + } + const body = { id, name, diff --git a/server/migrations/1747133448781-AddPluginIdUniqueConstraint.ts b/server/migrations/1747133448781-AddPluginIdUniqueConstraint.ts new file mode 100644 index 0000000000..01b0008006 --- /dev/null +++ b/server/migrations/1747133448781-AddPluginIdUniqueConstraint.ts @@ -0,0 +1,22 @@ +import { MigrationInterface, QueryRunner, TableUnique } from "typeorm"; + +export class AddPluginIdUniqueConstraint1747133448781 implements MigrationInterface { + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.createUniqueConstraint( + "plugins", + new TableUnique({ + name: "UQ_plugin_pluginId", + columnNames: ["plugin_id"], + }) + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.dropUniqueConstraint( + "plugins", + "UQ_plugin_pluginId" + ); + } + +} diff --git a/server/src/entities/plugin.entity.ts b/server/src/entities/plugin.entity.ts index e69924f276..3047571f87 100644 --- a/server/src/entities/plugin.entity.ts +++ b/server/src/entities/plugin.entity.ts @@ -6,9 +6,11 @@ import { OneToOne, PrimaryGeneratedColumn, UpdateDateColumn, + Unique } from 'typeorm'; import { File } from 'src/entities/file.entity'; +@Unique(['pluginId']) @Entity({ name: 'plugins' }) export class Plugin { @PrimaryGeneratedColumn() diff --git a/server/src/modules/plugins/service.ts b/server/src/modules/plugins/service.ts index 4397827d02..ab1c7fc2bf 100644 --- a/server/src/modules/plugins/service.ts +++ b/server/src/modules/plugins/service.ts @@ -1,4 +1,4 @@ -import { InternalServerErrorException, NotFoundException } from '@nestjs/common'; +import { BadRequestException, InternalServerErrorException, NotFoundException } from '@nestjs/common'; import { CreatePluginDto, UpdatePluginDto } from './dto'; import { PluginsUtilService } from './util.service'; import { dbTransactionWrap } from '@helpers/database.helper'; @@ -22,7 +22,13 @@ export class PluginsService implements IPluginsService { ) {} async install(body: CreatePluginDto) { - const { id, repo } = body; + const { id, repo, name } = body; + + const existingPlugin = await dbTransactionWrap((manager: EntityManager) => { + return manager.findOne(Plugin, { where: { pluginId: id } }); + }); + if (existingPlugin) throw new BadRequestException(`Plugin '${name}' is already installed.`); + const [index, operations, icon, manifest, version] = await this.pluginsUtilService.fetchPluginFiles(id, repo); let shouldCreate = false; From d7a5e07ff21dcafac0bdf40660a148c8f3b3e01e Mon Sep 17 00:00:00 2001 From: Mekhla Asopa <59684099+Mekhla-Asopa@users.noreply.github.com> Date: Tue, 27 May 2025 13:20:39 +0530 Subject: [PATCH 10/19] Added automation for Rest API all methods (#12935) * add rest api auth * add content-type scenario * fixed failed cypress specs * update version spec --- cypress-tests/cypress/commands/apiCommands.js | 92 +++- .../cypress/constants/selectors/dataSource.js | 10 +- ...ath.cy.skip.js => airTableHappyPath.cy.js} | 109 +++-- ...ath.cy.skip.js => bigqueryHappyPath.cy.js} | 57 +-- .../data-source/cosmosDbHappyPath.cy.js | 2 +- .../data-source/couchDbHappyPath.cy.js | 2 +- .../data-source/dynamoDbHappyPath.cy.js | 2 +- .../data-source/elasticsearchHappyPath.cy.js | 2 +- .../data-source/fireStoreHappyPath.cy.js | 2 +- .../data-source/influxDbHappyPath.cy.js | 2 +- .../data-source/mariaDbHappyPath.cy.js | 2 +- .../data-source/mongoDbHappyPath.cy.skip.js | 4 +- .../data-source/postgresHappyPath.cy.js | 2 +- .../data-source/redisHappyPath.cy.js | 12 +- .../data-source/restAPIHappyPath.cy.js | 452 +++++++++++++++--- .../data-source/s3HappyPath.cy.js | 10 +- .../data-source/smtpHappyPath.cy.js | 2 +- .../data-source/snowflakeHappyPath.cy.js | 2 +- .../data-source/sqlServerHappyPath.cy.skip.js | 2 +- .../data-source/typeSenseHappyPath.cy.skip.js | 2 +- .../platform/ceTestcases/apps/version.cy.js | 89 ++-- .../cypress/support/utils/dataSource.js | 2 +- .../cypress/support/utils/restAPI.js | 130 +++-- 23 files changed, 708 insertions(+), 283 deletions(-) rename cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/{airTableHappyPath.cy.skip.js => airTableHappyPath.cy.js} (79%) rename cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/{bigqueryHappyPath.cy.skip.js => bigqueryHappyPath.cy.js} (79%) diff --git a/cypress-tests/cypress/commands/apiCommands.js b/cypress-tests/cypress/commands/apiCommands.js index c625e6cc33..62d72f7cdc 100644 --- a/cypress-tests/cypress/commands/apiCommands.js +++ b/cypress-tests/cypress/commands/apiCommands.js @@ -52,7 +52,7 @@ Cypress.Commands.add("apiCreateGDS", (url, name, kind, options) => { log: false; } expect(response.status).to.equal(201); - Cypress.env(`${kind}`, response.body.id); + Cypress.env(`${name}`, response.body.id); Cypress.log({ name: "Create Data Source", @@ -80,13 +80,14 @@ Cypress.Commands.add("apiFetchDataSourcesId", () => { Cypress.log({ name: "DS Fetch", displayName: "Data Sources Fetched", - message: dataSources.map(ds => `\nKind: '${ds.kind}', Name: '${ds.id}'`).join(','), + message: dataSources + .map((ds) => `\nKind: '${ds.kind}', Name: '${ds.id}'`) + .join(","), }); }); }); }); - Cypress.Commands.add("apiCreateApp", (appName = "testApp") => { cy.window({ log: false }).then((win) => { win.localStorage.setItem("walkthroughCompleted", "true"); @@ -168,7 +169,6 @@ Cypress.Commands.add( Cypress.env("editingVersionId", responseData.editing_version.id); Cypress.env("environmentId", responseData.editorEnvironment.id); - }); cy.get(componentSelector, { timeout: 10000 }); } @@ -221,21 +221,21 @@ Cypress.Commands.add( const requestBody = envVar === "Enterprise" ? { - email: userEmail, - firstName: userName, - groups: [], - lastName: "", - role: userRole, - userMetadata: metaData, - } + email: userEmail, + firstName: userName, + groups: [], + lastName: "", + role: userRole, + userMetadata: metaData, + } : { - email: userEmail, - firstName: userName, - groups: [], - lastName: "", - role: userRole, - userMetadata: metaData, - }; + email: userEmail, + firstName: userName, + groups: [], + lastName: "", + role: userRole, + userMetadata: metaData, + }; cy.getCookie("tj_auth_token").then((cookie) => { cy.request( @@ -289,7 +289,9 @@ Cypress.Commands.add("apiAddQuery", (queryName, query, dataQueryId) => { Cypress.Commands.add( "apiAddQueryToApp", (queryName, options, dsName, dsKind) => { - cy.log(`${Cypress.env("server_host")}/api/data-queries/data-sources/${Cypress.env(dsKind)}/versions/${Cypress.env("editingVersionId")}`) + cy.log( + `${Cypress.env("server_host")}/api/data-queries/data-sources/${Cypress.env(dsKind)}/versions/${Cypress.env("editingVersionId")}` + ); cy.getCookie("tj_auth_token", { log: false }).then((cookie) => { const authToken = `tj_auth_token=${cookie.value}`; const workspaceId = Cypress.env("workspaceId"); @@ -737,3 +739,55 @@ Cypress.Commands.add("apiGetAppData", (appId = Cypress.env("appId")) => { }); }); }); + +Cypress.Commands.add("apiDeleteGDS", (name) => { + const dataSourceId = Cypress.env(`${name}`); + + cy.getCookie("tj_auth_token").then((cookie) => { + cy.request({ + method: "DELETE", + url: `${Cypress.env("server_host")}/api/data-sources/${dataSourceId}`, + headers: { + "Tj-Workspace-Id": Cypress.env("workspaceId"), + Cookie: `tj_auth_token=${cookie.value}`, + }, + failOnStatusCode: false, + }).then((response) => { + console.log("Delete response:", response); + + expect(response.status, "Delete status code").to.eq(200); + + Cypress.log({ + name: "Delete Data Source", + displayName: "Data source deleted", + message: `Name: '${name}' | ID: '${dataSourceId}'`, + }); + }); + }); +}); + +Cypress.Commands.add( + "apiUpdateGDS", + ({ name, options, envName = "development" }) => { + cy.getAuthHeaders().then((headers) => { + cy.apiGetEnvironments().then((environments) => { + const environment = environments.find((env) => env.name === envName); + const environmentId = environment.id; + const dataSourceId = Cypress.env(`${name}`); + + cy.request({ + method: "PUT", + url: `${Cypress.env("server_host")}/api/data-sources/${dataSourceId}?environment_id=${environmentId}`, + headers: headers, + body: { + name: name, + options: options, + }, + }).then((response) => { + expect(response.status).to.equal(200); + cy.log(`Datasource "${name}" updated successfully.`); + }); + }); + }); + } +); diff --git a/cypress-tests/cypress/constants/selectors/dataSource.js b/cypress-tests/cypress/constants/selectors/dataSource.js index 242747e8b1..bf5fc06dfa 100644 --- a/cypress-tests/cypress/constants/selectors/dataSource.js +++ b/cypress-tests/cypress/constants/selectors/dataSource.js @@ -28,7 +28,7 @@ export const dataSourceSelector = { buttonTestConnection: '[data-cy="test-connection-button"]', connectionFailedText: '[data-cy="test-connection-failed-text"]', buttonSave: '[data-cy="db-connection-save-button"] > .tj-base-btn', - dangerAlertNotSupportSSL: '.go3958317564', + dangerAlertNotSupportSSL: ".go3958317564", passwordTextField: '[data-cy="password-text-field"]', textConnectionVerified: '[data-cy="test-connection-verified-text"]', @@ -102,6 +102,12 @@ export const dataSourceSelector = { eventQuerySelectionField: '[data-cy="query-selection-field"]', connectionAlertText: '[data-cy="connection-alert-text"]', deleteDSButton: (datasourceName) => { - return `[data-cy="${cyParamName(datasourceName)}-delete-button"]` + return `[data-cy="${cyParamName(datasourceName)}-delete-button"]`; + }, + labelFieldName: (fieldName) => { + return `[data-cy="${cyParamName(fieldName)}-field-label"]`; + }, + dataSourceNameButton: (dataSourceName) => { + return `[data-cy="${cyParamName(dataSourceName)}-button"]`; }, }; diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTableHappyPath.cy.skip.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTableHappyPath.cy.js similarity index 79% rename from cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTableHappyPath.cy.skip.js rename to cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTableHappyPath.cy.js index 0733373ece..62a6bffcb1 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTableHappyPath.cy.skip.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTableHappyPath.cy.js @@ -69,25 +69,57 @@ describe("Data source Airtable", () => { }); it("Should verify the functionality of AirTable connection form.", () => { - selectAndAddDataSource("databases", airtableText.airtable, data.dsName); - - fillDataSourceTextField( - airtableText.ApiKey, - airtableText.apikeyPlaceholder, - Cypress.env("airTable_apikey") - ); - cy.get(postgreSqlSelector.buttonSave).click(); - - cy.verifyToastMessage( - commonSelectors.toastMessage, - postgreSqlText.toastDSSaved - ); - cy.get(commonSelectors.globalDataSourceIcon).click(); + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dsName}-airtable`, + "airtable", + [ + { + key: "personal_access_token", + value: "Invalid access token", + encrypted: true, + }, + ] + ); cy.get( - `[data-cy="cypress-${data.dsName}-airtable-button"]` - ).verifyVisibleElement("have.text", `cypress-${data.dsName}-airtable`); - deleteDatasource(`cypress-${data.dsName}-airtable`); + dataSourceSelector.dataSourceNameButton(`cypress-${data.dsName}-airtable`) + ) + .should("be.visible") + .click(); + + cy.get(postgreSqlSelector.buttonTestConnection).click(); + cy.get(dataSourceSelector.connectionFailedText, { + timeout: 10000, + }).should("have.text", postgreSqlText.couldNotConnect); + + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( + "have.text", + "Authentication failed: Invalid personal access token" + ); + cy.reload(); + cy.apiUpdateGDS({ + name: `cypress-${data.dsName}-airtable`, + options: [ + { + key: "personal_access_token", + value: `${Cypress.env("airTable_apikey")}`, + encrypted: true, + }, + ], + }); + cy.get( + dataSourceSelector.dataSourceNameButton(`cypress-${data.dsName}-airtable`) + ) + .should("be.visible") + .click(); + + cy.get(postgreSqlSelector.buttonTestConnection).click(); + cy.get(postgreSqlSelector.textConnectionVerified, { + timeout: 10000, + }).should("have.text", postgreSqlText.labelConnectionVerified); + + cy.apiDeleteGDS(`cypress-${data.dsName}-airtable`); }); it("Should able to run the query with valid conection", () => { @@ -96,30 +128,20 @@ describe("Data source Airtable", () => { const airTable_tableName = Cypress.env("airtable_tableName"); const airTable_recordID = Cypress.env("airtable_recordId"); - selectAndAddDataSource("databases", airtableText.airtable, data.dsName); - - fillDataSourceTextField( - airtableText.ApiKey, - airtableText.apikeyPlaceholder, - airTable_apiKey + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dsName}-airtable`, + "airtable", + [ + { + key: "personal_access_token", + value: `${airTable_apiKey}`, + encrypted: true, + }, + ] ); - - cy.wait(1000); - cy.get(postgreSqlSelector.buttonSave).click(); - cy.verifyToastMessage( - commonSelectors.toastMessage, - postgreSqlText.toastDSSaved - ); - - cy.get(commonSelectors.globalDataSourceIcon).click(); - cy.get( - `[data-cy="cypress-${data.dsName}-airtable-button"]` - ).verifyVisibleElement("have.text", `cypress-${data.dsName}-airtable`); - cy.get(commonSelectors.dashboardIcon).click(); - cy.get(commonSelectors.appCreateButton).click(); - cy.get(commonSelectors.appNameInput).click().type(data.dsName); - cy.get(commonSelectors.createAppButton).click(); - cy.skipWalkthrough(); + cy.apiCreateApp(`${data.dsName}-airtable-app`); + cy.openApp(); cy.get('[data-cy="show-ds-popover-button"]').click(); cy.get(".css-4e90k9").type(`${data.dsName}`); @@ -280,10 +302,9 @@ describe("Data source Airtable", () => { commonSelectors.toastMessage, `Query (${data.queryName}) completed.` ); - deleteAppandDatasourceAfterExecution( - data.dsName, - `cypress-${data.dsName}-airtable` - ); + + cy.apiDeleteApp(`${data.dsName}-airtable-app`); + cy.apiDeleteGDS(`cypress-${data.dsName}-airtable`); }); }); }); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/bigqueryHappyPath.cy.skip.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/bigqueryHappyPath.cy.js similarity index 79% rename from cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/bigqueryHappyPath.cy.skip.js rename to cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/bigqueryHappyPath.cy.js index 24a39a3acc..2bbe0787e7 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/bigqueryHappyPath.cy.skip.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/bigqueryHappyPath.cy.js @@ -66,10 +66,9 @@ describe("Data source BigQuery", () => { `cypress-${data.dataSourceName}-bigquery` ); - cy.get('[data-cy="label-private-key"]').verifyVisibleElement( - "have.text", - firestoreText.labelPrivateKey - ); + cy.get( + dataSourceSelector.labelFieldName(firestoreText.labelPrivateKey) + ).verifyVisibleElement("have.text", "Private key*"); cy.get(".datasource-edit-btn").should("be.visible"); cy.get(postgreSqlSelector.labelIpWhitelist).verifyVisibleElement( "have.text", @@ -98,7 +97,7 @@ describe("Data source BigQuery", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", bigqueryText.errorInvalidEmailId ); @@ -110,38 +109,30 @@ describe("Data source BigQuery", () => { }); it("Should verify the functionality of BigQuery connection form.", () => { - selectAndAddDataSource( - "databases", - bigqueryText.bigQuery, - data.dataSourceName - ); - - fillDataSourceTextField( - firestoreText.privateKey, - bigqueryText.placehlderPrivateKey, - `${JSON.stringify(Cypress.env("bigquery_pvt_key"))}`, - "contain", - { parseSpecialCharSequences: false, delay: 0 } + cy.get(commonSelectors.globalDataSourceIcon).click(); + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dataSourceName}-bigquery`, + "bigquery", + [ + { + key: "private_key", + value: `${JSON.stringify(Cypress.env("bigquery_pvt_key"))}`, + encrypted: true, + }, + ] ); + cy.get( + dataSourceSelector.dataSourceNameButton( + `cypress-${data.dataSourceName}-bigquery` + ) + ) + .should("be.visible") + .click(); cy.get(postgreSqlSelector.buttonTestConnection).click(); cy.get(postgreSqlSelector.textConnectionVerified, { timeout: 10000, }).should("have.text", postgreSqlText.labelConnectionVerified); - cy.get(postgreSqlSelector.buttonSave).click(); - - cy.verifyToastMessage( - commonSelectors.toastMessage, - postgreSqlText.toastDSSaved - ); - - cy.get(commonSelectors.globalDataSourceIcon).click(); - cy.get( - `[data-cy="cypress-${data.dataSourceName}-bigquery-button"]` - ).verifyVisibleElement( - "have.text", - `cypress-${data.dataSourceName}-bigquery` - ); - - deleteDatasource(`cypress-${data.dataSourceName}-bigquery`); + cy.apiDeleteGDS(`cypress-${data.dataSourceName}-bigquery`); }); }); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/cosmosDbHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/cosmosDbHappyPath.cy.js index bb5923ec7b..e450e52fc6 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/cosmosDbHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/cosmosDbHappyPath.cy.js @@ -101,7 +101,7 @@ describe("Data sources", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", "Invalid URL" ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/couchDbHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/couchDbHappyPath.cy.js index 8e4a17d173..06bfe675fd 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/couchDbHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/couchDbHappyPath.cy.js @@ -127,7 +127,7 @@ describe("Data sources", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", "Invalid URL" ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/dynamoDbHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/dynamoDbHappyPath.cy.js index 5ff912d2d8..3585fc9c4f 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/dynamoDbHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/dynamoDbHappyPath.cy.js @@ -115,7 +115,7 @@ describe("Data source DynamoDB", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", dynamoDbText.errorMissingRegion ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/elasticsearchHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/elasticsearchHappyPath.cy.js index 88627284ad..8faca425a0 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/elasticsearchHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/elasticsearchHappyPath.cy.js @@ -122,7 +122,7 @@ describe("Data source Elasticsearch", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", elasticsearchText.errorConnectionRefused ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/fireStoreHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/fireStoreHappyPath.cy.js index 674501b2db..31b6099d4c 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/fireStoreHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/fireStoreHappyPath.cy.js @@ -94,7 +94,7 @@ describe("Data source Firestore", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", firestoreText.errorGcpKeyCouldNotBeParsed ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/influxDbHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/influxDbHappyPath.cy.js index 24dc92359c..26db831cff 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/influxDbHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/influxDbHappyPath.cy.js @@ -118,7 +118,7 @@ describe("Data sources", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", "Invalid URL" ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/mariaDbHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/mariaDbHappyPath.cy.js index 58c8c30705..020ca4a40a 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/mariaDbHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/mariaDbHappyPath.cy.js @@ -125,7 +125,7 @@ describe("Data sources", () => { "have.text", postgreSqlText.buttonTextSave ); - // cy.get('[data-cy="connection-alert-text"]').should("be.visible") + // cy.get(dataSourceSelector.connectionAlertText).should("be.visible") deleteDatasource(`cypress-${data.dataSourceName}-mariadb`); }); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/mongoDbHappyPath.cy.skip.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/mongoDbHappyPath.cy.skip.js index 5729ea18c8..1da8b5c6d7 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/mongoDbHappyPath.cy.skip.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/mongoDbHappyPath.cy.skip.js @@ -129,7 +129,7 @@ describe("Data source MongoDB", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", mongoDbText.errorConnectionRefused ); @@ -164,7 +164,7 @@ describe("Data source MongoDB", () => { }).verifyVisibleElement("have.text", postgreSqlText.couldNotConnect, { timeout: 95000, }); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", "Cannot read properties of null (reading '2')" ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/postgresHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/postgresHappyPath.cy.js index 2da4902edd..43268fb85d 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/postgresHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/postgresHappyPath.cy.js @@ -136,7 +136,7 @@ describe("Data sources", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').should("be.visible"); + cy.get(dataSourceSelector.connectionAlertText).should("be.visible"); deleteDatasource(`cypress-${data.dataSourceName}-postgresql`); }); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/redisHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/redisHappyPath.cy.js index ddceea1b52..7e4ed90b8d 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/redisHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/redisHappyPath.cy.js @@ -3,7 +3,7 @@ import { postgreSqlSelector } from "Selectors/postgreSql"; import { postgreSqlText } from "Texts/postgreSql"; import { redisText } from "Texts/redis"; import { commonSelectors } from "Selectors/common"; -import { commonText } from "Texts/common"; +import { dataSourceSelector } from "Selectors/dataSource"; import { fillDataSourceTextField, @@ -96,7 +96,7 @@ describe("Data source Redis", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", redisText.errorMaxRetries ); @@ -137,7 +137,7 @@ describe("Data source Redis", () => { ); cy.get(postgreSqlSelector.buttonTestConnection).click(); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", redisText.errorInvalidUserOrPassword ); @@ -152,7 +152,7 @@ describe("Data source Redis", () => { "108299" ); cy.get(postgreSqlSelector.buttonTestConnection).click(); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", redisText.errorPort ); @@ -170,7 +170,7 @@ describe("Data source Redis", () => { ); cy.get(postgreSqlSelector.buttonTestConnection).click(); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", redisText.errorInvalidUserOrPassword ); @@ -187,7 +187,7 @@ describe("Data source Redis", () => { "redis" ); cy.get(postgreSqlSelector.buttonTestConnection).click(); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", redisText.errorInvalidUserOrPassword ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/restAPIHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/restAPIHappyPath.cy.js index 825439e687..9ec852d6ce 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/restAPIHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/restAPIHappyPath.cy.js @@ -329,9 +329,9 @@ describe("Data source Rest API", () => { ); cy.contains("Save").click(); cy.verifyToastMessage(commonSelectors.toastMessage, "Data Source Saved"); - deleteDatasource(`cypress-${data.dataSourceName}-restapi`); + cy.apiDeleteGDS(`cypress-${data.dataSourceName}-restapi`); }); - it("Should verify basic connection for Rest API", () => { + it("Should verify connection response for all methods", () => { cy.apiCreateGDS( `${Cypress.env("server_host")}/api/data-sources`, `cypress-${data.dataSourceName}-restapi`, @@ -367,88 +367,384 @@ describe("Data source Rest API", () => { ); cy.reload(); - cy.apiCreateApp(`${fake.companyName}-restAPI-App`); + cy.apiCreateApp(`${fake.companyName}-restAPI-CURD-App`); cy.openApp(); - createAndRunRestAPIQuery( - "get_restapi", - `cypress-${data.dataSourceName}-restapi`, - "GET", - "/api/users" - ); - createAndRunRestAPIQuery( - "post_restapi", - `cypress-${data.dataSourceName}-restapi`, - "POST", - "", - [["Content-Type", "application/json"]], - [], - { - price: 200, - name: "Violin", - }, - true, - "/api/users" - ); + createAndRunRestAPIQuery({ + queryName: "get_beeceptor_data", + dsName: `cypress-${data.dataSourceName}-restapi`, + method: "GET", + urlSuffix: "/api/users", + run: true, + }); + createAndRunRestAPIQuery({ + queryName: "post_restapi", + dsName: `cypress-${data.dataSourceName}-restapi`, + method: "POST", + headersList: [["Content-Type", "application/json"]], + rawBody: '{"price": 200,"name": "Violin"}', + urlSuffix: "/api/users", + expectedResponseShape: { price: 200, name: "Violin", id: true }, + }); cy.readFile("cypress/fixtures/restAPI/storedId.json").then( (postResponseID) => { const id1 = postResponseID.id; - createAndRunRestAPIQuery( - "put_restapi_id", - `cypress-${data.dataSourceName}-restapi`, - "PUT", - "", - [["Content-Type", "application/json"]], - [], - { - price: 500, - name: "Guitar", - }, - true, - `/api/users/${id1}` - ); - } - ); - cy.readFile("cypress/fixtures/restAPI/storedId.json").then( - (putResponseID) => { - const id2 = putResponseID.id; - createAndRunRestAPIQuery( - "patch_restapi_id", - `cypress-${data.dataSourceName}-restapi`, - "PATCH", - "", - [["Content-Type", "application/json"]], - [], - { price: 999 }, - true, - `/api/users/${id2}` - ); - } - ); - cy.readFile("cypress/fixtures/restAPI/storedId.json").then( - (patchResponseID) => { - const id3 = patchResponseID.id; - createAndRunRestAPIQuery( - "get_restapi_id", - `cypress-${data.dataSourceName}-restapi`, - "GET", - "", - [], - [], - true, - `/api/users/${id3}` - ); - createAndRunRestAPIQuery( - "delete_restapi_id", - `cypress-${data.dataSourceName}-restapi`, - "DELETE", - "", - [], - [], - true, - `/api/users/${id3}` - ); + createAndRunRestAPIQuery({ + queryName: "put_restapi_id", + dsName: `cypress-${data.dataSourceName}-restapi`, + method: "PUT", + headersList: [["Content-Type", "application/json"]], + rawBody: '{"price": 500,"name": "Guitar"}', + urlSuffix: `/api/users/${id1}`, + expectedResponseShape: { price: 500, name: "Guitar", id: id1 }, + }); + createAndRunRestAPIQuery({ + queryName: "patch_restapi_id", + dsName: `cypress-${data.dataSourceName}-restapi`, + method: "PATCH", + headersList: [["Content-Type", "application/json"]], + rawBody: '{"price": 999 }', + urlSuffix: `/api/users/${id1}`, + run: true, + expectedResponseShape: { price: 999, id: id1 }, + }); + createAndRunRestAPIQuery({ + queryName: "get_restapi_id", + dsName: `cypress-${data.dataSourceName}-restapi`, + method: "GET", + urlSuffix: `/api/users/${id1}`, + run: true, + expectedResponseShape: { price: 999, name: "Guitar", id: id1 }, + }); + createAndRunRestAPIQuery({ + queryName: "delete_restapi_id", + dsName: `cypress-${data.dataSourceName}-restapi`, + method: "DELETE", + urlSuffix: `/api/users/${id1}`, + run: true, + expectedResponseShape: { success: true }, + }); } ); + cy.apiDeleteGDS(`cypress-${data.dataSourceName}-restapi`); + }); + it("Should verify response for basic authentication type connection", () => { + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dataSourceName}-restapi`, + "restapi", + [ + { key: "url", value: "https://httpbin.org" }, + { key: "auth_type", value: "basic" }, + { key: "grant_type", value: "authorization_code" }, + { key: "add_token_to", value: "header" }, + { key: "header_prefix", value: "Bearer " }, + { key: "access_token_url", value: "" }, + { key: "client_id", value: "" }, + { + key: "client_secret", + encrypted: true, + credential_id: "b044a293-82b4-4381-84fd-d173c86a6a0c", + }, + { key: "audience", value: "" }, + { key: "scopes", value: "read, write" }, + { key: "username", value: "user", encrypted: false }, + { key: "password", value: "pass", encrypted: true }, + { + key: "bearer_token", + encrypted: true, + credential_id: "21caf3cb-dbde-43c7-9f42-77feffb63062", + }, + { key: "auth_url", value: "" }, + { key: "client_auth", value: "header" }, + { key: "headers", value: [["", ""]] }, + { key: "custom_query_params", value: [["", ""]], encrypted: false }, + { key: "custom_auth_params", value: [["", ""]] }, + { + key: "access_token_custom_headers", + value: [["", ""]], + encrypted: false, + }, + { key: "multiple_auth_enabled", value: false, encrypted: false }, + { key: "ssl_certificate", value: "none", encrypted: false }, + { key: "retry_network_errors", value: true, encrypted: false }, + { key: "url_parameters", value: [["", ""]], encrypted: false }, + { key: "tokenData", encrypted: false }, + ] + ); + cy.reload(); + cy.intercept("GET", "/api/library_apps").as("appLibrary"); + cy.apiCreateApp(`${fake.companyName}-restAPI-Basic-App`); + createAndRunRestAPIQuery({ + queryName: "get_basic_auth_valid", + dsName: `cypress-${data.dataSourceName}-restapi`, + method: "GET", + urlSuffix: "/basic-auth/user/pass", + expectedResponseShape: { authenticated: true, user: "user" }, + }); + createAndRunRestAPIQuery({ + queryName: "get_basic_auth_invalid", + dsName: `cypress-${data.dataSourceName}-restapi`, + method: "GET", + urlSuffix: "/basic-auth/invaliduser/invalidpass", + }); + cy.apiDeleteGDS(`cypress-${data.dataSourceName}-restapi`); + }); + it("Should verify response for bearer authentication type connection", () => { + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dataSourceName}-restapi`, + "restapi", + [ + { key: "url", value: "https://httpbin.org" }, + { key: "auth_type", value: "bearer" }, + { key: "grant_type", value: "authorization_code" }, + { key: "add_token_to", value: "header" }, + { key: "header_prefix", value: "Bearer " }, + { key: "access_token_url", value: "" }, + { key: "client_id", value: "" }, + { + key: "client_secret", + encrypted: true, + credential_id: "b044a293-82b4-4381-84fd-d173c86a6a0c", + }, + { key: "audience", value: "" }, + { key: "scopes", value: "read, write" }, + { key: "username", value: "", encrypted: false }, + { key: "password", value: "", encrypted: true }, + { + key: "bearer_token", + value: "my-token-123", + encrypted: true, + }, + { key: "auth_url", value: "" }, + { key: "client_auth", value: "header" }, + { key: "headers", value: [["", ""]] }, + { key: "custom_query_params", value: [["", ""]], encrypted: false }, + { key: "custom_auth_params", value: [["", ""]] }, + { + key: "access_token_custom_headers", + value: [["", ""]], + encrypted: false, + }, + { key: "multiple_auth_enabled", value: false, encrypted: false }, + { key: "ssl_certificate", value: "none", encrypted: false }, + { key: "retry_network_errors", value: true, encrypted: false }, + { key: "url_parameters", value: [["", ""]], encrypted: false }, + { key: "tokenData", encrypted: false }, + ] + ); + cy.reload(); + cy.intercept("GET", "/api/library_apps").as("appLibrary"); + cy.apiCreateApp(`${fake.companyName}-restAPI-Bearer-App`); + cy.openApp(); + createAndRunRestAPIQuery({ + queryName: "get_bearer_auth_valid", + dsName: `cypress-${data.dataSourceName}-restapi`, + method: "GET", + urlSuffix: "/bearer", + expectedResponseShape: { authenticated: true, token: "my-token-123" }, + }); + cy.intercept("GET", "api/data_sources?**").as("datasource"); + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dataSourceName}-restapi-invalid`, + "restapi", + [ + { key: "url", value: "https://httpbin.org" }, + { key: "auth_type", value: "bearer" }, + { key: "grant_type", value: "authorization_code" }, + { key: "add_token_to", value: "header" }, + { key: "header_prefix", value: "Bearer " }, + { key: "access_token_url", value: "" }, + { key: "client_id", value: "" }, + { + key: "client_secret", + encrypted: true, + credential_id: "b044a293-82b4-4381-84fd-d173c86a6a0c", + }, + { key: "audience", value: "" }, + { key: "scopes", value: "read, write" }, + { key: "username", value: "", encrypted: false }, + { key: "password", value: "", encrypted: true }, + { + key: "bearer_token", + value: "", + encrypted: true, + }, + { key: "auth_url", value: "" }, + { key: "client_auth", value: "header" }, + { key: "headers", value: [["", ""]] }, + { key: "custom_query_params", value: [["", ""]], encrypted: false }, + { key: "custom_auth_params", value: [["", ""]] }, + { + key: "access_token_custom_headers", + value: [["", ""]], + encrypted: false, + }, + { key: "multiple_auth_enabled", value: false, encrypted: false }, + { key: "ssl_certificate", value: "none", encrypted: false }, + { key: "retry_network_errors", value: true, encrypted: false }, + { key: "url_parameters", value: [["", ""]], encrypted: false }, + { key: "tokenData", encrypted: false }, + ] + ); + cy.apiCreateApp(`${fake.companyName}-restAPI-Bearer-invalid`); + cy.openApp(); + createAndRunRestAPIQuery({ + queryName: "get_bearer_auth_invalid", + dsName: `cypress-${data.dataSourceName}-restapi-invalid`, + method: "GET", + urlSuffix: "/bearer", + }); + cy.apiDeleteGDS(`cypress-${data.dataSourceName}-restapi`); + }); + it.skip("Should verify response for authentication code grant type connection", () => { + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dataSourceName}-restapi`, + "restapi", + [ + { + key: "url", + value: "https://dev-6lj2hoxdz5fg3m57.uk.auth0.com/api/v2/users", + }, + { key: "auth_type", value: "oauth2" }, + { key: "grant_type", value: "client_credentials" }, + { key: "add_token_to", value: "header" }, + { key: "header_prefix", value: "Bearer " }, + { + key: "access_token_url", + value: "https://dev-6lj2hoxdz5fg3m57.uk.auth0.com/oauth/token", + }, + { key: "client_id", value: "JBDuuLU9vaSTP6Do7zYSkw0GvVgWhfyZ" }, + { + key: "client_secret", + encrypted: true, + credential_id: "a6d26607-4d09-42a2-8bc0-e5c185c7c2f7", + }, + { + key: "audience", + value: "https://dev-6lj2hoxdz5fg3m57.uk.auth0.com/api/v2/", + }, + { key: "scopes", value: "" }, + { key: "username", value: "", encrypted: false }, + { + key: "password", + encrypted: true, + credential_id: "4502a906-b512-447a-a128-39f67e9778d2", + }, + { + key: "bearer_token", + encrypted: true, + credential_id: "c94262c7-d2c5-4d7f-96f8-657689f2b1f0", + }, + { key: "auth_url", value: "" }, + { key: "client_auth", value: "header" }, + { key: "headers", value: [["", ""]] }, + { key: "custom_query_params", value: [["", ""]], encrypted: false }, + { key: "custom_auth_params", value: [["", ""]] }, + { + key: "access_token_custom_headers", + value: [["", ""]], + encrypted: false, + }, + { key: "multiple_auth_enabled", value: false, encrypted: false }, + { key: "ssl_certificate", value: "none", encrypted: false }, + { key: "retry_network_errors", value: true, encrypted: false }, + ] + ); + cy.reload(); + cy.intercept("GET", "/api/library_apps").as("appLibrary"); + cy.apiCreateApp(`${fake.companyName}-client-Grant-RestAPI`); + }); + it("Should verify response for content-type", () => { + cy.apiCreateApp(`${fake.companyName}-restAPI-Content-App`); + createAndRunRestAPIQuery({ + queryName: "post_json", + dsName: "restapidefault", + method: "POST", + url: "https://jsonplaceholder.typicode.com/posts", + headersList: [["Content-Type", "application/json"]], + rawBody: '{"title": "foo","body": "bar","userId": 1}', + run: true, + urlSuffix: "", + expectedResponseShape: { id: true, title: "foo", body: "bar", userId: 1 }, + }); + createAndRunRestAPIQuery({ + queryName: "post_raw_text", + dsName: "restapidefault", + method: "POST", + url: "https://httpbin.org/post", + headersList: [["Content-Type", "text/plain"]], + rawBody: "This is plain text content", + jsonBody: null, + run: true, + expectedResponseShape: { data: "This is plain text content" }, + }); + createAndRunRestAPIQuery({ + queryName: "post_form_urlencoded", + dsName: "restapidefault", + method: "POST", + url: "https://httpbin.org/post", + headersList: [["Content-Type", "application/x-www-form-urlencoded"]], + bodyList: [ + ["name", "Jane"], + ["age", "30"], + ], + expectedResponseShape: { + "form.name": "Jane", + "form.age": "30", + }, + }); + createAndRunRestAPIQuery({ + queryName: "post_xml_soap", + dsName: "restapidefault", + method: "POST", + url: "http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL", + headersList: [["Content-Type", "text/xml; charset=utf-8"]], + rawBody: ` + + + + + + `, + jsonBody: null, + bodyList: [], + cookiesList: [["session", "abc123"]], + paramsList: [["lang", "en"]], + run: true, + shouldSucceed: true, + expectedResponseShape: {}, + }); + // createAndRunRestAPIQuery({ + // queryName: "post_text_csv", + // dsName: "restapidefault", + // method: "POST", + // url: `https://tejasvi.free.beeceptor.com/csv-upload`, + // headersList: [["Content-Type", "text/csv"]], + // rawBody: + // "id,name,email\n1,Alice,alice@example.com\n2,Bob,bob@example.com", + // expectedResponseShape: { + // data: '{\n "status": "ok",\n "message": "File uploaded successfully",\n "body": id,name,email\n1,Alice,alice@example.com\n2,Bob,bob@example.com\n}', + // }, + // }); + // const filename = "tooljet.png"; + + // createAndRunRestAPIQuery({ + // queryName: "upload_image", + // dsName: "restapidefault", + // method: "POST", + // url: `https://tejasvi.free.beeceptor.commultipart-upload`, + // headersList: [["Content-Type", "multipart/form-data"]], + // bodyList: [ + // ["Image_File", "fixture:Image/tooljet.png"], + // ["filename", filename], + // ], + // expectedResponseShape: { + // filename: filename, + // }, + // }); }); }); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/s3HappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/s3HappyPath.cy.js index 73ccc703c3..79f2534f9e 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/s3HappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/s3HappyPath.cy.js @@ -120,7 +120,7 @@ describe("Data sources AWS S3", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", s3Text.alertRegionIsMissing ); @@ -144,7 +144,7 @@ describe("Data sources AWS S3", () => { ); cy.get(postgreSqlSelector.buttonTestConnection).click(); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", s3Text.alertRegionIsMissing ); @@ -170,7 +170,7 @@ describe("Data sources AWS S3", () => { .click(); cy.get(postgreSqlSelector.buttonTestConnection).click(); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", s3Text.alertInvalidUrl ); @@ -188,7 +188,7 @@ describe("Data sources AWS S3", () => { ); cy.get(postgreSqlSelector.buttonTestConnection).click(); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", s3Text.accessKeyError ); @@ -207,7 +207,7 @@ describe("Data sources AWS S3", () => { cy.get(postgreSqlSelector.buttonTestConnection).click(); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", s3Text.sinatureError ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/smtpHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/smtpHappyPath.cy.js index 506fe5d660..15d716ae8e 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/smtpHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/smtpHappyPath.cy.js @@ -105,7 +105,7 @@ describe("Data source SMTP", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", "Invalid credentials" ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/snowflakeHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/snowflakeHappyPath.cy.js index 7c1fb5b588..e8419657bd 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/snowflakeHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/snowflakeHappyPath.cy.js @@ -128,7 +128,7 @@ describe("Data sources", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", "Invalid account. The specified value must be a valid subdomain string." ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/sqlServerHappyPath.cy.skip.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/sqlServerHappyPath.cy.skip.js index 954fb659b5..1ac953a42b 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/sqlServerHappyPath.cy.skip.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/sqlServerHappyPath.cy.skip.js @@ -132,7 +132,7 @@ describe("Data sources", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", "Failed to connect to localhost:1433 - Could not connect (sequence)" ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/typeSenseHappyPath.cy.skip.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/typeSenseHappyPath.cy.skip.js index 4b4fe20e62..9e480da66c 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/typeSenseHappyPath.cy.skip.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/typeSenseHappyPath.cy.skip.js @@ -96,7 +96,7 @@ describe("Data sources", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", "Ensure that apiKey is set" ); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/version.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/version.cy.js index c0f6064564..3432744fc3 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/version.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/version.cy.js @@ -114,17 +114,30 @@ describe("App Version", () => { cy.wait(3000); // cy.reload(); - cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible", { timeout: 10000 }); + cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible", { + timeout: 10000, + }); // Preview and release verification cy.openInCurrentTab(commonWidgetSelector.previewButton); cy.url().should("include", "/home?version=v2"); - cy.openApp("", Cypress.env("workspaceId"), Cypress.env("appId"), commonWidgetSelector.draggableWidget("text1")); + cy.openApp( + "", + Cypress.env("workspaceId"), + Cypress.env("appId"), + commonWidgetSelector.draggableWidget("text1") + ); releasedVersionAndVerify("v2"); }); it("should verify version management with components and queries", () => { // Initial setup with component and datasource + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + data.datasourceName, + "restapi", + [{ key: "url", value: "https://jsonplaceholder.typicode.com/users" }] + ); cy.apiAddComponentToApp( data.appName, "text1", @@ -134,19 +147,15 @@ describe("App Version", () => { ); cy.waitForAutoSave(); - cy.apiCreateGDS( - `${Cypress.env("server_host")}/api/data-sources`, - data.datasourceName, - "restapi", - [{ key: "url", value: "https://jsonplaceholder.typicode.com/users" }] - ); createRestAPIQuery(data.query1, data.datasourceName, "", "", "/1", true); // Version v2 creation and verification navigateToCreateNewVersionModal("v1"); createNewVersion(["v2"], "v1"); - cy.get(commonWidgetSelector.draggableWidget("text1")) - .verifyVisibleElement("have.text", "Leanne Graham"); + cy.get(commonWidgetSelector.draggableWidget("text1")).verifyVisibleElement( + "have.text", + "Leanne Graham" + ); cy.get(`[data-cy="list-query-${data.query1}"]`).should("be.visible"); // Modify v2 with new components and queries @@ -170,67 +179,79 @@ describe("App Version", () => { create: { version: "v3", from: "v2" }, verify: { component: { selector: "textInput", value: "Ervin Howell" }, - query: data.query2 - } + query: data.query2, + }, }, { create: { version: "v4", from: "v1" }, verify: { component: { selector: "text1", text: "Leanne Graham" }, - query: data.query1 - } + query: data.query1, + }, }, { create: { version: "v5", from: "v3" }, verify: { component: { selector: "textInput", value: "Ervin Howell" }, - query: data.query2 - } - } + query: data.query2, + }, + }, ]; - versionChecks.forEach(check => { + versionChecks.forEach((check) => { navigateToCreateNewVersionModal(check.create.from); createNewVersion([check.create.version], check.create.from); if (check.verify.component.value) { - cy.get(commonWidgetSelector.draggableWidget(check.verify.component.selector)) - .verifyVisibleElement("have.value", check.verify.component.value); + cy.get( + commonWidgetSelector.draggableWidget(check.verify.component.selector) + ).verifyVisibleElement("have.value", check.verify.component.value); } else { - cy.get(commonWidgetSelector.draggableWidget(check.verify.component.selector)) - .verifyVisibleElement("have.text", check.verify.component.text); + cy.get( + commonWidgetSelector.draggableWidget(check.verify.component.selector) + ).verifyVisibleElement("have.text", check.verify.component.text); } - cy.get(`[data-cy="list-query-${check.verify.query}"]`).should("be.visible"); + cy.get(`[data-cy="list-query-${check.verify.query}"]`).should( + "be.visible" + ); }); // Release and version state verification releasedVersionAndVerify("v5"); - cy.get(appVersionSelectors.currentVersionField("v5")) - .should("have.class", "color-light-green"); + cy.get(appVersionSelectors.currentVersionField("v5")).should( + "have.class", + "color-light-green" + ); // Version switching and component verification cy.get(appVersionSelectors.currentVersionField("v5")).click(); cy.contains(`[id*="react-select-"]`, "v4").click(); - cy.get(appVersionSelectors.currentVersionField("v4")) - .should("not.have.class", "color-light-green"); - cy.get(commonWidgetSelector.draggableWidget("text1")) - .verifyVisibleElement("have.text", "Leanne Graham"); + cy.get(appVersionSelectors.currentVersionField("v4")).should( + "not.have.class", + "color-light-green" + ); + cy.get(commonWidgetSelector.draggableWidget("text1")).verifyVisibleElement( + "have.text", + "Leanne Graham" + ); cy.get(`[data-cy="list-query-${data.query1}"]`).should("be.visible"); // Preview and version switching verification cy.openInCurrentTab(commonWidgetSelector.previewButton); cy.url().should("include", "/home?version=v4"); - cy.get(commonWidgetSelector.draggableWidget("text1")) - .verifyVisibleElement("have.text", "Leanne Graham"); + cy.get(commonWidgetSelector.draggableWidget("text1")).verifyVisibleElement( + "have.text", + "Leanne Graham" + ); cy.get('[data-cy="preview-settings"]').click(); switchVersionAndVerify("v4", "v5"); - cy.get(commonWidgetSelector.draggableWidget("textInput")) - .verifyVisibleElement("have.value", "Ervin Howell"); + cy.get( + commonWidgetSelector.draggableWidget("textInput") + ).verifyVisibleElement("have.value", "Ervin Howell"); //url validation should be added after bug fix // cy.url().should("include", "/home?version=v5"); - }); }); diff --git a/cypress-tests/cypress/support/utils/dataSource.js b/cypress-tests/cypress/support/utils/dataSource.js index 4c1446636e..819a807a5f 100644 --- a/cypress-tests/cypress/support/utils/dataSource.js +++ b/cypress-tests/cypress/support/utils/dataSource.js @@ -255,7 +255,7 @@ export const createRestAPIQuery = ( }).then((response) => { const editingVersionId = response.body.editing_version.id; - const data_source_id = Cypress.env(kind); + const data_source_id = Cypress.env(`${dsName}`); const requestBody = { app_id: Cypress.env("appId"), diff --git a/cypress-tests/cypress/support/utils/restAPI.js b/cypress-tests/cypress/support/utils/restAPI.js index 2dfc225a65..f87c8d6f61 100644 --- a/cypress-tests/cypress/support/utils/restAPI.js +++ b/cypress-tests/cypress/support/utils/restAPI.js @@ -1,19 +1,31 @@ -export const createAndRunRestAPIQuery = ( +export const createAndRunRestAPIQuery = ({ queryName, dsName, method = "GET", url = "", + urlSuffix = "", headersList = [], bodyList = [], jsonBody = null, + rawBody = null, + cookiesList = [], + paramsList = [], run = true, - urlSuffix = "" -) => { + expectedResponseShape = {}, + authType = "", + authToken = "", +}) => { cy.getCookie("tj_auth_token").then((cookie) => { const headers = { "Tj-Workspace-Id": Cypress.env("workspaceId"), Cookie: `tj_auth_token=${cookie.value}`, }; + // if (authType === "bearer" || authType === "oauth2") { + // headers["Authorization"] = `Bearer ${authToken}`; + // } else if (authType === "basic") { + // headers["Authorization"] = `Basic ${btoa(authToken)}`; + // } + cy.request({ method: "GET", url: `${Cypress.env("server_host")}/api/apps/${Cypress.env("appId")}`, @@ -27,84 +39,108 @@ export const createAndRunRestAPIQuery = ( url: `${Cypress.env("server_host")}/api/data-sources/${Cypress.env("workspaceId")}/environments/${currentEnvironmentId}/versions/${editingVersionId}`, headers, }).then((dsResponse) => { - expect(dsResponse.status).to.eq(200); - const dataSource = dsResponse.body.data_sources.find( (ds) => ds.name === dsName ); - - if (!dataSource) { - throw new Error(`Data source '${dsName}' not found.`); - } - - const data_source_id = dataSource.id; - const useJsonBody = - ["POST", "PATCH", "PUT"].includes(method.toUpperCase()) && - jsonBody !== null; + const useJson = jsonBody !== null; + const useRaw = rawBody !== null; + const useForm = bodyList?.length && !useJson && !useRaw; const queryOptions = { method: method.toLowerCase(), url: url + urlSuffix, - url_params: [["", ""]], + url_params: paramsList.length ? paramsList : [["", ""]], headers: headersList.length ? headersList : [["", ""]], - body: !useJsonBody && bodyList.length ? bodyList : [["", ""]], - json_body: useJsonBody ? jsonBody : null, - body_toggle: useJsonBody, + cookies: cookiesList.length ? cookiesList : [["", ""]], + body: useForm ? bodyList : [["", ""]], + json_body: useJson ? jsonBody : null, + raw_body: useRaw ? rawBody : "", + body_toggle: useJson || useRaw, runOnPageLoad: run, transformationLanguage: "javascript", enableTransformation: false, }; - const requestBody = { app_id: Cypress.env("appId"), app_version_id: editingVersionId, name: queryName, kind: "restapi", options: queryOptions, - data_source_id, + data_source_id: dataSource.id, plugin_id: null, }; cy.request({ method: "POST", - url: `${Cypress.env("server_host")}/api/data-queries/data-sources/${data_source_id}/versions/${editingVersionId}`, + url: `${Cypress.env("server_host")}/api/data-queries/data-sources/${dataSource.id}/versions/${editingVersionId}`, headers, body: requestBody, }).then((createResponse) => { - expect(createResponse.status).to.equal(201); + expect(createResponse.status).to.eq(201); const queryId = createResponse.body.id; - cy.log("Query created successfully:", queryId); - const createdOptions = createResponse.body.options; - expect(createdOptions.method).to.equal(queryOptions.method); - expect(createdOptions.url).to.equal(queryOptions.url); - expect(createdOptions.headers).to.deep.equal(queryOptions.headers); - - if (useJsonBody) { - expect(createdOptions.json_body).to.deep.equal( - queryOptions.json_body - ); - expect(createdOptions.body_toggle).to.equal(true); - } else { - expect(createdOptions.body).to.deep.equal(queryOptions.body); - expect(createdOptions.body_toggle).to.equal(false); - } - - expect(createdOptions.runOnPageLoad).to.equal(run); - cy.log("Metadata verified successfully"); if (run) { cy.request({ method: "POST", url: `${Cypress.env("server_host")}/api/data-queries/${queryId}/run`, headers, + failOnStatusCode: false, }).then((runResponse) => { - expect([200, 201]).to.include(runResponse.status); - cy.log("Query executed successfully:", runResponse.body); - if (runResponse.body?.data.id) { - cy.writeFile("cypress/fixtures/restAPI/storedId.json", { - id: runResponse.body.data.id, - }); - cy.log("Stored ID:", runResponse.body.data.id); + const responseData = runResponse.body?.data; + const requestHeaders = + runResponse.body?.metadata?.request?.headers || {}; + + if (runResponse.body.status === "ok") { + expect([200, 201]).to.include(runResponse.status); + cy.log("Response:", responseData); + if ( + expectedResponseShape && + typeof expectedResponseShape === "object" + ) { + Object.entries(expectedResponseShape).forEach( + ([path, expected]) => { + const value = path + .split(".") + .reduce((obj, key) => obj?.[key], responseData); + + if (expected === true) { + expect(value).to.not.be.undefined; + } else { + expect(value).to.eq(expected); + } + } + ); + } + + const expectedContentType = headersList.find( + ([key]) => key.toLowerCase() === "content-type" + )?.[1]; + if (expectedContentType && requestHeaders["content-type"]) { + expect(requestHeaders["content-type"]).to.include( + expectedContentType + ); + } + if (Array.isArray(responseData)) { + responseData.forEach((item) => { + expect(item).to.have.any.keys("id", "name", "price"); + }); + } + if (responseData?.id) { + cy.writeFile("cypress/fixtures/restAPI/storedId.json", { + id: responseData.id, + }); + } + } else if (runResponse.body.status === "failed") { + expect(runResponse.body.message).to.eq( + "Query could not be completed" + ); + const statusCode = + runResponse.body?.metadata?.response?.statusCode; + expect([400, 401, 403, 404, 500]).to.include(statusCode); + cy.log( + "Failure validated as expected with status:", + statusCode + ); } }); } From afb27b8673170eb9f8817ef6f706995f060d4195 Mon Sep 17 00:00:00 2001 From: Parth <108089718+parthy007@users.noreply.github.com> Date: Tue, 27 May 2025 21:03:15 +0530 Subject: [PATCH 11/19] Feature: Add Clickup plugin (#12703) * initialize clickup plugin, add getConnection and testConnection Signed-off-by: thesynthax * including the openapi yaml Signed-off-by: thesynthax * trying to attach the openapi spec Signed-off-by: thesynthax * Fix key casing mismatch * Update copywriting * Fix clickup logic * Filter limited operation request * Add error standardisation * Fix asterik symbol position * Fix copywriting * Fix wrong URL * Fix asterisk gapping * Handle array types * Update marketplace package-lock.json * Add the same package-lock as release branch * chore: update package-lock.json --------- Signed-off-by: thesynthax Co-authored-by: thesynthax Co-authored-by: Akshay Sasidharan --- frontend/src/_components/ApiEndpointInput.jsx | 116 ++-- frontend/src/_components/DynamicForm.jsx | 4 +- marketplace/package-lock.json | 544 +++++++++--------- marketplace/plugins/clickup/.gitignore | 5 + marketplace/plugins/clickup/README.md | 4 + .../plugins/clickup/__tests__/index.js | 7 + marketplace/plugins/clickup/lib/icon.svg | 19 + marketplace/plugins/clickup/lib/index.ts | 114 ++++ marketplace/plugins/clickup/lib/manifest.json | 34 ++ .../plugins/clickup/lib/operations.json | 16 + marketplace/plugins/clickup/lib/types.ts | 3 + marketplace/plugins/clickup/package.json | 26 + marketplace/plugins/clickup/tsconfig.json | 11 + plugins/packages/stripe/lib/operations.json | 26 +- server/src/assets/marketplace/plugins.json | 8 + 15 files changed, 610 insertions(+), 327 deletions(-) create mode 100644 marketplace/plugins/clickup/.gitignore create mode 100644 marketplace/plugins/clickup/README.md create mode 100644 marketplace/plugins/clickup/__tests__/index.js create mode 100644 marketplace/plugins/clickup/lib/icon.svg create mode 100644 marketplace/plugins/clickup/lib/index.ts create mode 100644 marketplace/plugins/clickup/lib/manifest.json create mode 100644 marketplace/plugins/clickup/lib/operations.json create mode 100644 marketplace/plugins/clickup/lib/types.ts create mode 100644 marketplace/plugins/clickup/package.json create mode 100644 marketplace/plugins/clickup/tsconfig.json diff --git a/frontend/src/_components/ApiEndpointInput.jsx b/frontend/src/_components/ApiEndpointInput.jsx index 193413ee07..9c872af659 100644 --- a/frontend/src/_components/ApiEndpointInput.jsx +++ b/frontend/src/_components/ApiEndpointInput.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useState, useLayoutEffect, useRef } from 'react'; import { openapiService } from '@/_services'; import Select from '@/_ui/Select'; import { queryManagerSelectComponentStyle } from '@/_ui/Select/styles'; @@ -110,7 +110,7 @@ const ApiEndpointInput = (props) => { if (isEmpty(paths)) return []; const pathGroups = Object.keys(paths).reduce((acc, path) => { - const operations = Object.keys(paths[path]); + const operations = Object.keys(paths[path]).filter((op) => Object.keys(operationColorMapping).includes(op)); const category = path.split('/')[2]; operations.forEach((operation) => categorizeOperations(operation, path, acc, category)); return acc; @@ -135,7 +135,7 @@ const ApiEndpointInput = (props) => { {loadingSpec && (
- {props.t('stripe', 'Please wait while we load the OpenAPI specification.')} + Please wait while we load the OpenAPI specification.
)} {options && !loadingSpec && ( @@ -227,57 +227,64 @@ const RenderParameterFields = ({ parameters, type, label, options, changeParam, } const paramLabelWithDescription = (param) => { + const label = type === 'request' ? param : param.name; + const description = type === 'request' ? parameters[param]?.description : param.description; + return ( - -
- + +
+
); }; const paramLabelWithoutDescription = (param) => { - return ( - - ); - }; + const label = type === 'request' ? param : param.name; - const paramType = (param) => { return ( -
- {type === 'query' && - param?.schema?.anyOf && - param?.schema?.anyOf.map((type, i) => - i < param.schema?.anyOf.length - 1 - ? type.type.substring(0, 3).toUpperCase() + '|' - : type.type.substring(0, 3).toUpperCase() - )} - {(type === 'path' || (type === 'query' && !param?.schema?.anyOf)) && - param?.schema?.type?.substring(0, 3).toUpperCase()} - {type === 'request' && parameters[param].type?.substring(0, 3).toUpperCase()} +
+
); }; + const paramType = (param) => { + let paramTypeValue; + + if (type === 'query') { + if (param?.schema?.anyOf) { + return ( +
+ {param.schema.anyOf.map((typeObj, i) => + i < param.schema.anyOf.length - 1 + ? (typeObj.type || '').toString().substring(0, 3).toUpperCase() + '|' + : (typeObj.type || '').toString().substring(0, 3).toUpperCase() + )} +
+ ); + } + paramTypeValue = param?.schema?.type; + } else if (type === 'path') { + paramTypeValue = param?.schema?.type; + } else if (type === 'request') { + paramTypeValue = parameters[param]?.type; + } + + const displayType = Array.isArray(paramTypeValue) ? paramTypeValue[0] : paramTypeValue; + + return
{displayType?.toString().substring(0, 3).toUpperCase() || ''}
; + }; + const paramDetails = (param) => { return ( -
- {(type === 'request' && parameters[param].description) || param?.description - ? paramLabelWithDescription(param) - : paramLabelWithoutDescription(param)} - {param.required && *} +
+
+ {(type === 'request' && parameters[param].description) || param?.description + ? paramLabelWithDescription(param) + : paramLabelWithoutDescription(param)} + {param.required && *} +
{paramType(param)}
); @@ -359,3 +366,34 @@ RenderParameterFields.propTypes = { removeParam: PropTypes.func, darkMode: PropTypes.bool, }; + +const AutoWidthText = ({ value, className }) => { + const spanRef = useRef(null); + const [width, setWidth] = useState(0); + + useLayoutEffect(() => { + if (spanRef.current) { + setWidth(spanRef.current.offsetWidth); + } + }, [value]); + + return ( +
+ + {value} + + {value} +
+ ); +}; diff --git a/frontend/src/_components/DynamicForm.jsx b/frontend/src/_components/DynamicForm.jsx index a71974afc4..bdc7f71054 100644 --- a/frontend/src/_components/DynamicForm.jsx +++ b/frontend/src/_components/DynamicForm.jsx @@ -245,7 +245,7 @@ const DynamicForm = ({ encrypted, placeholders = {}, editorType = 'basic', - specUrl = '', + spec_url = '', disabled = false, buttonText, text, @@ -486,7 +486,7 @@ const DynamicForm = ({ }; case 'react-component-api-endpoint': return { - specUrl: specUrl, + specUrl: spec_url, optionsChanged, options, darkMode, diff --git a/marketplace/package-lock.json b/marketplace/package-lock.json index 10de0c24d6..5c831b79c0 100644 --- a/marketplace/package-lock.json +++ b/marketplace/package-lock.json @@ -200,23 +200,23 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.812.0.tgz", - "integrity": "sha512-LWkP+Vb2f6aNaway06XvFZG3altSXltAClzCz9cTFuOfKG6V2X+0VWsW9cnFRV4+MFFJW3iQAaPMQ1fBO9Rusg==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.817.0.tgz", + "integrity": "sha512-MNGwOJDQU0jpvsLLPSuPQDhPtDzFTc/k7rLmiKoPrIlgb3Y8pSF4crpJ+ZH3+xod2NWyyOVMEMQeMaKFFdMaKw==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.812.0", - "@aws-sdk/credential-provider-node": "3.812.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/credential-provider-node": "3.817.0", "@aws-sdk/middleware-host-header": "3.804.0", "@aws-sdk/middleware-logger": "3.804.0", "@aws-sdk/middleware-recursion-detection": "3.804.0", - "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/middleware-user-agent": "3.816.0", "@aws-sdk/region-config-resolver": "3.808.0", "@aws-sdk/types": "3.804.0", "@aws-sdk/util-endpoints": "3.808.0", "@aws-sdk/util-user-agent-browser": "3.804.0", - "@aws-sdk/util-user-agent-node": "3.812.0", + "@aws-sdk/util-user-agent-node": "3.816.0", "@smithy/config-resolver": "^4.1.2", "@smithy/core": "^3.3.3", "@smithy/fetch-http-handler": "^5.0.2", @@ -318,22 +318,22 @@ } }, "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/client-sso": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.812.0.tgz", - "integrity": "sha512-O//smQRj1+RXELB7xX54s5pZB0V69KHXpUZmz8V+8GAYO1FKTHfbpUgK+zyMNb+lFZxG9B69yl8pWPZ/K8bvxA==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.817.0.tgz", + "integrity": "sha512-fCh5rUHmWmWDvw70NNoWpE5+BRdtNi45kDnIoeoszqVg7UKF79SlG+qYooUT52HKCgDNHqgbWaXxMOSqd2I/OQ==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.812.0", + "@aws-sdk/core": "3.816.0", "@aws-sdk/middleware-host-header": "3.804.0", "@aws-sdk/middleware-logger": "3.804.0", "@aws-sdk/middleware-recursion-detection": "3.804.0", - "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/middleware-user-agent": "3.816.0", "@aws-sdk/region-config-resolver": "3.808.0", "@aws-sdk/types": "3.804.0", "@aws-sdk/util-endpoints": "3.808.0", "@aws-sdk/util-user-agent-browser": "3.804.0", - "@aws-sdk/util-user-agent-node": "3.812.0", + "@aws-sdk/util-user-agent-node": "3.816.0", "@smithy/config-resolver": "^4.1.2", "@smithy/core": "^3.3.3", "@smithy/fetch-http-handler": "^5.0.2", @@ -366,9 +366,9 @@ } }, "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/core": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.812.0.tgz", - "integrity": "sha512-myWA9oHMBVDObKrxG+puAkIGs8igcWInQ1PWCRTS/zN4BkhUMFjjh/JPV/4Vzvtvj5E36iujq2WtlrDLl1PpOw==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.816.0.tgz", + "integrity": "sha512-Lx50wjtyarzKpMFV6V+gjbSZDgsA/71iyifbClGUSiNPoIQ4OCV0KVOmAAj7mQRVvGJqUMWKVM+WzK79CjbjWA==", "dependencies": { "@aws-sdk/types": "3.804.0", "@smithy/core": "^3.3.3", @@ -387,11 +387,11 @@ } }, "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.812.0.tgz", - "integrity": "sha512-Ge7IEu06ANurGBZx39q9CNN/ncqb1K8lpKZCY969uNWO0/7YPhnplrRJGMZYIS35nD2mBm3ortEKjY/wMZZd5g==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.816.0.tgz", + "integrity": "sha512-wUJZwRLe+SxPxRV9AENYBLrJZRrNIo+fva7ZzejsC83iz7hdfq6Rv6B/aHEdPwG/nQC4+q7UUvcRPlomyrpsBA==", "dependencies": { - "@aws-sdk/core": "3.812.0", + "@aws-sdk/core": "3.816.0", "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/types": "^4.2.0", @@ -402,11 +402,11 @@ } }, "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.812.0.tgz", - "integrity": "sha512-Vux2U42vPGXeE407Lp6v3yVA65J7hBO9rB67LXshyGVi7VZLAYWc4mrZxNJNqabEkjcDEmMQQakLPT6zc5SvFw==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.816.0.tgz", + "integrity": "sha512-gcWGzMQ7yRIF+ljTkR8Vzp7727UY6cmeaPrFQrvcFB8PhOqWpf7g0JsgOf5BSaP8CkkSQcTQHc0C5ZYAzUFwPg==", "dependencies": { - "@aws-sdk/core": "3.812.0", + "@aws-sdk/core": "3.816.0", "@aws-sdk/types": "3.804.0", "@smithy/fetch-http-handler": "^5.0.2", "@smithy/node-http-handler": "^4.0.4", @@ -422,17 +422,17 @@ } }, "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.812.0.tgz", - "integrity": "sha512-oltqGvQ488xtPY5wrNjbD+qQYYkuCjn30IDE1qKMxJ58EM6UVTQl3XV44Xq07xfF5gKwVJQkfIyOkRAguOVybg==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.817.0.tgz", + "integrity": "sha512-kyEwbQyuXE+phWVzloMdkFv6qM6NOon+asMXY5W0fhDKwBz9zQLObDRWBrvQX9lmqq8BbDL1sCfZjOh82Y+RFw==", "dependencies": { - "@aws-sdk/core": "3.812.0", - "@aws-sdk/credential-provider-env": "3.812.0", - "@aws-sdk/credential-provider-http": "3.812.0", - "@aws-sdk/credential-provider-process": "3.812.0", - "@aws-sdk/credential-provider-sso": "3.812.0", - "@aws-sdk/credential-provider-web-identity": "3.812.0", - "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/credential-provider-env": "3.816.0", + "@aws-sdk/credential-provider-http": "3.816.0", + "@aws-sdk/credential-provider-process": "3.816.0", + "@aws-sdk/credential-provider-sso": "3.817.0", + "@aws-sdk/credential-provider-web-identity": "3.817.0", + "@aws-sdk/nested-clients": "3.817.0", "@aws-sdk/types": "3.804.0", "@smithy/credential-provider-imds": "^4.0.4", "@smithy/property-provider": "^4.0.2", @@ -445,16 +445,16 @@ } }, "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.812.0.tgz", - "integrity": "sha512-SnvSWBP6cr9nqx784eETnL2Zl7ZnMB/oJgFVEG1aejAGbT1H9gTpMwuUsBXk4u/mEYe3f1lh1Wqo+HwDgNkfrg==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.817.0.tgz", + "integrity": "sha512-b5mz7av0Lhavs1Bz3Zb+jrs0Pki93+8XNctnVO0drBW98x1fM4AR38cWvGbM/w9F9Q0/WEH3TinkmrMPrP4T/w==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.812.0", - "@aws-sdk/credential-provider-http": "3.812.0", - "@aws-sdk/credential-provider-ini": "3.812.0", - "@aws-sdk/credential-provider-process": "3.812.0", - "@aws-sdk/credential-provider-sso": "3.812.0", - "@aws-sdk/credential-provider-web-identity": "3.812.0", + "@aws-sdk/credential-provider-env": "3.816.0", + "@aws-sdk/credential-provider-http": "3.816.0", + "@aws-sdk/credential-provider-ini": "3.817.0", + "@aws-sdk/credential-provider-process": "3.816.0", + "@aws-sdk/credential-provider-sso": "3.817.0", + "@aws-sdk/credential-provider-web-identity": "3.817.0", "@aws-sdk/types": "3.804.0", "@smithy/credential-provider-imds": "^4.0.4", "@smithy/property-provider": "^4.0.2", @@ -467,11 +467,11 @@ } }, "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.812.0.tgz", - "integrity": "sha512-YI8bb153XeEOb59F9KtTZEwDAc14s2YHZz58+OFiJ2udnKsPV87mNiFhJPW6ba9nmOLXVat5XDcwtVT1b664wg==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.816.0.tgz", + "integrity": "sha512-9Tm+AxMoV2Izvl5b9tyMQRbBwaex8JP06HN7ZeCXgC5sAsSN+o8dsThnEhf8jKN+uBpT6CLWKN1TXuUMrAmW1A==", "dependencies": { - "@aws-sdk/core": "3.812.0", + "@aws-sdk/core": "3.816.0", "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", @@ -483,13 +483,13 @@ } }, "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.812.0.tgz", - "integrity": "sha512-ODsPcNhgiO6GOa82TVNskM97mml9rioe9Cbhemz48lkfDQPv1u06NaCR0o3FsvprX1sEhMvJTR3sE1fyEOzvJQ==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.817.0.tgz", + "integrity": "sha512-gFUAW3VmGvdnueK1bh6TOcRX+j99Xm0men1+gz3cA4RE+rZGNy1Qjj8YHlv0hPwI9OnTPZquvPzA5fkviGREWg==", "dependencies": { - "@aws-sdk/client-sso": "3.812.0", - "@aws-sdk/core": "3.812.0", - "@aws-sdk/token-providers": "3.812.0", + "@aws-sdk/client-sso": "3.817.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/token-providers": "3.817.0", "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", @@ -501,12 +501,12 @@ } }, "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.812.0.tgz", - "integrity": "sha512-E9Bmiujvm/Hp9DM/Vc1S+D0pQbx8/x4dR/zyAEZU9EoRq0duQOQ1reWYWbebYmL1OklcVpTfKV0a/VCwuAtGSg==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.817.0.tgz", + "integrity": "sha512-A2kgkS9g6NY0OMT2f2EdXHpL17Ym81NhbGnQ8bRXPqESIi7TFypFD2U6osB2VnsFv+MhwM+Ke4PKXSmLun22/A==", "dependencies": { - "@aws-sdk/core": "3.812.0", - "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/nested-clients": "3.817.0", "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/types": "^4.2.0", @@ -558,11 +558,11 @@ } }, "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.812.0.tgz", - "integrity": "sha512-r+HFwtSvnAs6Fydp4mijylrTX0og9p/xfxOcKsqhMuk3HpZAIcf9sSjRQI6MBusYklg7pnM4sGEnPAZIrdRotA==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.816.0.tgz", + "integrity": "sha512-bHRSlWZ0xDsFR8E2FwDb//0Ff6wMkVx4O+UKsfyNlAbtqCiiHRt5ANNfKPafr95cN2CCxLxiPvFTFVblQM5TsQ==", "dependencies": { - "@aws-sdk/core": "3.812.0", + "@aws-sdk/core": "3.816.0", "@aws-sdk/types": "3.804.0", "@aws-sdk/util-endpoints": "3.808.0", "@smithy/core": "^3.3.3", @@ -591,11 +591,12 @@ } }, "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/token-providers": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.812.0.tgz", - "integrity": "sha512-dbVBaKxrxE708ub5uH3w+cmKIeRQas+2Xf6rpckhohYY+IiflGOdK6aLrp3T6dOQgr/FJ37iQtcYNonAG+yVBQ==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.817.0.tgz", + "integrity": "sha512-CYN4/UO0VaqyHf46ogZzNrVX7jI3/CfiuktwKlwtpKA6hjf2+ivfgHSKzPpgPBcSEfiibA/26EeLuMnB6cpSrQ==", "dependencies": { - "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/nested-clients": "3.817.0", "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", @@ -644,11 +645,11 @@ } }, "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.812.0.tgz", - "integrity": "sha512-8pt+OkHhS2U0LDwnzwRnFxyKn8sjSe752OIZQCNv263odud8jQu9pYO2pKqb2kRBk9h9szynjZBDLXfnvSQ7Bg==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.816.0.tgz", + "integrity": "sha512-Q6dxmuj4hL7pudhrneWEQ7yVHIQRBFr0wqKLF1opwOi1cIePuoEbPyJ2jkel6PDEv1YMfvsAKaRshp6eNA8VHg==", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/middleware-user-agent": "3.816.0", "@aws-sdk/types": "3.804.0", "@smithy/node-config-provider": "^4.1.1", "@smithy/types": "^4.2.0", @@ -2818,23 +2819,23 @@ } }, "node_modules/@aws-sdk/client-sagemaker": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker/-/client-sagemaker-3.812.0.tgz", - "integrity": "sha512-KX+/Iu8Cde32low/0c+MGx03CShRJ9PB57qJtPtG6qgz0PeZc8e+t6lBjyZt33iUKZ25/Mt9277tXaSmxGpktw==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker/-/client-sagemaker-3.817.0.tgz", + "integrity": "sha512-ziLmZu31SLUfBU+L43mTKJbxO7GyezHvAFVrk0GIZslHNBBwIsImv5j1aAqkOlvn36twH2n5CXJZPrEt0nH0+A==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.812.0", - "@aws-sdk/credential-provider-node": "3.812.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/credential-provider-node": "3.817.0", "@aws-sdk/middleware-host-header": "3.804.0", "@aws-sdk/middleware-logger": "3.804.0", "@aws-sdk/middleware-recursion-detection": "3.804.0", - "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/middleware-user-agent": "3.816.0", "@aws-sdk/region-config-resolver": "3.808.0", "@aws-sdk/types": "3.804.0", "@aws-sdk/util-endpoints": "3.808.0", "@aws-sdk/util-user-agent-browser": "3.804.0", - "@aws-sdk/util-user-agent-node": "3.812.0", + "@aws-sdk/util-user-agent-node": "3.816.0", "@smithy/config-resolver": "^4.1.2", "@smithy/core": "^3.3.3", "@smithy/fetch-http-handler": "^5.0.2", @@ -2939,22 +2940,22 @@ } }, "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/client-sso": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.812.0.tgz", - "integrity": "sha512-O//smQRj1+RXELB7xX54s5pZB0V69KHXpUZmz8V+8GAYO1FKTHfbpUgK+zyMNb+lFZxG9B69yl8pWPZ/K8bvxA==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.817.0.tgz", + "integrity": "sha512-fCh5rUHmWmWDvw70NNoWpE5+BRdtNi45kDnIoeoszqVg7UKF79SlG+qYooUT52HKCgDNHqgbWaXxMOSqd2I/OQ==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.812.0", + "@aws-sdk/core": "3.816.0", "@aws-sdk/middleware-host-header": "3.804.0", "@aws-sdk/middleware-logger": "3.804.0", "@aws-sdk/middleware-recursion-detection": "3.804.0", - "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/middleware-user-agent": "3.816.0", "@aws-sdk/region-config-resolver": "3.808.0", "@aws-sdk/types": "3.804.0", "@aws-sdk/util-endpoints": "3.808.0", "@aws-sdk/util-user-agent-browser": "3.804.0", - "@aws-sdk/util-user-agent-node": "3.812.0", + "@aws-sdk/util-user-agent-node": "3.816.0", "@smithy/config-resolver": "^4.1.2", "@smithy/core": "^3.3.3", "@smithy/fetch-http-handler": "^5.0.2", @@ -2987,9 +2988,9 @@ } }, "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/core": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.812.0.tgz", - "integrity": "sha512-myWA9oHMBVDObKrxG+puAkIGs8igcWInQ1PWCRTS/zN4BkhUMFjjh/JPV/4Vzvtvj5E36iujq2WtlrDLl1PpOw==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.816.0.tgz", + "integrity": "sha512-Lx50wjtyarzKpMFV6V+gjbSZDgsA/71iyifbClGUSiNPoIQ4OCV0KVOmAAj7mQRVvGJqUMWKVM+WzK79CjbjWA==", "dependencies": { "@aws-sdk/types": "3.804.0", "@smithy/core": "^3.3.3", @@ -3008,11 +3009,11 @@ } }, "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.812.0.tgz", - "integrity": "sha512-Ge7IEu06ANurGBZx39q9CNN/ncqb1K8lpKZCY969uNWO0/7YPhnplrRJGMZYIS35nD2mBm3ortEKjY/wMZZd5g==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.816.0.tgz", + "integrity": "sha512-wUJZwRLe+SxPxRV9AENYBLrJZRrNIo+fva7ZzejsC83iz7hdfq6Rv6B/aHEdPwG/nQC4+q7UUvcRPlomyrpsBA==", "dependencies": { - "@aws-sdk/core": "3.812.0", + "@aws-sdk/core": "3.816.0", "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/types": "^4.2.0", @@ -3023,11 +3024,11 @@ } }, "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.812.0.tgz", - "integrity": "sha512-Vux2U42vPGXeE407Lp6v3yVA65J7hBO9rB67LXshyGVi7VZLAYWc4mrZxNJNqabEkjcDEmMQQakLPT6zc5SvFw==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.816.0.tgz", + "integrity": "sha512-gcWGzMQ7yRIF+ljTkR8Vzp7727UY6cmeaPrFQrvcFB8PhOqWpf7g0JsgOf5BSaP8CkkSQcTQHc0C5ZYAzUFwPg==", "dependencies": { - "@aws-sdk/core": "3.812.0", + "@aws-sdk/core": "3.816.0", "@aws-sdk/types": "3.804.0", "@smithy/fetch-http-handler": "^5.0.2", "@smithy/node-http-handler": "^4.0.4", @@ -3043,17 +3044,17 @@ } }, "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.812.0.tgz", - "integrity": "sha512-oltqGvQ488xtPY5wrNjbD+qQYYkuCjn30IDE1qKMxJ58EM6UVTQl3XV44Xq07xfF5gKwVJQkfIyOkRAguOVybg==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.817.0.tgz", + "integrity": "sha512-kyEwbQyuXE+phWVzloMdkFv6qM6NOon+asMXY5W0fhDKwBz9zQLObDRWBrvQX9lmqq8BbDL1sCfZjOh82Y+RFw==", "dependencies": { - "@aws-sdk/core": "3.812.0", - "@aws-sdk/credential-provider-env": "3.812.0", - "@aws-sdk/credential-provider-http": "3.812.0", - "@aws-sdk/credential-provider-process": "3.812.0", - "@aws-sdk/credential-provider-sso": "3.812.0", - "@aws-sdk/credential-provider-web-identity": "3.812.0", - "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/credential-provider-env": "3.816.0", + "@aws-sdk/credential-provider-http": "3.816.0", + "@aws-sdk/credential-provider-process": "3.816.0", + "@aws-sdk/credential-provider-sso": "3.817.0", + "@aws-sdk/credential-provider-web-identity": "3.817.0", + "@aws-sdk/nested-clients": "3.817.0", "@aws-sdk/types": "3.804.0", "@smithy/credential-provider-imds": "^4.0.4", "@smithy/property-provider": "^4.0.2", @@ -3066,16 +3067,16 @@ } }, "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.812.0.tgz", - "integrity": "sha512-SnvSWBP6cr9nqx784eETnL2Zl7ZnMB/oJgFVEG1aejAGbT1H9gTpMwuUsBXk4u/mEYe3f1lh1Wqo+HwDgNkfrg==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.817.0.tgz", + "integrity": "sha512-b5mz7av0Lhavs1Bz3Zb+jrs0Pki93+8XNctnVO0drBW98x1fM4AR38cWvGbM/w9F9Q0/WEH3TinkmrMPrP4T/w==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.812.0", - "@aws-sdk/credential-provider-http": "3.812.0", - "@aws-sdk/credential-provider-ini": "3.812.0", - "@aws-sdk/credential-provider-process": "3.812.0", - "@aws-sdk/credential-provider-sso": "3.812.0", - "@aws-sdk/credential-provider-web-identity": "3.812.0", + "@aws-sdk/credential-provider-env": "3.816.0", + "@aws-sdk/credential-provider-http": "3.816.0", + "@aws-sdk/credential-provider-ini": "3.817.0", + "@aws-sdk/credential-provider-process": "3.816.0", + "@aws-sdk/credential-provider-sso": "3.817.0", + "@aws-sdk/credential-provider-web-identity": "3.817.0", "@aws-sdk/types": "3.804.0", "@smithy/credential-provider-imds": "^4.0.4", "@smithy/property-provider": "^4.0.2", @@ -3088,11 +3089,11 @@ } }, "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.812.0.tgz", - "integrity": "sha512-YI8bb153XeEOb59F9KtTZEwDAc14s2YHZz58+OFiJ2udnKsPV87mNiFhJPW6ba9nmOLXVat5XDcwtVT1b664wg==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.816.0.tgz", + "integrity": "sha512-9Tm+AxMoV2Izvl5b9tyMQRbBwaex8JP06HN7ZeCXgC5sAsSN+o8dsThnEhf8jKN+uBpT6CLWKN1TXuUMrAmW1A==", "dependencies": { - "@aws-sdk/core": "3.812.0", + "@aws-sdk/core": "3.816.0", "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", @@ -3104,13 +3105,13 @@ } }, "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.812.0.tgz", - "integrity": "sha512-ODsPcNhgiO6GOa82TVNskM97mml9rioe9Cbhemz48lkfDQPv1u06NaCR0o3FsvprX1sEhMvJTR3sE1fyEOzvJQ==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.817.0.tgz", + "integrity": "sha512-gFUAW3VmGvdnueK1bh6TOcRX+j99Xm0men1+gz3cA4RE+rZGNy1Qjj8YHlv0hPwI9OnTPZquvPzA5fkviGREWg==", "dependencies": { - "@aws-sdk/client-sso": "3.812.0", - "@aws-sdk/core": "3.812.0", - "@aws-sdk/token-providers": "3.812.0", + "@aws-sdk/client-sso": "3.817.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/token-providers": "3.817.0", "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", @@ -3122,12 +3123,12 @@ } }, "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.812.0.tgz", - "integrity": "sha512-E9Bmiujvm/Hp9DM/Vc1S+D0pQbx8/x4dR/zyAEZU9EoRq0duQOQ1reWYWbebYmL1OklcVpTfKV0a/VCwuAtGSg==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.817.0.tgz", + "integrity": "sha512-A2kgkS9g6NY0OMT2f2EdXHpL17Ym81NhbGnQ8bRXPqESIi7TFypFD2U6osB2VnsFv+MhwM+Ke4PKXSmLun22/A==", "dependencies": { - "@aws-sdk/core": "3.812.0", - "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/nested-clients": "3.817.0", "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/types": "^4.2.0", @@ -3179,11 +3180,11 @@ } }, "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.812.0.tgz", - "integrity": "sha512-r+HFwtSvnAs6Fydp4mijylrTX0og9p/xfxOcKsqhMuk3HpZAIcf9sSjRQI6MBusYklg7pnM4sGEnPAZIrdRotA==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.816.0.tgz", + "integrity": "sha512-bHRSlWZ0xDsFR8E2FwDb//0Ff6wMkVx4O+UKsfyNlAbtqCiiHRt5ANNfKPafr95cN2CCxLxiPvFTFVblQM5TsQ==", "dependencies": { - "@aws-sdk/core": "3.812.0", + "@aws-sdk/core": "3.816.0", "@aws-sdk/types": "3.804.0", "@aws-sdk/util-endpoints": "3.808.0", "@smithy/core": "^3.3.3", @@ -3212,11 +3213,12 @@ } }, "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/token-providers": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.812.0.tgz", - "integrity": "sha512-dbVBaKxrxE708ub5uH3w+cmKIeRQas+2Xf6rpckhohYY+IiflGOdK6aLrp3T6dOQgr/FJ37iQtcYNonAG+yVBQ==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.817.0.tgz", + "integrity": "sha512-CYN4/UO0VaqyHf46ogZzNrVX7jI3/CfiuktwKlwtpKA6hjf2+ivfgHSKzPpgPBcSEfiibA/26EeLuMnB6cpSrQ==", "dependencies": { - "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/nested-clients": "3.817.0", "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", @@ -3265,11 +3267,11 @@ } }, "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.812.0.tgz", - "integrity": "sha512-8pt+OkHhS2U0LDwnzwRnFxyKn8sjSe752OIZQCNv263odud8jQu9pYO2pKqb2kRBk9h9szynjZBDLXfnvSQ7Bg==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.816.0.tgz", + "integrity": "sha512-Q6dxmuj4hL7pudhrneWEQ7yVHIQRBFr0wqKLF1opwOi1cIePuoEbPyJ2jkel6PDEv1YMfvsAKaRshp6eNA8VHg==", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/middleware-user-agent": "3.816.0", "@aws-sdk/types": "3.804.0", "@smithy/node-config-provider": "^4.1.1", "@smithy/types": "^4.2.0", @@ -5245,11 +5247,11 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.812.0.tgz", - "integrity": "sha512-SrEGXP1zs2Cy3jjOwM8eh+UZkr28z7rvjF+cgV4bpOti5F/mzPyVoIxDkG8BQ2sZdAwa9rgEhhOl4CcKjoJoTA==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.817.0.tgz", + "integrity": "sha512-+dzgWGmdmMNDdeSF+VvONN+hwqoGKX5A6Z3+siMO4CIoKWN7u5nDOx/JLjTGdVQji3522pJjJ+o9veQJNWOMRg==", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.812.0", + "@aws-sdk/client-cognito-identity": "3.817.0", "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/types": "^4.2.0", @@ -5427,21 +5429,21 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.812.0.tgz", - "integrity": "sha512-hT7Kr8Ao+NS9b8KCB/U8cmpr0DcWOZNZNRBGAOc4eq65JpsRv177QmSqjh75vhM9BzchH3VymcP4GeMoy4SuvA==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.817.0.tgz", + "integrity": "sha512-i6Q2MyktWHG4YG+EmLlnXTgNVjW9/yeNHSKzF55GTho5fjqfU+t9beJfuMWclanRCifamm3N5e5OCm52rVDdTQ==", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.812.0", - "@aws-sdk/core": "3.812.0", - "@aws-sdk/credential-provider-cognito-identity": "3.812.0", - "@aws-sdk/credential-provider-env": "3.812.0", - "@aws-sdk/credential-provider-http": "3.812.0", - "@aws-sdk/credential-provider-ini": "3.812.0", - "@aws-sdk/credential-provider-node": "3.812.0", - "@aws-sdk/credential-provider-process": "3.812.0", - "@aws-sdk/credential-provider-sso": "3.812.0", - "@aws-sdk/credential-provider-web-identity": "3.812.0", - "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/client-cognito-identity": "3.817.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/credential-provider-cognito-identity": "3.817.0", + "@aws-sdk/credential-provider-env": "3.816.0", + "@aws-sdk/credential-provider-http": "3.816.0", + "@aws-sdk/credential-provider-ini": "3.817.0", + "@aws-sdk/credential-provider-node": "3.817.0", + "@aws-sdk/credential-provider-process": "3.816.0", + "@aws-sdk/credential-provider-sso": "3.817.0", + "@aws-sdk/credential-provider-web-identity": "3.817.0", + "@aws-sdk/nested-clients": "3.817.0", "@aws-sdk/types": "3.804.0", "@smithy/config-resolver": "^4.1.2", "@smithy/core": "^3.3.3", @@ -5501,22 +5503,22 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/client-sso": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.812.0.tgz", - "integrity": "sha512-O//smQRj1+RXELB7xX54s5pZB0V69KHXpUZmz8V+8GAYO1FKTHfbpUgK+zyMNb+lFZxG9B69yl8pWPZ/K8bvxA==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.817.0.tgz", + "integrity": "sha512-fCh5rUHmWmWDvw70NNoWpE5+BRdtNi45kDnIoeoszqVg7UKF79SlG+qYooUT52HKCgDNHqgbWaXxMOSqd2I/OQ==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.812.0", + "@aws-sdk/core": "3.816.0", "@aws-sdk/middleware-host-header": "3.804.0", "@aws-sdk/middleware-logger": "3.804.0", "@aws-sdk/middleware-recursion-detection": "3.804.0", - "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/middleware-user-agent": "3.816.0", "@aws-sdk/region-config-resolver": "3.808.0", "@aws-sdk/types": "3.804.0", "@aws-sdk/util-endpoints": "3.808.0", "@aws-sdk/util-user-agent-browser": "3.804.0", - "@aws-sdk/util-user-agent-node": "3.812.0", + "@aws-sdk/util-user-agent-node": "3.816.0", "@smithy/config-resolver": "^4.1.2", "@smithy/core": "^3.3.3", "@smithy/fetch-http-handler": "^5.0.2", @@ -5561,9 +5563,9 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/core": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.812.0.tgz", - "integrity": "sha512-myWA9oHMBVDObKrxG+puAkIGs8igcWInQ1PWCRTS/zN4BkhUMFjjh/JPV/4Vzvtvj5E36iujq2WtlrDLl1PpOw==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.816.0.tgz", + "integrity": "sha512-Lx50wjtyarzKpMFV6V+gjbSZDgsA/71iyifbClGUSiNPoIQ4OCV0KVOmAAj7mQRVvGJqUMWKVM+WzK79CjbjWA==", "dependencies": { "@aws-sdk/types": "3.804.0", "@smithy/core": "^3.3.3", @@ -5582,11 +5584,11 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.812.0.tgz", - "integrity": "sha512-Ge7IEu06ANurGBZx39q9CNN/ncqb1K8lpKZCY969uNWO0/7YPhnplrRJGMZYIS35nD2mBm3ortEKjY/wMZZd5g==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.816.0.tgz", + "integrity": "sha512-wUJZwRLe+SxPxRV9AENYBLrJZRrNIo+fva7ZzejsC83iz7hdfq6Rv6B/aHEdPwG/nQC4+q7UUvcRPlomyrpsBA==", "dependencies": { - "@aws-sdk/core": "3.812.0", + "@aws-sdk/core": "3.816.0", "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/types": "^4.2.0", @@ -5597,11 +5599,11 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.812.0.tgz", - "integrity": "sha512-Vux2U42vPGXeE407Lp6v3yVA65J7hBO9rB67LXshyGVi7VZLAYWc4mrZxNJNqabEkjcDEmMQQakLPT6zc5SvFw==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.816.0.tgz", + "integrity": "sha512-gcWGzMQ7yRIF+ljTkR8Vzp7727UY6cmeaPrFQrvcFB8PhOqWpf7g0JsgOf5BSaP8CkkSQcTQHc0C5ZYAzUFwPg==", "dependencies": { - "@aws-sdk/core": "3.812.0", + "@aws-sdk/core": "3.816.0", "@aws-sdk/types": "3.804.0", "@smithy/fetch-http-handler": "^5.0.2", "@smithy/node-http-handler": "^4.0.4", @@ -5617,17 +5619,17 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.812.0.tgz", - "integrity": "sha512-oltqGvQ488xtPY5wrNjbD+qQYYkuCjn30IDE1qKMxJ58EM6UVTQl3XV44Xq07xfF5gKwVJQkfIyOkRAguOVybg==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.817.0.tgz", + "integrity": "sha512-kyEwbQyuXE+phWVzloMdkFv6qM6NOon+asMXY5W0fhDKwBz9zQLObDRWBrvQX9lmqq8BbDL1sCfZjOh82Y+RFw==", "dependencies": { - "@aws-sdk/core": "3.812.0", - "@aws-sdk/credential-provider-env": "3.812.0", - "@aws-sdk/credential-provider-http": "3.812.0", - "@aws-sdk/credential-provider-process": "3.812.0", - "@aws-sdk/credential-provider-sso": "3.812.0", - "@aws-sdk/credential-provider-web-identity": "3.812.0", - "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/credential-provider-env": "3.816.0", + "@aws-sdk/credential-provider-http": "3.816.0", + "@aws-sdk/credential-provider-process": "3.816.0", + "@aws-sdk/credential-provider-sso": "3.817.0", + "@aws-sdk/credential-provider-web-identity": "3.817.0", + "@aws-sdk/nested-clients": "3.817.0", "@aws-sdk/types": "3.804.0", "@smithy/credential-provider-imds": "^4.0.4", "@smithy/property-provider": "^4.0.2", @@ -5640,16 +5642,16 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.812.0.tgz", - "integrity": "sha512-SnvSWBP6cr9nqx784eETnL2Zl7ZnMB/oJgFVEG1aejAGbT1H9gTpMwuUsBXk4u/mEYe3f1lh1Wqo+HwDgNkfrg==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.817.0.tgz", + "integrity": "sha512-b5mz7av0Lhavs1Bz3Zb+jrs0Pki93+8XNctnVO0drBW98x1fM4AR38cWvGbM/w9F9Q0/WEH3TinkmrMPrP4T/w==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.812.0", - "@aws-sdk/credential-provider-http": "3.812.0", - "@aws-sdk/credential-provider-ini": "3.812.0", - "@aws-sdk/credential-provider-process": "3.812.0", - "@aws-sdk/credential-provider-sso": "3.812.0", - "@aws-sdk/credential-provider-web-identity": "3.812.0", + "@aws-sdk/credential-provider-env": "3.816.0", + "@aws-sdk/credential-provider-http": "3.816.0", + "@aws-sdk/credential-provider-ini": "3.817.0", + "@aws-sdk/credential-provider-process": "3.816.0", + "@aws-sdk/credential-provider-sso": "3.817.0", + "@aws-sdk/credential-provider-web-identity": "3.817.0", "@aws-sdk/types": "3.804.0", "@smithy/credential-provider-imds": "^4.0.4", "@smithy/property-provider": "^4.0.2", @@ -5662,11 +5664,11 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.812.0.tgz", - "integrity": "sha512-YI8bb153XeEOb59F9KtTZEwDAc14s2YHZz58+OFiJ2udnKsPV87mNiFhJPW6ba9nmOLXVat5XDcwtVT1b664wg==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.816.0.tgz", + "integrity": "sha512-9Tm+AxMoV2Izvl5b9tyMQRbBwaex8JP06HN7ZeCXgC5sAsSN+o8dsThnEhf8jKN+uBpT6CLWKN1TXuUMrAmW1A==", "dependencies": { - "@aws-sdk/core": "3.812.0", + "@aws-sdk/core": "3.816.0", "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", @@ -5678,13 +5680,13 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.812.0.tgz", - "integrity": "sha512-ODsPcNhgiO6GOa82TVNskM97mml9rioe9Cbhemz48lkfDQPv1u06NaCR0o3FsvprX1sEhMvJTR3sE1fyEOzvJQ==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.817.0.tgz", + "integrity": "sha512-gFUAW3VmGvdnueK1bh6TOcRX+j99Xm0men1+gz3cA4RE+rZGNy1Qjj8YHlv0hPwI9OnTPZquvPzA5fkviGREWg==", "dependencies": { - "@aws-sdk/client-sso": "3.812.0", - "@aws-sdk/core": "3.812.0", - "@aws-sdk/token-providers": "3.812.0", + "@aws-sdk/client-sso": "3.817.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/token-providers": "3.817.0", "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", @@ -5696,12 +5698,12 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.812.0.tgz", - "integrity": "sha512-E9Bmiujvm/Hp9DM/Vc1S+D0pQbx8/x4dR/zyAEZU9EoRq0duQOQ1reWYWbebYmL1OklcVpTfKV0a/VCwuAtGSg==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.817.0.tgz", + "integrity": "sha512-A2kgkS9g6NY0OMT2f2EdXHpL17Ym81NhbGnQ8bRXPqESIi7TFypFD2U6osB2VnsFv+MhwM+Ke4PKXSmLun22/A==", "dependencies": { - "@aws-sdk/core": "3.812.0", - "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/nested-clients": "3.817.0", "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/types": "^4.2.0", @@ -5753,11 +5755,11 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.812.0.tgz", - "integrity": "sha512-r+HFwtSvnAs6Fydp4mijylrTX0og9p/xfxOcKsqhMuk3HpZAIcf9sSjRQI6MBusYklg7pnM4sGEnPAZIrdRotA==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.816.0.tgz", + "integrity": "sha512-bHRSlWZ0xDsFR8E2FwDb//0Ff6wMkVx4O+UKsfyNlAbtqCiiHRt5ANNfKPafr95cN2CCxLxiPvFTFVblQM5TsQ==", "dependencies": { - "@aws-sdk/core": "3.812.0", + "@aws-sdk/core": "3.816.0", "@aws-sdk/types": "3.804.0", "@aws-sdk/util-endpoints": "3.808.0", "@smithy/core": "^3.3.3", @@ -5786,11 +5788,12 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/token-providers": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.812.0.tgz", - "integrity": "sha512-dbVBaKxrxE708ub5uH3w+cmKIeRQas+2Xf6rpckhohYY+IiflGOdK6aLrp3T6dOQgr/FJ37iQtcYNonAG+yVBQ==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.817.0.tgz", + "integrity": "sha512-CYN4/UO0VaqyHf46ogZzNrVX7jI3/CfiuktwKlwtpKA6hjf2+ivfgHSKzPpgPBcSEfiibA/26EeLuMnB6cpSrQ==", "dependencies": { - "@aws-sdk/nested-clients": "3.812.0", + "@aws-sdk/core": "3.816.0", + "@aws-sdk/nested-clients": "3.817.0", "@aws-sdk/types": "3.804.0", "@smithy/property-provider": "^4.0.2", "@smithy/shared-ini-file-loader": "^4.0.2", @@ -5839,11 +5842,11 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.812.0.tgz", - "integrity": "sha512-8pt+OkHhS2U0LDwnzwRnFxyKn8sjSe752OIZQCNv263odud8jQu9pYO2pKqb2kRBk9h9szynjZBDLXfnvSQ7Bg==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.816.0.tgz", + "integrity": "sha512-Q6dxmuj4hL7pudhrneWEQ7yVHIQRBFr0wqKLF1opwOi1cIePuoEbPyJ2jkel6PDEv1YMfvsAKaRshp6eNA8VHg==", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/middleware-user-agent": "3.816.0", "@aws-sdk/types": "3.804.0", "@smithy/node-config-provider": "^4.1.1", "@smithy/types": "^4.2.0", @@ -6827,22 +6830,22 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.812.0.tgz", - "integrity": "sha512-FS/fImbEpJU3cXtBGR9fyVd+CP51eNKlvTMi3f4/6lSk3RmHjudNC9yEF/og3jtpT3O+7vsNOUW9mHco5IjdQQ==", + "version": "3.817.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.817.0.tgz", + "integrity": "sha512-vQ2E06A48STJFssueJQgxYD8lh1iGJoLJnHdshRDWOQb8gy1wVQR+a7MkPGhGR6lGoS0SCnF/Qp6CZhnwLsqsQ==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.812.0", + "@aws-sdk/core": "3.816.0", "@aws-sdk/middleware-host-header": "3.804.0", "@aws-sdk/middleware-logger": "3.804.0", "@aws-sdk/middleware-recursion-detection": "3.804.0", - "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/middleware-user-agent": "3.816.0", "@aws-sdk/region-config-resolver": "3.808.0", "@aws-sdk/types": "3.804.0", "@aws-sdk/util-endpoints": "3.808.0", "@aws-sdk/util-user-agent-browser": "3.804.0", - "@aws-sdk/util-user-agent-node": "3.812.0", + "@aws-sdk/util-user-agent-node": "3.816.0", "@smithy/config-resolver": "^4.1.2", "@smithy/core": "^3.3.3", "@smithy/fetch-http-handler": "^5.0.2", @@ -6944,9 +6947,9 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/core": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.812.0.tgz", - "integrity": "sha512-myWA9oHMBVDObKrxG+puAkIGs8igcWInQ1PWCRTS/zN4BkhUMFjjh/JPV/4Vzvtvj5E36iujq2WtlrDLl1PpOw==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.816.0.tgz", + "integrity": "sha512-Lx50wjtyarzKpMFV6V+gjbSZDgsA/71iyifbClGUSiNPoIQ4OCV0KVOmAAj7mQRVvGJqUMWKVM+WzK79CjbjWA==", "dependencies": { "@aws-sdk/types": "3.804.0", "@smithy/core": "^3.3.3", @@ -7006,11 +7009,11 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.812.0.tgz", - "integrity": "sha512-r+HFwtSvnAs6Fydp4mijylrTX0og9p/xfxOcKsqhMuk3HpZAIcf9sSjRQI6MBusYklg7pnM4sGEnPAZIrdRotA==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.816.0.tgz", + "integrity": "sha512-bHRSlWZ0xDsFR8E2FwDb//0Ff6wMkVx4O+UKsfyNlAbtqCiiHRt5ANNfKPafr95cN2CCxLxiPvFTFVblQM5TsQ==", "dependencies": { - "@aws-sdk/core": "3.812.0", + "@aws-sdk/core": "3.816.0", "@aws-sdk/types": "3.804.0", "@aws-sdk/util-endpoints": "3.808.0", "@smithy/core": "^3.3.3", @@ -7076,11 +7079,11 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.812.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.812.0.tgz", - "integrity": "sha512-8pt+OkHhS2U0LDwnzwRnFxyKn8sjSe752OIZQCNv263odud8jQu9pYO2pKqb2kRBk9h9szynjZBDLXfnvSQ7Bg==", + "version": "3.816.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.816.0.tgz", + "integrity": "sha512-Q6dxmuj4hL7pudhrneWEQ7yVHIQRBFr0wqKLF1opwOi1cIePuoEbPyJ2jkel6PDEv1YMfvsAKaRshp6eNA8VHg==", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.812.0", + "@aws-sdk/middleware-user-agent": "3.816.0", "@aws-sdk/types": "3.804.0", "@smithy/node-config-provider": "^4.1.1", "@smithy/types": "^4.2.0", @@ -8992,14 +8995,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "engines": { - "node": ">=14" - } - }, "node_modules/@gar/promisify": { "version": "1.1.3", "dev": true, @@ -10075,9 +10070,9 @@ } }, "node_modules/@mistralai/mistralai": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-1.6.0.tgz", - "integrity": "sha512-PQwGV3+n7FbE7Dp3Vnd8DAa3ffx6WuVV966Gfmf4QvzwcO3Mvxpz0SnJ/PjaZcsCwApBCZpNyQzvarAKEQLKeQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-1.7.0.tgz", + "integrity": "sha512-yM12kf1mGxSBCZWVvSA8gMvLG1lZ+MilvHUJskU4QWVWc+uYOgupZPRgDarPerzEp6/jm9XDR/rCO7U3ElNAOg==", "dependencies": { "zod-to-json-schema": "^3.24.1" }, @@ -11639,16 +11634,16 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@qdrant/js-client-rest": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@qdrant/js-client-rest/-/js-client-rest-1.14.0.tgz", - "integrity": "sha512-2sM2g17FSkN2sNCSeAfqxHRr+SPEVnUQLXBjVv/whm4YQ4JjZ53Jiy1iShk95G+xBf3hKBhJdj8itRnor03IYw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@qdrant/js-client-rest/-/js-client-rest-1.14.1.tgz", + "integrity": "sha512-CkCCTDc4gCXq+hhjB3yDw9Hs/PxCJ0bKqk/LjAAmuL9+nDm/RPue4C/tGOIMlzouTQ2l6J6t+JPeM//j38VFug==", "dependencies": { "@qdrant/openapi-typescript-fetch": "1.2.6", "@sevinf/maybe": "0.5.0", - "undici": "~5.28.5" + "undici": "^6.0.0" }, "engines": { - "node": ">=18.0.0", + "node": ">=18.17.0", "pnpm": ">=8" }, "peerDependencies": { @@ -12565,6 +12560,10 @@ "resolved": "plugins/azurerepos", "link": true }, + "node_modules/@tooljet-marketplace/clickup": { + "resolved": "plugins/clickup", + "link": true + }, "node_modules/@tooljet-marketplace/cohere": { "resolved": "plugins/cohere", "link": true @@ -23425,14 +23424,11 @@ "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==" }, "node_modules/undici": { - "version": "5.28.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.5.tgz", - "integrity": "sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, + "version": "6.21.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz", + "integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==", "engines": { - "node": ">=14.0" + "node": ">=18.17" } }, "node_modules/undici-types": { @@ -23970,9 +23966,9 @@ } }, "node_modules/zod": { - "version": "3.25.13", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.13.tgz", - "integrity": "sha512-Q8mvk2iWi7rTDfpQBsu4ziE7A6AxgzJ5hzRyRYQkoV3A3niYsXVwDaP1Kbz3nWav6S+VZ6k2OznFn8ZyDHvIrg==", + "version": "3.25.30", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.30.tgz", + "integrity": "sha512-VolhdEtu6TJr/fzGuHA/SZ5ixvXqA6ADOG9VRcQ3rdOKmF5hkmcJbyaQjUH5BgmpA9gej++zYRX7zjSmdReIwA==", "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -23987,7 +23983,6 @@ } }, "plugins/anthropic": { - "name": "@tooljet-marketplace/anthropic", "version": "1.0.0", "dependencies": { "@anthropic-ai/sdk": "^0.32.1", @@ -24022,7 +24017,6 @@ } }, "plugins/azurerepos": { - "name": "@tooljet-marketplace/azurerepos", "version": "1.0.0", "dependencies": { "@tooljet-marketplace/common": "^1.0.0", @@ -24033,8 +24027,17 @@ "typescript": "^4.7.4" } }, + "plugins/clickup": { + "version": "1.0.0", + "dependencies": { + "@tooljet-marketplace/common": "^1.0.0" + }, + "devDependencies": { + "@vercel/ncc": "^0.34.0", + "typescript": "^4.7.4" + } + }, "plugins/cohere": { - "name": "@tooljet-marketplace/cohere", "version": "1.0.0", "dependencies": { "@tooljet-marketplace/common": "^1.0.0", @@ -24065,7 +24068,6 @@ } }, "plugins/gemini": { - "name": "@tooljet-marketplace/gemini", "version": "1.0.0", "dependencies": { "@google/generative-ai": "^0.21.0", @@ -24101,7 +24103,6 @@ } }, "plugins/hugging_face": { - "name": "@tooljet-marketplace/huggingface", "version": "1.0.0", "dependencies": { "@tooljet-marketplace/common": "^1.0.0" @@ -24121,7 +24122,6 @@ } }, "plugins/mistral_ai": { - "name": "@tooljet-marketplace/mistral", "version": "1.0.0", "dependencies": { "@mistralai/mistralai": "^1.4.0", @@ -24206,7 +24206,6 @@ } }, "plugins/qdrant": { - "name": "@tooljet-marketplace/qdrant", "version": "1.0.0", "dependencies": { "@qdrant/js-client-rest": "^1.12.0", @@ -24287,7 +24286,6 @@ } }, "plugins/weaviate": { - "name": "@tooljet-marketplace/weaviate", "version": "1.0.0", "dependencies": { "@tooljet-marketplace/common": "^1.0.0", @@ -24299,4 +24297,4 @@ } } } -} +} \ No newline at end of file diff --git a/marketplace/plugins/clickup/.gitignore b/marketplace/plugins/clickup/.gitignore new file mode 100644 index 0000000000..23e6609462 --- /dev/null +++ b/marketplace/plugins/clickup/.gitignore @@ -0,0 +1,5 @@ +node_modules +lib/*.d.* +lib/*.js +lib/*.js.map +dist/* \ No newline at end of file diff --git a/marketplace/plugins/clickup/README.md b/marketplace/plugins/clickup/README.md new file mode 100644 index 0000000000..d6030e2327 --- /dev/null +++ b/marketplace/plugins/clickup/README.md @@ -0,0 +1,4 @@ + +# ClickUp + +Documentation on: https://docs.tooljet.com/docs/data-sources/clickup \ No newline at end of file diff --git a/marketplace/plugins/clickup/__tests__/index.js b/marketplace/plugins/clickup/__tests__/index.js new file mode 100644 index 0000000000..6875592b04 --- /dev/null +++ b/marketplace/plugins/clickup/__tests__/index.js @@ -0,0 +1,7 @@ +'use strict'; + +const clickup = require('../lib'); + +describe('clickup', () => { + it.todo('needs tests'); +}); diff --git a/marketplace/plugins/clickup/lib/icon.svg b/marketplace/plugins/clickup/lib/icon.svg new file mode 100644 index 0000000000..2f983484c1 --- /dev/null +++ b/marketplace/plugins/clickup/lib/icon.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/marketplace/plugins/clickup/lib/index.ts b/marketplace/plugins/clickup/lib/index.ts new file mode 100644 index 0000000000..dc6e051bae --- /dev/null +++ b/marketplace/plugins/clickup/lib/index.ts @@ -0,0 +1,114 @@ +import { QueryError, QueryResult, QueryService, ConnectionTestResult } from '@tooljet-marketplace/common'; +import { SourceOptions } from './types'; +import got, { Headers } from 'got'; + +export default class Clickup implements QueryService { + authHeader(token: string): Headers { + return { Authorization: token }; + } + + async run(sourceOptions: SourceOptions, queryOptions: any, dataSourceId: string): Promise { + const operation = queryOptions.operation; + const apiKey = sourceOptions.apiKey; + const baseUrl = 'https://api.clickup.com/api'; + const path = queryOptions['path']; + + const pathParams = queryOptions['params']['path']; + const queryParams = queryOptions['params']['query']; + const bodyParams = queryOptions['params']['request']; + + // Replace path params in URL + let modifiedPath = path; + for (const param of Object.keys(pathParams)) { + modifiedPath = modifiedPath.replace(`{${param}}`, pathParams[param]); + } + + const url = `${baseUrl}${modifiedPath}`; + + try { + let response; + + if (operation === 'get' || operation === 'delete') { + response = await got(url, { + method: operation, + headers: this.authHeader(apiKey), + searchParams: queryParams, + }); + } else { + // post, put, patch operations + const resolvedBodyParams = this.resolveBodyparams(bodyParams); + response = await got(url, { + method: operation, + headers: this.authHeader(apiKey), + json: resolvedBodyParams, + searchParams: queryParams, + }); + } + + return { + status: 'ok', + data: JSON.parse(response.body), + }; + } catch (err) { + const errorMessage = err.message || 'An unknown error occurred'; + const errorDetails: any = {}; + + if (err.response) { + const { statusCode, body } = err.response; + errorDetails.statusCode = statusCode; + + try { + const parsedBody = JSON.parse(body); + errorDetails.error = parsedBody.err || null; + errorDetails.code = parsedBody.ECODE || null; + } catch (parseError) { + errorDetails.rawBody = body; + } + } + + throw new QueryError('Query could not be completed', errorMessage, errorDetails); + } + } + + async testConnection(sourceOptions: SourceOptions): Promise { + const apiKey = sourceOptions.apiKey; + + try { + const response = await got('https://api.clickup.com/api/v2/user', { + headers: this.authHeader(apiKey), + }); + + const data = JSON.parse(response.body); + + if (data?.user?.id) { + return { + status: 'ok', + }; + } else { + throw new QueryError('User information not found', 'Invalid API key or insufficient permissions', {}); + } + } catch (error) { + throw new QueryError('Connection could not be established', error.response?.body || error.message, {}); + } + } + + private resolveBodyparams(bodyParams: object): object { + if (typeof bodyParams === 'string') { + return bodyParams; + } + + const expectedResult = {}; + + for (const key of Object.keys(bodyParams)) { + if (typeof bodyParams[key] === 'object') { + for (const subKey of Object.keys(bodyParams[key])) { + expectedResult[`${key}[${subKey}]`] = bodyParams[key][subKey]; + } + } else { + expectedResult[key] = bodyParams[key]; + } + } + + return expectedResult; + } +} diff --git a/marketplace/plugins/clickup/lib/manifest.json b/marketplace/plugins/clickup/lib/manifest.json new file mode 100644 index 0000000000..fbfc423224 --- /dev/null +++ b/marketplace/plugins/clickup/lib/manifest.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://raw.githubusercontent.com/ToolJet/ToolJet/develop/plugins/schemas/manifest.schema.json", + "title": "ClickUp datasource", + "description": "Clickup plugin for task, list, and doc management", + "type": "api", + "source": { + "name": "ClickUp", + "kind": "clickup", + "exposedVariables": { + "isLoading": false, + "data": {}, + "rawData": {} + }, + "options": { + "apiKey": { + "type": "string", + "encrypted": true + } + } + }, + "defaults": {}, + "properties": { + "apiKey": { + "label": "API Key", + "key": "apiKey", + "type": "password", + "description": "Enter your Personal API Token", + "helpText": "For generating API Key, visit: ClickUp authentication docs" + } + }, + "required": [ + "apiKey" + ] +} \ No newline at end of file diff --git a/marketplace/plugins/clickup/lib/operations.json b/marketplace/plugins/clickup/lib/operations.json new file mode 100644 index 0000000000..fa2ef8b045 --- /dev/null +++ b/marketplace/plugins/clickup/lib/operations.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://raw.githubusercontent.com/ToolJet/ToolJet/develop/plugins/schemas/operations.schema.json", + "title": "ClickUp datasource", + "description": "A schema defining ClickUp datasource", + "type": "api", + "defaults": {}, + "properties": { + "operation": { + "label": "", + "key": "clickup_operation", + "type": "react-component-api-endpoint", + "description": "Single select dropdown for operation", + "spec_url": "https://developer.clickup.com/openapi/673cf4cfdca96a0019533cad" + } + } +} \ No newline at end of file diff --git a/marketplace/plugins/clickup/lib/types.ts b/marketplace/plugins/clickup/lib/types.ts new file mode 100644 index 0000000000..00e976f831 --- /dev/null +++ b/marketplace/plugins/clickup/lib/types.ts @@ -0,0 +1,3 @@ +export type SourceOptions = { + apiKey: string; +}; diff --git a/marketplace/plugins/clickup/package.json b/marketplace/plugins/clickup/package.json new file mode 100644 index 0000000000..e46d35689d --- /dev/null +++ b/marketplace/plugins/clickup/package.json @@ -0,0 +1,26 @@ +{ + "name": "@tooljet-marketplace/clickup", + "version": "1.0.0", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "directories": { + "lib": "lib", + "test": "__tests__" + }, + "files": [ + "lib" + ], + "scripts": { + "test": "echo \"Error: run tests from root\" && exit 1", + "build": "ncc build lib/index.ts -o dist", + "watch": "ncc build lib/index.ts -o dist --watch" + }, + "homepage": "https://github.com/tooljet/tooljet#readme", + "dependencies": { + "@tooljet-marketplace/common": "^1.0.0" + }, + "devDependencies": { + "typescript": "^4.7.4", + "@vercel/ncc": "^0.34.0" + } +} diff --git a/marketplace/plugins/clickup/tsconfig.json b/marketplace/plugins/clickup/tsconfig.json new file mode 100644 index 0000000000..a18a801b14 --- /dev/null +++ b/marketplace/plugins/clickup/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "lib" + }, + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file diff --git a/plugins/packages/stripe/lib/operations.json b/plugins/packages/stripe/lib/operations.json index 8ec4bed410..4532254d99 100644 --- a/plugins/packages/stripe/lib/operations.json +++ b/plugins/packages/stripe/lib/operations.json @@ -1,16 +1,16 @@ { - "$schema": "https://raw.githubusercontent.com/ToolJet/ToolJet/develop/plugins/schemas/operations.schema.json", - "title": "Stripe datasource", - "description": "A schema defining stripe datasource", - "type": "api", - "defaults": {}, - "properties": { - "operation": { - "label": "", - "key": "stripe_operation", - "type": "react-component-api-endpoint", - "description": "Single select dropdown for operation", - "specUrl": "https://raw.githubusercontent.com/stripe/openapi/master/openapi/spec3.json" - } + "$schema": "https://raw.githubusercontent.com/ToolJet/ToolJet/develop/plugins/schemas/operations.schema.json", + "title": "Stripe datasource", + "description": "A schema defining stripe datasource", + "type": "api", + "defaults": {}, + "properties": { + "operation": { + "label": "", + "key": "stripe_operation", + "type": "react-component-api-endpoint", + "description": "Single select dropdown for operation", + "spec_url": "https://raw.githubusercontent.com/stripe/openapi/master/openapi/spec3.json" } } +} \ No newline at end of file diff --git a/server/src/assets/marketplace/plugins.json b/server/src/assets/marketplace/plugins.json index fe24e4a6a7..b16d3727e9 100644 --- a/server/src/assets/marketplace/plugins.json +++ b/server/src/assets/marketplace/plugins.json @@ -221,5 +221,13 @@ "id": "azurerepos", "author": "Tooljet", "timestamp": "Mon, 23 Dec 2024 11:57:30 GMT" + }, + { + "name": "ClickUp", + "description": "ClickUp plugin for task, list, and doc management", + "version": "1.0.0", + "id": "clickup", + "author": "Tooljet", + "timestamp": "Wed, 16 Apr 2025 15:31:38 GMT" } ] \ No newline at end of file From f6f0b6fa8d8dd44761fe2b5bc7c3447f9ed9d268 Mon Sep 17 00:00:00 2001 From: Parth <108089718+parthy007@users.noreply.github.com> Date: Thu, 29 May 2025 00:06:11 +0530 Subject: [PATCH 12/19] Fix MariaDB saving issue (#12952) --- .../components/DataSourceManager/DataSourceManager.jsx | 2 +- plugins/packages/mariadb/lib/manifest.json | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/src/modules/dataSources/components/DataSourceManager/DataSourceManager.jsx b/frontend/src/modules/dataSources/components/DataSourceManager/DataSourceManager.jsx index bb5c40b5d8..9f601bb412 100644 --- a/frontend/src/modules/dataSources/components/DataSourceManager/DataSourceManager.jsx +++ b/frontend/src/modules/dataSources/components/DataSourceManager/DataSourceManager.jsx @@ -258,7 +258,7 @@ class DataSourceManagerComponent extends React.Component { // to resolve any casing mis-match if (decamelize(key) !== key) { const newKey = decamelize(key); - isEncrypted = dataSourceMeta.options[newKey].encrypted; + isEncrypted = dataSourceMeta.options[newKey]?.encrypted; } return { diff --git a/plugins/packages/mariadb/lib/manifest.json b/plugins/packages/mariadb/lib/manifest.json index db1ff5afea..3d30bbda0a 100644 --- a/plugins/packages/mariadb/lib/manifest.json +++ b/plugins/packages/mariadb/lib/manifest.json @@ -19,7 +19,8 @@ "type": "string" }, "password": { - "type": "string" + "type": "string", + "encrypted": true }, "connectionLimit": { "type": "string" @@ -83,7 +84,8 @@ "label": "Password", "key": "password", "type": "password", - "description": "Enter password" + "description": "Enter password", + "encrypted": true }, "connectionLimit": { "label": "Connection Limit", From 2051ed32792bd1cf59fe861d359cd574c8eeb9b4 Mon Sep 17 00:00:00 2001 From: Parth <108089718+parthy007@users.noreply.github.com> Date: Thu, 29 May 2025 14:23:59 +0530 Subject: [PATCH 13/19] Remove the helper text from clickup manifest.json (#12955) --- marketplace/plugins/clickup/lib/manifest.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/marketplace/plugins/clickup/lib/manifest.json b/marketplace/plugins/clickup/lib/manifest.json index fbfc423224..37eaad21a6 100644 --- a/marketplace/plugins/clickup/lib/manifest.json +++ b/marketplace/plugins/clickup/lib/manifest.json @@ -24,8 +24,7 @@ "label": "API Key", "key": "apiKey", "type": "password", - "description": "Enter your Personal API Token", - "helpText": "For generating API Key, visit: ClickUp authentication docs" + "description": "Enter your Personal API Token" } }, "required": [ From db4cce3b0adea7fc1ac1b64d6d512e1426e36d79 Mon Sep 17 00:00:00 2001 From: Mekhla Asopa <59684099+Mekhla-Asopa@users.noreply.github.com> Date: Thu, 29 May 2025 14:29:05 +0530 Subject: [PATCH 14/19] Update cypress specs with delete datasource (#12954) * update filed validation and delete datasource * fixed pgsql spec --- cypress-tests/cypress/commands/commands.js | 26 +- .../cypress/constants/selectors/common.js | 12 +- .../cypress/constants/selectors/dataSource.js | 35 +++ .../cypress/constants/selectors/postgreSql.js | 2 + .../cypress/constants/texts/airTable.js | 11 +- .../cypress/constants/texts/postgreSql.js | 8 +- .../data-source/airTableHappyPath.cy.js | 95 ++++-- .../data-source/postgresHappyPath.cy.js | 274 +++++++++++++----- .../data-source/restAPIHappyPath.cy.js | 4 + 9 files changed, 355 insertions(+), 112 deletions(-) diff --git a/cypress-tests/cypress/commands/commands.js b/cypress-tests/cypress/commands/commands.js index d242eb1895..3bb63cc926 100644 --- a/cypress-tests/cypress/commands/commands.js +++ b/cypress-tests/cypress/commands/commands.js @@ -226,9 +226,9 @@ Cypress.Commands.add( .invoke("text") .then((text) => { cy.wrap(subject).realType(createBackspaceText(text)), - { - delay: 0, - }; + { + delay: 0, + }; }); } ); @@ -429,7 +429,6 @@ Cypress.Commands.add("visitSlug", ({ actualUrl }) => { }); }); - Cypress.Commands.add("releaseApp", () => { if (Cypress.env("environment") !== "Community") { cy.get(commonEeSelectors.promoteButton).click(); @@ -549,7 +548,7 @@ Cypress.Commands.add("installMarketplacePlugin", (pluginName) => { } }); - function installPlugin (pluginName) { + function installPlugin(pluginName) { cy.get('[data-cy="-list-item"]').eq(1).click(); cy.wait(1000); @@ -605,3 +604,20 @@ Cypress.Commands.add("uninstallMarketplacePlugin", (pluginName) => { }); }); }); + +Cypress.Commands.add( + "verifyRequiredFieldValidation", + (fieldName, expectedColor) => { + cy.get(commonSelectors.textField(fieldName)).should( + "have.css", + "border-color", + expectedColor + ); + cy.get(commonSelectors.labelFieldValidation(fieldName)) + .should("be.visible") + .and("have.text", `${fieldName} is required`); + cy.get(commonSelectors.labelFieldAlert(fieldName)) + .should("be.visible") + .and("have.text", `${fieldName} is required`); + } +); diff --git a/cypress-tests/cypress/constants/selectors/common.js b/cypress-tests/cypress/constants/selectors/common.js index ec104d67bc..7a238f56c7 100644 --- a/cypress-tests/cypress/constants/selectors/common.js +++ b/cypress-tests/cypress/constants/selectors/common.js @@ -1,5 +1,5 @@ export const cyParamName = (paramName = "") => { - return paramName.toLowerCase().replace(/\s+/g, "-"); + return String(paramName).toLowerCase().replace(/\s+/g, "-"); }; export const commonSelectors = { @@ -278,6 +278,16 @@ export const commonSelectors = { defaultModalTitle: '[data-cy="modal-title"]', workspaceConstantsIcon: '[data-cy="icon-workspace-constants"]', confirmationButton: '[data-cy="confirmation-button"]', + + textField: (fieldName) => { + return `[data-cy="${cyParamName(fieldName)}-text-field"]`; + }, + labelFieldValidation: (fieldName) => { + return `[data-cy="${cyParamName(fieldName)}-is-required-validation-label"]`; + }, + labelFieldAlert: (fieldName) => { + return `[data-cy="${cyParamName(fieldName)}-is-required-field-alert-text"]`; + }, }; export const commonWidgetSelector = { diff --git a/cypress-tests/cypress/constants/selectors/dataSource.js b/cypress-tests/cypress/constants/selectors/dataSource.js index bf5fc06dfa..86f5a24c58 100644 --- a/cypress-tests/cypress/constants/selectors/dataSource.js +++ b/cypress-tests/cypress/constants/selectors/dataSource.js @@ -101,6 +101,8 @@ export const dataSourceSelector = { unSavedModalTitle: '[data-cy="unsaved-changes-title"]', eventQuerySelectionField: '[data-cy="query-selection-field"]', connectionAlertText: '[data-cy="connection-alert-text"]', + requiredIndicator: '[data-cy="required-indicator"]', + informationIcon: '[data-cy="information-icon"]', deleteDSButton: (datasourceName) => { return `[data-cy="${cyParamName(datasourceName)}-delete-button"]`; }, @@ -110,4 +112,37 @@ export const dataSourceSelector = { dataSourceNameButton: (dataSourceName) => { return `[data-cy="${cyParamName(dataSourceName)}-button"]`; }, + dropdownLabel: (label) => { + return `[data-cy="${cyParamName(label)}-dropdown-label"]`; + }, + textField: (fieldName) => { + return `[data-cy="${cyParamName(fieldName)}-text-field"]`; + }, + subSection: (header) => { + return `[data-cy="${cyParamName(header)}-section"]`; + }, + toggleInput: (toggleName) => { + return `[data-cy="${cyParamName(toggleName)}-toggle-input"]`; + }, + button: (buttonName) => { + return `[data-cy="button-${cyParamName(buttonName)}"]`; + }, + keyInputField: (header, index) => { + return `[data-cy="${cyParamName(header)}-key-input-field-${cyParamName(index)}"]`; + }, + valueInputField: (header, index) => { + return `[data-cy="${cyParamName(header)}-value-input-field-${cyParamName(index)}"]`; + }, + deleteButton: (header, index) => { + return `[data-cy="${cyParamName(header)}-delete-button-${cyParamName(index)}"]`; + }, + addMoreButton: (header) => { + return `[data-cy="${cyParamName(header)}-add-button"]`; + }, + dropdownField: (fieldName) => { + return `[data-cy="${cyParamName(fieldName)}-select-dropdown"]`; + }, + labelFieldValidation: (fieldName) => { + return `[data-cy="${cyParamName(fieldName)}-is-required-validation-label"]`; + }, }; diff --git a/cypress-tests/cypress/constants/selectors/postgreSql.js b/cypress-tests/cypress/constants/selectors/postgreSql.js index 4f38357961..112da90779 100644 --- a/cypress-tests/cypress/constants/selectors/postgreSql.js +++ b/cypress-tests/cypress/constants/selectors/postgreSql.js @@ -87,6 +87,8 @@ export const postgreSqlSelector = { recordsInputField: '[data-cy="records-input-field"]', eventQuerySelectionField: '[data-cy="query-selection-field"]', + sslToggleInput: '[data-cy="ssl-enabled-toggle-input"]', + labelEncryptedText: '[data-cy="encrypted-text"]', }; export const airTableSelector = { diff --git a/cypress-tests/cypress/constants/texts/airTable.js b/cypress-tests/cypress/constants/texts/airTable.js index 44df3cf9e1..1604fd7590 100644 --- a/cypress-tests/cypress/constants/texts/airTable.js +++ b/cypress-tests/cypress/constants/texts/airTable.js @@ -1,6 +1,7 @@ export const airtableText = { - airtable: "Airtable", - cypressairtable: "cypress-Airtable", - ApiKey: "Personal access token", - apikeyPlaceholder: "**************", - }; \ No newline at end of file + airtable: "Airtable", + cypressairtable: "cypress-Airtable", + ApiKey: "Personal access token", + apikeyPlaceholder: "**************", + invalidAccessToken: "Authentication failed: Invalid personal access token", +}; diff --git a/cypress-tests/cypress/constants/texts/postgreSql.js b/cypress-tests/cypress/constants/texts/postgreSql.js index 9db745b58d..d5c85c197b 100644 --- a/cypress-tests/cypress/constants/texts/postgreSql.js +++ b/cypress-tests/cypress/constants/texts/postgreSql.js @@ -17,13 +17,17 @@ export const postgreSqlText = { allCloudStorage: "Cloud Storages (4)", postgreSQL: "PostgreSQL", + labelConnectionType: "Connection type", + manualConnectionOption: "Manual connection", + connectionStringOption: "Connection string", labelHost: "Host", labelPort: "Port", labelSSL: "SSL", labelDbName: "Database name", labelUserName: "Username", labelPassword: "Password", - label: "Encrypted", + labelEncrypted: "Encrypted", + labelConnectionOptions: "Connection options", sslCertificate: "SSL certificate", whiteListIpText: "Please white-list our IP address if the data source is not publicly accessible", @@ -74,6 +78,8 @@ export const postgreSqlText = { guiOptionBulkUpdate: "Bulk update using primary key", buttonTextTestConnection: "Test connection", + editButtonText: "Edit", + unableAcquireConnectionAlertText: "Unable to acquire a connection", tabAdvanced: "Advanced", labelNoEventhandler: "No event handlers", diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTableHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTableHappyPath.cy.js index 62a6bffcb1..0f3cf9c7a5 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTableHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTableHappyPath.cy.js @@ -3,24 +3,15 @@ import { postgreSqlSelector, airTableSelector } from "Selectors/postgreSql"; import { postgreSqlText } from "Texts/postgreSql"; import { airtableText } from "Texts/airTable"; import { commonSelectors } from "Selectors/common"; -import { commonText } from "Texts/common"; - -import { - fillDataSourceTextField, - selectAndAddDataSource, -} from "Support/utils/postgreSql"; - -import { - deleteDatasource, - closeDSModal, - deleteAppandDatasourceAfterExecution, -} from "Support/utils/dataSource"; - +import { closeDSModal } from "Support/utils/dataSource"; import { dataSourceSelector } from "../../../../../constants/selectors/dataSource"; const data = {}; - data.queryName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); +const airTable_apiKey = Cypress.env("airTable_apikey"); +const airTable_baseId = Cypress.env("airtabelbaseId"); +const airTable_tableName = Cypress.env("airtable_tableName"); +const airTable_recordID = Cypress.env("airtable_recordId"); describe("Data source Airtable", () => { beforeEach(() => { @@ -54,18 +45,71 @@ describe("Data source Airtable", () => { postgreSqlText.allCloudStorage ); - selectAndAddDataSource("databases", airtableText.airtable, data.dsName); - - cy.get(postgreSqlSelector.buttonSave).verifyVisibleElement( + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dsName}-airtable`, + "airtable", + [ + { + key: "personal_access_token", + value: `${Cypress.env("airTable_apikey")}`, + encrypted: true, + }, + ] + ); + cy.reload(); + cy.get( + dataSourceSelector.dataSourceNameButton(`cypress-${data.dsName}-airtable`) + ) + .should("be.visible") + .click(); + cy.get( + dataSourceSelector.labelFieldName(airtableText.ApiKey) + ).verifyVisibleElement("have.text", `${airtableText.ApiKey}*`); + cy.get(postgreSqlSelector.labelEncryptedText).verifyVisibleElement( "have.text", - postgreSqlText.buttonTextSave + postgreSqlText.labelEncrypted + ); + cy.get(dataSourceSelector.button(postgreSqlText.editButtonText)).should( + "be.visible" + ); + cy.get(dataSourceSelector.button(postgreSqlText.editButtonText)).click(); + cy.verifyRequiredFieldValidation(airtableText.ApiKey, "rgb(226, 99, 103)"); + cy.get(dataSourceSelector.textField(airtableText.ApiKey)).should( + "be.visible" + ); + cy.get(postgreSqlSelector.labelIpWhitelist).verifyVisibleElement( + "have.text", + postgreSqlText.whiteListIpText + ); + cy.get(postgreSqlSelector.buttonCopyIp).verifyVisibleElement( + "have.text", + postgreSqlText.textCopy ); - cy.verifyToastMessage( - commonSelectors.toastMessage, - postgreSqlText.toastDSSaved + cy.get(postgreSqlSelector.linkReadDocumentation).verifyVisibleElement( + "have.text", + postgreSqlText.readDocumentation ); - deleteDatasource(`cypress-${data.dsName}-airtable`); + cy.get(postgreSqlSelector.buttonTestConnection) + .verifyVisibleElement( + "have.text", + postgreSqlText.buttonTextTestConnection + ) + .click(); + cy.get(postgreSqlSelector.connectionFailedText).verifyVisibleElement( + "have.text", + postgreSqlText.couldNotConnect + ); + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .and("be.disabled"); + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( + "have.text", + airtableText.invalidAccessToken + ); + + cy.apiDeleteGDS(`cypress-${data.dsName}-airtable`); }); it("Should verify the functionality of AirTable connection form.", () => { @@ -95,7 +139,7 @@ describe("Data source Airtable", () => { cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", - "Authentication failed: Invalid personal access token" + airtableText.invalidAccessToken ); cy.reload(); cy.apiUpdateGDS({ @@ -123,11 +167,6 @@ describe("Data source Airtable", () => { }); it("Should able to run the query with valid conection", () => { - const airTable_apiKey = Cypress.env("airTable_apikey"); - const airTable_baseId = Cypress.env("airtabelbaseId"); - const airTable_tableName = Cypress.env("airtable_tableName"); - const airTable_recordID = Cypress.env("airtable_recordId"); - cy.apiCreateGDS( `${Cypress.env("server_host")}/api/data-sources`, `cypress-${data.dsName}-airtable`, diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/postgresHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/postgresHappyPath.cy.js index 43268fb85d..b86ca7cb17 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/postgresHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/postgresHappyPath.cy.js @@ -27,7 +27,7 @@ describe("Data sources", () => { .replaceAll("[^A-Za-z]", ""); }); - it.skip("Should verify elements on connection form", () => { + it("Should verify elements on connection form with validation", () => { cy.log(process.env.NODE_ENV); cy.log(postgreSqlText.allDatabase()); cy.get(commonSelectors.globalDataSourceIcon).click(); @@ -81,30 +81,147 @@ describe("Data sources", () => { `cypress-${data.dataSourceName}-postgresql` ); - cy.get(postgreSqlSelector.labelHost).verifyVisibleElement( + cy.get( + dataSourceSelector.dropdownLabel(postgreSqlText.labelConnectionType) + ).verifyVisibleElement("have.text", postgreSqlText.labelConnectionType); + cy.get(dataSourceSelector.dropdownField(postgreSqlText.labelConnectionType)) + .should("be.visible") + .click(); + cy.contains( + `[id*="react-select-"]`, + postgreSqlText.connectionStringOption + ).click(); + + cy.get( + dataSourceSelector.dropdownField(postgreSqlText.labelConnectionType) + ).should("be.visible"); + cy.get( + dataSourceSelector.labelFieldName(postgreSqlText.connectionStringOption) + ).verifyVisibleElement( "have.text", - postgreSqlText.labelHost + `${postgreSqlText.connectionStringOption}*` ); - cy.get(postgreSqlSelector.labelPort).verifyVisibleElement( + cy.get(postgreSqlSelector.labelEncryptedText).verifyVisibleElement( "have.text", - postgreSqlText.labelPort + postgreSqlText.labelEncrypted ); + cy.get(dataSourceSelector.button(postgreSqlText.editButtonText)).should( + "be.visible" + ); + cy.get(dataSourceSelector.button(postgreSqlText.editButtonText)).click(); + cy.verifyRequiredFieldValidation( + postgreSqlText.connectionStringOption, + "rgb(226, 99, 103)" + ); + cy.get( + dataSourceSelector.textField(postgreSqlText.connectionStringOption) + ).should("be.visible"); + cy.get(postgreSqlSelector.labelIpWhitelist).verifyVisibleElement( + "have.text", + postgreSqlText.whiteListIpText + ); + cy.get(postgreSqlSelector.buttonCopyIp).verifyVisibleElement( + "have.text", + postgreSqlText.textCopy + ); + + cy.get(postgreSqlSelector.linkReadDocumentation).verifyVisibleElement( + "have.text", + postgreSqlText.readDocumentation + ); + cy.get(postgreSqlSelector.buttonTestConnection) + .verifyVisibleElement( + "have.text", + postgreSqlText.buttonTextTestConnection + ) + .click(); + cy.get(postgreSqlSelector.connectionFailedText).verifyVisibleElement( + "have.text", + postgreSqlText.couldNotConnect + ); + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .and("be.disabled"); + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( + "have.text", + postgreSqlText.unableAcquireConnectionAlertText + ); + + cy.get(dataSourceSelector.dropdownField(postgreSqlText.labelConnectionType)) + .should("be.visible") + .click(); + cy.contains( + `[id*="react-select-"]`, + postgreSqlText.manualConnectionOption + ).click(); + + cy.get( + dataSourceSelector.dropdownField(postgreSqlText.labelConnectionType) + ).should("be.visible"); + + const requiredFields = [ + postgreSqlText.labelHost, + postgreSqlText.labelPort, + postgreSqlText.labelUserName, + postgreSqlText.labelPassword, + ]; + const sections = [ + postgreSqlText.labelHost, + postgreSqlText.labelPort, + postgreSqlText.labelDbName, + postgreSqlText.labelUserName, + postgreSqlText.labelPassword, + postgreSqlText.labelConnectionOptions, + ]; + sections.forEach((section) => { + if (section === postgreSqlText.labelConnectionOptions) { + cy.get(dataSourceSelector.keyInputField(section, 0)).should( + "be.visible" + ); + cy.get(dataSourceSelector.valueInputField(section, 0)).should( + "be.visible" + ); + cy.get(dataSourceSelector.deleteButton(section, 0)).should( + "be.visible" + ); + cy.get(dataSourceSelector.addMoreButton(section)).should("be.visible"); + } else if (requiredFields.includes(section)) { + cy.get(dataSourceSelector.labelFieldName(section)).verifyVisibleElement( + "have.text", + `${section}*` + ); + cy.get(dataSourceSelector.textField(section)).should("be.visible"); + if (section === postgreSqlText.labelPassword) { + cy.get( + dataSourceSelector.button(postgreSqlText.editButtonText) + ).click(); + cy.verifyRequiredFieldValidation(section, "rgb(215, 45, 57)"); + } else { + cy.get(dataSourceSelector.textField(section)).click(); + cy.get(commonSelectors.textField(section)).should( + "have.css", + "border-color", + "rgba(0, 0, 0, 0)" + ); + cy.get(dataSourceSelector.textField(section)) + .type("123") + .clear() + .blur(); + cy.verifyRequiredFieldValidation(section, "rgb(215, 45, 57)"); + } + } else { + cy.get(dataSourceSelector.labelFieldName(section)).verifyVisibleElement( + "have.text", + section + ); + cy.get(dataSourceSelector.textField(section)).should("be.visible"); + } + }); cy.get(postgreSqlSelector.labelSsl).verifyVisibleElement( "have.text", postgreSqlText.labelSSL ); - cy.get(postgreSqlSelector.labelDbName).verifyVisibleElement( - "have.text", - postgreSqlText.labelDbName - ); - cy.get(postgreSqlSelector.labelUserName).verifyVisibleElement( - "have.text", - postgreSqlText.labelUserName - ); - cy.get(postgreSqlSelector.labelPassword).verifyVisibleElement( - "have.text", - postgreSqlText.labelPassword - ); + cy.get(postgreSqlSelector.sslToggleInput).should("be.visible"); cy.get(postgreSqlSelector.labelSSLCertificate).verifyVisibleElement( "have.text", postgreSqlText.sslCertificate @@ -132,72 +249,85 @@ describe("Data sources", () => { "have.text", postgreSqlText.couldNotConnect ); - cy.get(postgreSqlSelector.buttonSave).verifyVisibleElement( + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .and("be.disabled"); + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", - postgreSqlText.buttonTextSave + "connect ECONNREFUSED 127.0.0.1:5432" ); - cy.get(dataSourceSelector.connectionAlertText).should("be.visible"); - deleteDatasource(`cypress-${data.dataSourceName}-postgresql`); + + cy.apiDeleteGDS(`cypress-${data.dataSourceName}-postgresql`); }); - it.skip("Should verify the functionality of PostgreSQL connection form.", () => { - selectAndAddDataSource( - "databases", - postgreSqlText.postgreSQL, - data.dataSourceName + it("Should verify the functionality of PostgreSQL connection form.", () => { + cy.get(commonSelectors.globalDataSourceIcon).click(); + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dataSourceName}-manual-pgsql`, + "postgresql", + [ + { key: "connection_type", value: "manual", encrypted: false }, + { key: "host", value: `${Cypress.env("pg_host")}`, encrypted: false }, + { key: "port", value: 5432, encrypted: false }, + { key: "ssl_enabled", value: false, encrypted: false }, + { key: "database", value: "postgres", encrypted: false }, + { key: "ssl_certificate", value: "none", encrypted: false }, + { + key: "username", + value: `${Cypress.env("pg_user")}`, + encrypted: false, + }, + { + key: "password", + value: `${Cypress.env("pg_password")}`, + encrypted: true, + }, + { key: "ca_cert", value: null, encrypted: true }, + { key: "client_key", value: null, encrypted: true }, + { key: "client_cert", value: null, encrypted: true }, + { key: "root_cert", value: null, encrypted: true }, + { key: "connection_string", value: null, encrypted: true }, + ] ); - - fillDataSourceTextField( - postgreSqlText.labelHost, - postgreSqlText.placeholderEnterHost, - Cypress.env("pg_host") - ); - fillDataSourceTextField( - postgreSqlText.labelPort, - postgreSqlText.placeholderEnterPort, - "5432" - ); - cy.get('[data-cy="-toggle-input"]').then(($el) => { - if ($el.is(":checked")) { - cy.get('[data-cy="-toggle-input"]').uncheck(); - } - }); - fillDataSourceTextField( - postgreSqlText.labelDbName, - postgreSqlText.placeholderNameOfDB, - "postgres" - ); - fillDataSourceTextField( - postgreSqlText.labelUserName, - postgreSqlText.placeholderEnterUserName, - "postgres" - ); - fillDataSourceTextField( - postgreSqlText.labelPassword, - "**************", - Cypress.env("pg_password") - ); - + cy.get( + dataSourceSelector.dataSourceNameButton( + `cypress-${data.dataSourceName}-manual-pgsql` + ) + ) + .should("be.visible") + .click(); cy.get(postgreSqlSelector.buttonTestConnection).click(); cy.get(postgreSqlSelector.textConnectionVerified, { timeout: 10000, }).should("have.text", postgreSqlText.labelConnectionVerified); - cy.get(postgreSqlSelector.buttonSave).click(); - - cy.verifyToastMessage( - commonSelectors.toastMessage, - postgreSqlText.toastDSSaved + cy.apiDeleteGDS(`cypress-${data.dataSourceName}-manual-pgsql`); + cy.reload(); + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dataSourceName}-string-pgsql`, + "postgresql", + [ + { key: "connection_type", value: "string", encrypted: false }, + { + key: "connection_string", + value: `${Cypress.env("pg_string")}`, + encrypted: true, + }, + ] ); - - cy.get(commonSelectors.globalDataSourceIcon).click(); cy.get( - `[data-cy="cypress-${data.dataSourceName}-postgresql-button"]` - ).verifyVisibleElement( - "have.text", - `cypress-${data.dataSourceName}-postgresql` - ); - - deleteDatasource(`cypress-${data.dataSourceName}-postgresql`); + dataSourceSelector.dataSourceNameButton( + `cypress-${data.dataSourceName}-string-pgsql` + ) + ) + .should("be.visible") + .click(); + cy.get(postgreSqlSelector.buttonTestConnection).click(); + cy.get(postgreSqlSelector.textConnectionVerified, { + timeout: 10000, + }).should("have.text", postgreSqlText.labelConnectionVerified); + cy.apiDeleteGDS(`cypress-${data.dataSourceName}-string-pgsql`); }); it.skip("Should verify elements of the Query section.", () => { diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/restAPIHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/restAPIHappyPath.cy.js index 9ec852d6ce..09559e2ba7 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/restAPIHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/restAPIHappyPath.cy.js @@ -426,6 +426,7 @@ describe("Data source Rest API", () => { }); } ); + cy.apiDeleteApp(`${fake.companyName}-restAPI-CURD-App`); cy.apiDeleteGDS(`cypress-${data.dataSourceName}-restapi`); }); it("Should verify response for basic authentication type connection", () => { @@ -488,6 +489,7 @@ describe("Data source Rest API", () => { method: "GET", urlSuffix: "/basic-auth/invaliduser/invalidpass", }); + cy.apiDeleteApp(`${fake.companyName}-restAPI-Basic-App`); cy.apiDeleteGDS(`cypress-${data.dataSourceName}-restapi`); }); it("Should verify response for bearer authentication type connection", () => { @@ -545,6 +547,7 @@ describe("Data source Rest API", () => { urlSuffix: "/bearer", expectedResponseShape: { authenticated: true, token: "my-token-123" }, }); + cy.apiDeleteApp(`${fake.companyName}-restAPI-Bearer-App`); cy.intercept("GET", "api/data_sources?**").as("datasource"); cy.apiCreateGDS( `${Cypress.env("server_host")}/api/data-sources`, @@ -597,6 +600,7 @@ describe("Data source Rest API", () => { method: "GET", urlSuffix: "/bearer", }); + cy.apiDeleteApp(`${fake.companyName}-restAPI-Bearer-invalid`); cy.apiDeleteGDS(`cypress-${data.dataSourceName}-restapi`); }); it.skip("Should verify response for authentication code grant type connection", () => { From 844bc51979598df4c44507f79b0007f15e2b1589 Mon Sep 17 00:00:00 2001 From: Ganesh Kumar Date: Thu, 29 May 2025 18:00:54 +0530 Subject: [PATCH 15/19] version bump --- .version | 2 +- frontend/.version | 2 +- server/.version | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.version b/.version index 4eba2a62eb..f982feb41b 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -3.13.0 +3.14.0 diff --git a/frontend/.version b/frontend/.version index 4eba2a62eb..f982feb41b 100644 --- a/frontend/.version +++ b/frontend/.version @@ -1 +1 @@ -3.13.0 +3.14.0 diff --git a/server/.version b/server/.version index 4eba2a62eb..f982feb41b 100644 --- a/server/.version +++ b/server/.version @@ -1 +1 @@ -3.13.0 +3.14.0 From 4c7ff67a3db8d1ccd284bd14b14c2a7dde846a11 Mon Sep 17 00:00:00 2001 From: Ganesh Kumar Date: Fri, 30 May 2025 12:21:37 +0530 Subject: [PATCH 16/19] submodule reference updated --- server/ee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/ee b/server/ee index 78ccb8918a..1310351fd9 160000 --- a/server/ee +++ b/server/ee @@ -1 +1 @@ -Subproject commit 78ccb8918ac5b0dc3f82988dab3bc29fef48c1d6 +Subproject commit 1310351fd980a55d0914dae8e293778590eec4b2 From ed234aa553b0cdd6a85778bd0098182f435edd93 Mon Sep 17 00:00:00 2001 From: Devanshu Gupta <86366994+devanshu-gupta2002@users.noreply.github.com> Date: Mon, 2 Jun 2025 18:25:47 +0530 Subject: [PATCH 17/19] Feat/audit logs user (#12803) * feat: added default audit logs for logout, archive, unarchive, profile_update * feat: added resource data in audit table * feat: added archive workspace, invite redeem * feat: updated profile update audit * feat: updated user invite audit * feat: completed user actions audit * feat: added default audit logs for logout, archive, unarchive, profile_update * feat: added resource data in audit table * feat: added archive workspace, invite redeem * feat: updated profile update audit * feat: updated user invite audit * feat: completed user actions audit * fix: merge conflict * fix: ee commit * fix: removed logs * feat: added migration for resource_data * fix: updated action names * frontend ee commit * feat: added /user/instance route * fix: user instance update * fix: updated feature name * user ee commit * feat: added instance level archive * fix: user details update instance * feat: added self signup audit * ee audit commit * ee commit * metadata workspace field * fix: instace user unarchive data * fix: review fixes * fix: moved user name logic to service * remove log * ee commit * fix: user update password --- frontend/ee | 2 +- frontend/src/_services/user.service.js | 11 ++ server/ee | 2 +- .../1746520805456-AddResourceDataAudit.ts | 16 +++ server/src/entities/audit_log.entity.ts | 3 + .../modules/audit-logs/interfaces/IService.ts | 2 +- server/src/modules/audit-logs/types/index.ts | 2 + server/src/modules/auth/constants/feature.ts | 4 + server/src/modules/auth/service.ts | 17 +++ .../modules/onboarding/constants/feature.ts | 3 + server/src/modules/onboarding/service.ts | 34 ++++-- .../organization-users/constants/feature.ts | 25 +++- .../modules/organization-users/controller.ts | 4 +- .../organization-users/interfaces/IService.ts | 4 +- .../src/modules/organization-users/service.ts | 113 ++++++++++++++++-- .../organization-users/util.service.ts | 28 ++++- .../src/modules/profile/constants/feature.ts | 15 ++- server/src/modules/profile/service.ts | 71 ++++++++++- server/src/modules/profile/util.service.ts | 3 +- .../src/modules/session/constants/feature.ts | 5 +- server/src/modules/session/service.ts | 13 ++ server/src/modules/session/util.service.ts | 5 +- .../src/modules/users/constants/features.ts | 19 ++- server/src/modules/users/constants/index.ts | 1 + server/src/modules/users/controller.ts | 7 +- server/src/modules/users/dto/index.ts | 19 ++- .../modules/users/interfaces/IController.ts | 7 +- .../src/modules/users/interfaces/IService.ts | 7 +- server/src/modules/users/module.ts | 3 +- server/src/modules/users/service.ts | 7 +- server/src/modules/users/types.ts | 1 + 31 files changed, 384 insertions(+), 69 deletions(-) create mode 100644 server/migrations/1746520805456-AddResourceDataAudit.ts diff --git a/frontend/ee b/frontend/ee index 777446d71e..4ca98b6bb6 160000 --- a/frontend/ee +++ b/frontend/ee @@ -1 +1 @@ -Subproject commit 777446d71e78e5941d34353606a12d982820438f +Subproject commit 4ca98b6bb66d1d9845f8b326100945a969488f94 diff --git a/frontend/src/_services/user.service.js b/frontend/src/_services/user.service.js index 0046ca7c11..a2017ceb22 100644 --- a/frontend/src/_services/user.service.js +++ b/frontend/src/_services/user.service.js @@ -12,6 +12,7 @@ export const userService = { getAvatar, updateAvatar, updateUserType, + updateUserTypeInstance, getUserLimits, changeUserPassword, generateUserPassword, @@ -80,6 +81,16 @@ function updateUserType(userUpdateBody) { return fetch(`${config.apiUrl}/users/user-type`, requestOptions).then(handleResponse); } +function updateUserTypeInstance(userUpdateBody) { + const requestOptions = { + method: 'PATCH', + headers: authHeader(), + body: JSON.stringify(userUpdateBody), + credentials: 'include', + }; + return fetch(`${config.apiUrl}/users/user-type/instance`, requestOptions).then(handleResponse); +} + function changePassword(currentPassword, newPassword) { const body = { currentPassword, newPassword }; const requestOptions = { method: 'PATCH', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; diff --git a/server/ee b/server/ee index 1310351fd9..2f8843cb03 160000 --- a/server/ee +++ b/server/ee @@ -1 +1 @@ -Subproject commit 1310351fd980a55d0914dae8e293778590eec4b2 +Subproject commit 2f8843cb03eef3ea8ef87878a050280b89637345 diff --git a/server/migrations/1746520805456-AddResourceDataAudit.ts b/server/migrations/1746520805456-AddResourceDataAudit.ts new file mode 100644 index 0000000000..1950038c12 --- /dev/null +++ b/server/migrations/1746520805456-AddResourceDataAudit.ts @@ -0,0 +1,16 @@ +import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; + +export class AddResourceDataAudit1746520805456 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.addColumn( + 'audit_logs', + new TableColumn({ + name: 'resource_data', + type: 'json', + isNullable: true, + }) + ); + } + + public async down(queryRunner: QueryRunner): Promise {} +} diff --git a/server/src/entities/audit_log.entity.ts b/server/src/entities/audit_log.entity.ts index 8a2b8a0806..49157d1ceb 100644 --- a/server/src/entities/audit_log.entity.ts +++ b/server/src/entities/audit_log.entity.ts @@ -23,6 +23,9 @@ export class AuditLog extends BaseEntity { @Column({ name: 'resource_type', type: 'enum', enum: MODULES }) resourceType: MODULES; + @Column('simple-json', { name: 'resource_data' }) + resourceData; + @Column({ name: 'action_type' }) actionType: string; diff --git a/server/src/modules/audit-logs/interfaces/IService.ts b/server/src/modules/audit-logs/interfaces/IService.ts index aff26abaed..80702b8fdb 100644 --- a/server/src/modules/audit-logs/interfaces/IService.ts +++ b/server/src/modules/audit-logs/interfaces/IService.ts @@ -7,6 +7,6 @@ export interface IAuditLogService { perform( { userId, organizationId, resourceId, resourceType, actionType, resourceName, metadata }: AuditLogFields, manager?: EntityManager - ): Promise; + ): Promise; findPerPage(user: User, query: AuditLogsQuery): Promise; } diff --git a/server/src/modules/audit-logs/types/index.ts b/server/src/modules/audit-logs/types/index.ts index 1bde3d3ec9..6d234fd18f 100644 --- a/server/src/modules/audit-logs/types/index.ts +++ b/server/src/modules/audit-logs/types/index.ts @@ -18,10 +18,12 @@ export interface AuditLogFields { organizationId: string; resourceId: string; resourceType: MODULES; + resourceData?: object; actionType: string; resourceName?: string; ipAddress?: string; metadata?: object; + organizationIds?: Array; } export interface Features { diff --git a/server/src/modules/auth/constants/feature.ts b/server/src/modules/auth/constants/feature.ts index b0f5bcf7c9..c21c4195ea 100644 --- a/server/src/modules/auth/constants/feature.ts +++ b/server/src/modules/auth/constants/feature.ts @@ -28,12 +28,15 @@ export const FEATURES: FeaturesConfig = { }, [FEATURE_KEY.FORGOT_PASSWORD]: { isPublic: true, + auditLogsKey: 'USER_PASSWORD_FORGOT', }, [FEATURE_KEY.RESET_PASSWORD]: { isPublic: true, + auditLogsKey: 'USER_PASSWORD_RESET', }, [FEATURE_KEY.OAUTH_SIGN_IN]: { isPublic: true, + auditLogsKey: 'USER_LOGIN', }, [FEATURE_KEY.OAUTH_OPENID_CONFIGS]: { isPublic: true, @@ -43,6 +46,7 @@ export const FEATURES: FeaturesConfig = { }, [FEATURE_KEY.OAUTH_COMMON_SIGN_IN]: { isPublic: true, + auditLogsKey: 'USER_LOGIN', }, [FEATURE_KEY.OAUTH_SAML_RESPONSE]: { isPublic: true, diff --git a/server/src/modules/auth/service.ts b/server/src/modules/auth/service.ts index 7c9fb3ad89..cfea254fe0 100644 --- a/server/src/modules/auth/service.ts +++ b/server/src/modules/auth/service.ts @@ -124,6 +124,9 @@ export class AuthService implements IAuthService { organizationId: organization.id, resourceId: user.id, resourceName: user.email, + resourceData: { + auth_method: 'password', + }, }); } @@ -184,6 +187,13 @@ export class AuthService implements IAuthService { forgotPasswordToken: null, passwordRetryCount: 0, }); + const auditLogEntry = { + userId: user.id, + organizationId: user.defaultOrganizationId, + resourceId: user.id, + resourceName: user.email, + }; + RequestContext.setLocals(AUDIT_LOGS_REQUEST_CONTEXT_KEY, auditLogEntry); } } @@ -195,6 +205,13 @@ export class AuthService implements IAuthService { } const forgotPasswordToken = uuid.v4(); await this.userRepository.updateOne(user.id, { forgotPasswordToken }); + const auditLogEntry = { + userId: user.id, + organizationId: user.defaultOrganizationId, + resourceId: user.id, + resourceName: user.email, + }; + RequestContext.setLocals(AUDIT_LOGS_REQUEST_CONTEXT_KEY, auditLogEntry); this.eventEmitter.emit('emailEvent', { type: EMAIL_EVENTS.SEND_PASSWORD_RESET_EMAIL, payload: { diff --git a/server/src/modules/onboarding/constants/feature.ts b/server/src/modules/onboarding/constants/feature.ts index dde67c3912..b43028c4db 100644 --- a/server/src/modules/onboarding/constants/feature.ts +++ b/server/src/modules/onboarding/constants/feature.ts @@ -6,6 +6,7 @@ export const FEATURES: FeaturesConfig = { [MODULES.ONBOARDING]: { [FEATURE_KEY.ACTIVATE_ACCOUNT]: { isPublic: true, + auditLogsKey: 'USER_SIGNUP', }, // Account Activation [FEATURE_KEY.SETUP_SUPER_ADMIN]: { isPublic: true, @@ -15,6 +16,7 @@ export const FEATURES: FeaturesConfig = { }, // Signup [FEATURE_KEY.ACCEPT_INVITE]: { isPublic: true, + auditLogsKey: 'USER_INVITE_REDEEM', }, // Accept Invitation [FEATURE_KEY.RESEND_INVITE]: { isPublic: true, @@ -27,6 +29,7 @@ export const FEATURES: FeaturesConfig = { }, // Verify Organization Token [FEATURE_KEY.SETUP_ACCOUNT_FROM_TOKEN]: { isPublic: true, + auditLogsKey: 'USER_SIGNUP', }, // Setup Account From Token [FEATURE_KEY.CHECK_WORKSPACE_UNIQUENESS]: { isPublic: true, diff --git a/server/src/modules/onboarding/service.ts b/server/src/modules/onboarding/service.ts index c05c9502d2..33d6f9e5a7 100644 --- a/server/src/modules/onboarding/service.ts +++ b/server/src/modules/onboarding/service.ts @@ -120,7 +120,7 @@ export class OnboardingService implements IOnboardingService { const userParams = { email, password, firstName, lastName }; // Find the default workspace - const defaultWorkspace = await this.organizationRepository. getDefaultWorkspaceOfInstance(); + const defaultWorkspace = await this.organizationRepository.getDefaultWorkspaceOfInstance(); if (existingUser) { // Handling instance and workspace level signup for existing user @@ -133,7 +133,7 @@ export class OnboardingService implements IOnboardingService { manager ); } else { - if(defaultWorkspace && !signingUpOrganization) { + if (defaultWorkspace && !signingUpOrganization) { return await this.onboardingUtilService.createUserInDefaultWorkspace( userParams, defaultWorkspace, @@ -263,7 +263,8 @@ export class OnboardingService implements IOnboardingService { throw new BadRequestException('Please enter password'); } - const activateDefaultWorkspace = (defaultWorkspace && defaultWorkspace.id === user.defaultOrganizationId) || allowPersonalWorkspace; + const activateDefaultWorkspace = + (defaultWorkspace && defaultWorkspace.id === user.defaultOrganizationId) || allowPersonalWorkspace; if (activateDefaultWorkspace) { // Getting default workspace const defaultOrganizationUser: OrganizationUser = user.organizationUsers.find( @@ -277,11 +278,11 @@ export class OnboardingService implements IOnboardingService { // Activate default workspace await this.organizationUsersUtilService.activateOrganization(defaultOrganizationUser, manager); - if(defaultWorkspace && defaultWorkspace.id === user.defaultOrganizationId){ + if (defaultWorkspace && defaultWorkspace.id === user.defaultOrganizationId) { const personalWorkspaces = await this.organizationUsersUtilService.personalWorkspaces(user.id); - for(const personalWorkspace of personalWorkspaces){ + for (const personalWorkspace of personalWorkspaces) { // if any personal workspace left. activate those - await this.organizationUsersUtilService.activateOrganization(personalWorkspace, manager); + await this.organizationUsersUtilService.activateOrganization(personalWorkspace, manager); } } @@ -362,6 +363,9 @@ export class OnboardingService implements IOnboardingService { organizationId: organization?.id, resourceId: user.id, resourceName: user.email, + resourceData: { + signup_method: 'self-signup', + }, }); await this.licenseUserService.validateUser(manager); @@ -421,6 +425,13 @@ export class OnboardingService implements IOnboardingService { } const isWorkspaceSignup = organizationUser.source === WORKSPACE_USER_SOURCE.SIGNUP; await this.licenseUserService.validateUser(manager); + const auditLogEntry = { + userId: user.id, + organizationId: organization.id, + resourceId: user.id, + resourceName: user.email, + }; + RequestContext.setLocals(AUDIT_LOGS_REQUEST_CONTEXT_KEY, auditLogEntry); return this.sessionUtilService.generateLoginResultPayload( response, user, @@ -534,6 +545,16 @@ export class OnboardingService implements IOnboardingService { Till now user doesn't have an organization. */ await this.licenseUserService.validateUser(manager); + const auditLogsData = { + userId: signupUser.id, + organizationId: signupUser.organizationUsers[0].organizationId, + resourceId: signupUser.id, + resourceName: signupUser.email, + resourceData: { + signup_method: 'invite-redemption', + }, + }; + RequestContext.setLocals(AUDIT_LOGS_REQUEST_CONTEXT_KEY, auditLogsData); return this.onboardingUtilService.processOrganizationSignup( response, signupUser, @@ -566,7 +587,6 @@ export class OnboardingService implements IOnboardingService { if (user.status !== USER_STATUS.ACTIVE) { throw new BadRequestException(getUserErrorMessages(user.status)); } - RequestContext.setLocals(AUDIT_LOGS_REQUEST_CONTEXT_KEY, { userId: user.id, organizationId: organizationUser.organizationId, diff --git a/server/src/modules/organization-users/constants/feature.ts b/server/src/modules/organization-users/constants/feature.ts index d3ee992027..27b9eb8f7e 100644 --- a/server/src/modules/organization-users/constants/feature.ts +++ b/server/src/modules/organization-users/constants/feature.ts @@ -6,12 +6,27 @@ export const FEATURES: FeaturesConfig = { [MODULES.ORGANIZATION_USER]: { [FEATURE_KEY.SUGGEST_USERS]: {}, [FEATURE_KEY.VIEW_ALL_USERS]: {}, - [FEATURE_KEY.USER_ARCHIVE_ALL]: {}, - [FEATURE_KEY.USER_ARCHIVE]: {}, - [FEATURE_KEY.USER_INVITE]: {}, + [FEATURE_KEY.USER_ARCHIVE_ALL]: { + isPublic: true, + auditLogsKey: 'USER_ARCHIVE', + }, + [FEATURE_KEY.USER_ARCHIVE]: { + isPublic: true, + auditLogsKey: 'USER_ARCHIVE', + }, + [FEATURE_KEY.USER_INVITE]: { + isPublic: true, + auditLogsKey: 'USER_INVITE', + }, [FEATURE_KEY.USER_BULK_UPLOAD]: {}, - [FEATURE_KEY.USER_UNARCHIVE]: {}, - [FEATURE_KEY.USER_UNARCHIVE_ALL]: {}, + [FEATURE_KEY.USER_UNARCHIVE]: { + isPublic: true, + auditLogsKey: 'USER_UNARCHIVE', + }, + [FEATURE_KEY.USER_UNARCHIVE_ALL]: { + isPublic: true, + auditLogsKey: 'USER_UNARCHIVE', + }, [FEATURE_KEY.USER_UPDATE]: {}, }, }; diff --git a/server/src/modules/organization-users/controller.ts b/server/src/modules/organization-users/controller.ts index 27d1d20b84..43d6c78af9 100644 --- a/server/src/modules/organization-users/controller.ts +++ b/server/src/modules/organization-users/controller.ts @@ -90,14 +90,14 @@ export class OrganizationUsersController implements IOrganizationUsersController if (user.id === userId) { throw new NotAcceptableException('Self archive not allowed'); } - await this.organizationUsersService.archiveFromAll(userId); + await this.organizationUsersService.archiveFromAll(userId, user); return; } @InitFeature(FEATURE_KEY.USER_UNARCHIVE_ALL) @Post(':userId/unarchive-all') async unarchiveAll(@User() user: UserEntity, @Param('userId') userId: string) { - await this.organizationUsersService.unarchiveUser(userId); + await this.organizationUsersService.unarchiveUser(userId, user); return; } diff --git a/server/src/modules/organization-users/interfaces/IService.ts b/server/src/modules/organization-users/interfaces/IService.ts index 57adc96882..bbed4de3c2 100644 --- a/server/src/modules/organization-users/interfaces/IService.ts +++ b/server/src/modules/organization-users/interfaces/IService.ts @@ -6,8 +6,8 @@ import { UpdateOrgUserDto } from '../dto'; export interface IOrganizationUsersService { updateOrgUser(organizationUserId: string, user: User, updateOrgUserDto: UpdateOrgUserDto): Promise; archive(id: string, organizationId: string, user?: User): Promise; - archiveFromAll(userId: string): Promise; - unarchiveUser(userId: string): Promise; + archiveFromAll(userId: string, user: User): Promise; + unarchiveUser(userId: string, user: User): Promise; unarchive(user: User, id: string, organizationId: string): Promise; inviteNewUser(currentUser: User, inviteNewUserDto: InviteNewUserDto): Promise; bulkUploadUsers(currentUser: User, fileStream: any, res: Response): Promise; diff --git a/server/src/modules/organization-users/service.ts b/server/src/modules/organization-users/service.ts index c4ed443dfa..467b5e9539 100644 --- a/server/src/modules/organization-users/service.ts +++ b/server/src/modules/organization-users/service.ts @@ -24,6 +24,9 @@ import { Response } from 'express'; import { UserCsvRow } from './interfaces'; import { IOrganizationUsersService } from './interfaces/IService'; import { UpdateOrgUserDto } from './dto'; +import { RequestContext } from '@modules/request-context/service'; +import { AUDIT_LOGS_REQUEST_CONTEXT_KEY } from '@modules/app/constants'; +import { Organization } from '@entities/organization.entity'; @Injectable() export class OrganizationUsersService implements IOrganizationUsersService { constructor( @@ -38,7 +41,6 @@ export class OrganizationUsersService implements IOrganizationUsersService { async updateOrgUser(organizationUserId: string, user: User, updateOrgUserDto: UpdateOrgUserDto) { const { firstName, lastName, addGroups, role, userMetadata } = updateOrgUserDto; - const organizationUser = await this.organizationUsersRepository.findOne({ where: { id: organizationUserId, organizationId: user.organizationId }, }); @@ -81,35 +83,84 @@ export class OrganizationUsersService implements IOrganizationUsersService { } async archive(id: string, organizationId: string, user?: User): Promise { - const organizationUser = await this.organizationUsersRepository.findOneOrFail({ - where: { id, organizationId }, - relations: ['user'], - }); + await dbTransactionWrap(async (manager: EntityManager) => { + const organizationUser = await manager.findOneOrFail(OrganizationUser, { + where: { id, organizationId }, + relations: ['user'], + }); - await this.organizationUsersUtilService.throwErrorIfUserIsLastActiveAdmin(organizationUser?.user, organizationId); - await this.organizationUsersRepository.update(id, { - status: WORKSPACE_USER_STATUS.ARCHIVED, - invitationToken: null, + await this.organizationUsersUtilService.throwErrorIfUserIsLastActiveAdmin(organizationUser?.user, organizationId); + await manager.update(OrganizationUser, id, { + status: WORKSPACE_USER_STATUS.ARCHIVED, + invitationToken: null, + }); + const organization = await manager.findOne(Organization, { + where: { id: organizationUser.organizationId }, + }); + const auditLogEntry = { + userId: user.id, + organizationId: user.defaultOrganizationId, + resourceId: user.id, + resourceName: organizationUser.user.email, + resourceData: { + archived_user: { + id: organizationUser.userId, + email: organizationUser.user.email, + first_name: organizationUser.user.firstName, + last_name: organizationUser.user.lastName, + }, + archived_user_workspace: { + workspace_name: organization.name, + workspace_id: organization.id, + }, + }, + }; + + RequestContext.setLocals(AUDIT_LOGS_REQUEST_CONTEXT_KEY, auditLogEntry); }); } - async archiveFromAll(userId: string): Promise { + async archiveFromAll(userId: string, user: User): Promise { await dbTransactionWrap(async (manager: EntityManager) => { + const archivedUserWorkspaces = await manager.find(OrganizationUser, { + where: { userId }, + relations: ['user'], + }); await manager.update( OrganizationUser, { userId }, { status: WORKSPACE_USER_STATUS.ARCHIVED, invitationToken: null } ); await this.organizationUsersUtilService.updateUserStatus(userId, USER_STATUS.ARCHIVED, manager); + const organizationIds = archivedUserWorkspaces.map((user) => user.organizationId); + const auditLogEntry = { + userId: user.id, + organizationIds: organizationIds, + resourceId: user.id, + resourceName: archivedUserWorkspaces[0].user.email, + resourceData: { + archived_user: { + id: archivedUserWorkspaces[0].userId, + email: archivedUserWorkspaces[0].user.email, + first_name: archivedUserWorkspaces[0].user.firstName, + last_name: archivedUserWorkspaces[0].user.lastName, + }, + }, + }; + RequestContext.setLocals(AUDIT_LOGS_REQUEST_CONTEXT_KEY, auditLogEntry); }); } - async unarchiveUser(userId: string): Promise { + async unarchiveUser(userId: string, user: User): Promise { await dbTransactionWrap(async (manager: EntityManager) => { const targetUser = await manager.findOneOrFail(User, { where: { id: userId }, select: ['id', 'status', 'invitationToken', 'source'], }); + const unarchivedUserWorkspaces = await manager.find(OrganizationUser, { + where: { userId }, + relations: ['user'], + }); const { status, invitationToken } = targetUser; /* Special case. what if the user is archived when the status is invited. we were changing status to active before */ const updatedStatus = @@ -117,6 +168,22 @@ export class OrganizationUsersService implements IOrganizationUsersService { await this.organizationUsersUtilService.updateUserStatus(userId, updatedStatus, manager); await this.licenseUserService.validateUser(manager); await this.licenseOrganizationService.validateOrganization(manager); + const organizationIds = unarchivedUserWorkspaces.map((user) => user.organizationId); + const auditLogEntry = { + userId: user.id, + organizationIds: organizationIds, + resourceId: user.id, + resourceName: unarchivedUserWorkspaces[0].user.email, + resourceData: { + unarchived_user: { + id: unarchivedUserWorkspaces[0].userId, + email: unarchivedUserWorkspaces[0].user.email, + first_name: unarchivedUserWorkspaces[0].user.firstName, + last_name: unarchivedUserWorkspaces[0].user.lastName, + }, + }, + }; + RequestContext.setLocals(AUDIT_LOGS_REQUEST_CONTEXT_KEY, auditLogEntry); }); } @@ -144,6 +211,29 @@ export class OrganizationUsersService implements IOrganizationUsersService { await this.licenseUserService.validateUser(manager); await this.licenseOrganizationService.validateOrganization(manager); + const organization = await manager.findOne(Organization, { + where: { id: organizationUser.organizationId }, + }); + const auditLogEntry = { + userId: user.id, + organizationId: user.defaultOrganizationId, + resourceId: user.id, + resourceName: organizationUser.user.email, + resourceData: { + unarchived_user: { + id: organizationUser.userId, + email: organizationUser.user.email, + first_name: organizationUser.user.firstName, + last_name: organizationUser.user.lastName, + }, + unarchived_user_workspace: { + workspace_name: organization.name, + workspace_id: organization.id, + }, + }, + }; + + RequestContext.setLocals(AUDIT_LOGS_REQUEST_CONTEXT_KEY, auditLogEntry); }); if (organizationUser.user.invitationToken) { @@ -160,6 +250,7 @@ export class OrganizationUsersService implements IOrganizationUsersService { sender: user.firstName, }, }); + return; } diff --git a/server/src/modules/organization-users/util.service.ts b/server/src/modules/organization-users/util.service.ts index c040e2cff7..ba6deb3d65 100644 --- a/server/src/modules/organization-users/util.service.ts +++ b/server/src/modules/organization-users/util.service.ts @@ -1,7 +1,7 @@ import { User } from '@entities/user.entity'; import { dbTransactionWrap } from '@helpers/database.helper'; import { fullName, generateNextNameAndSlug } from '@helpers/utils.helper'; -import { EntityManager } from 'typeorm'; +import { EntityManager, In } from 'typeorm'; import { getUserStatusAndSource, lifecycleEvents, @@ -31,8 +31,6 @@ import { UserDetailsService } from './services/user-details.service'; import { FetchUserResponse, InvitedUserType, RoleUpdate, UserFilterOptions } from './types'; import { GroupPermissionsRepository } from '@modules/group-permissions/repository'; import { ERROR_HANDLER, ERROR_HANDLER_TITLE } from '@modules/organizations/constants'; -import { MODULE_INFO } from '@modules/app/constants/module-info'; -import { MODULES } from '@modules/app/constants/modules'; import { INSTANCE_USER_SETTINGS } from '@modules/instance-settings/constants'; import { OrganizationRepository } from '@modules/organizations/repository'; import * as uuid from 'uuid'; @@ -512,11 +510,33 @@ export class OrganizationUsersUtilService implements IOrganizationUsersUtilServi !user || !!user.invitationToken ); + const groupsArray = []; + if (inviteNewUserDto.groups && inviteNewUserDto.groups.length > 0) { + const groupQuery = { + organizationId: currentOrganization.id, + id: In(inviteNewUserDto.groups), + }; + const orgGroupPermissions = await this.groupPermissionsRepository.find({ + where: groupQuery, + select: ['id', 'name'], + }); + groupsArray.push(...orgGroupPermissions.map((group) => group.name)); + } RequestContext.setLocals(AUDIT_LOGS_REQUEST_CONTEXT_KEY, { userId: currentUser.id, organizationId: currentOrganization.id, - resourceId: currentOrganization.id, + resourceId: updatedUser.id, resourceName: updatedUser.email, + resourceData: { + invited_user: { + id: updatedUser.id, + email: updatedUser.email, + first_name: updatedUser.firstName, + last_name: updatedUser.lastName, + role: inviteNewUserDto.role, + group: groupsArray, + }, + }, }); return organizationUser; diff --git a/server/src/modules/profile/constants/feature.ts b/server/src/modules/profile/constants/feature.ts index 0ef0b4f1c9..9b5ba2b08d 100644 --- a/server/src/modules/profile/constants/feature.ts +++ b/server/src/modules/profile/constants/feature.ts @@ -4,9 +4,18 @@ import { FeaturesConfig } from '../types'; export const FEATURES: FeaturesConfig = { [MODULES.PROFILE]: { - [FEATURE_KEY.UPDATE_AVATAR]: {}, + [FEATURE_KEY.UPDATE_AVATAR]: { + isPublic: true, + auditLogsKey: 'USER_PROFILE_UPDATE', + }, [FEATURE_KEY.GET]: {}, - [FEATURE_KEY.UPDATE]: {}, - [FEATURE_KEY.UPDATE_PASSWORD]: {}, + [FEATURE_KEY.UPDATE]: { + isPublic: true, + auditLogsKey: 'USER_PROFILE_UPDATE', + }, + [FEATURE_KEY.UPDATE_PASSWORD]: { + isPublic: true, + auditLogsKey: 'USER_PASSWORD_UPDATE', + }, }, }; diff --git a/server/src/modules/profile/service.ts b/server/src/modules/profile/service.ts index 9ac2979568..17ab95d476 100644 --- a/server/src/modules/profile/service.ts +++ b/server/src/modules/profile/service.ts @@ -7,6 +7,8 @@ import { ProfileUtilService } from '@modules/profile/util.service'; import { User } from '@entities/user.entity'; import { IProfileService } from '@modules/profile/interfaces/IService'; import { File } from '@entities/file.entity'; +import { RequestContext } from '@modules/request-context/service'; +import { AUDIT_LOGS_REQUEST_CONTEXT_KEY } from '@modules/app/constants'; @Injectable() export class ProfileService implements IProfileService { @@ -25,19 +27,76 @@ export class ProfileService implements IProfileService { async addAvatar(userId: string, imageBuffer: Buffer, filename: string): Promise { return dbTransactionWrap(async (manager: EntityManager) => { - return this.serviceUtils.addAvatar(userId, imageBuffer, filename, manager); + const user = await this.userRepository.getUser({ + id: userId, + }); + const avatar = await this.serviceUtils.addAvatar(userId, imageBuffer, filename, manager); + const auditLogData = { + userId: user.id, + organizationId: user.defaultOrganizationId, + resourceId: user.id, + resourceName: user.email, + resourceData: { + previous_user_details: { + avatar_id: user.avatarId, + }, + updated_user_details: { + avatar_id: avatar.id, + }, + }, + }; + RequestContext.setLocals(AUDIT_LOGS_REQUEST_CONTEXT_KEY, auditLogData); + return avatar; }); } async updateUserPassword(userId: string, password: string): Promise { - await this.userRepository.updateOne(userId, { - password, - passwordRetryCount: 0, + return dbTransactionWrap(async (manager: EntityManager) => { + const user = await manager.findOneOrFail(User, { + where: { id: userId }, + }); + await this.userRepository.updateOne( + userId, + { + password, + passwordRetryCount: 0, + }, + manager + ); + const auditLogEntry = { + userId: user.id, + organizationId: user.defaultOrganizationId, + resourceId: user.id, + resourceName: user.email, + }; + RequestContext.setLocals(AUDIT_LOGS_REQUEST_CONTEXT_KEY, auditLogEntry); }); } async updateUserName(userId: string, updateUserDto: ProfileUpdateDto): Promise { - const { first_name: firstName, last_name: lastName } = updateUserDto; - await this.userRepository.updateOne(userId, { firstName, lastName }); + return dbTransactionWrap(async (manager: EntityManager) => { + const user = await manager.findOneOrFail(User, { + where: { id: userId }, + }); + const { first_name: firstName, last_name: lastName } = updateUserDto; + await this.userRepository.updateOne(userId, { firstName, lastName }, manager); + const auditLogData = { + userId: user.id, + organizationId: user.defaultOrganizationId, + resourceId: user.id, + resourceName: user.email, + resourceData: { + previous_user_details: { + first_name: user.firstName, + last_name: user.lastName, + }, + updated_user_details: { + first_name: firstName, + last_name: lastName, + }, + }, + }; + RequestContext.setLocals(AUDIT_LOGS_REQUEST_CONTEXT_KEY, auditLogData); + }); } } diff --git a/server/src/modules/profile/util.service.ts b/server/src/modules/profile/util.service.ts index 671ef60a85..2631627e2b 100644 --- a/server/src/modules/profile/util.service.ts +++ b/server/src/modules/profile/util.service.ts @@ -8,7 +8,7 @@ import { CreateFileDto } from '@modules/files/dto/index'; @Injectable() export class ProfileUtilService implements IProfileUtilService { - constructor(protected readonly filesRepository: FilesRepository, protected userRepository: UserRepository) {} + constructor(protected readonly filesRepository: FilesRepository, protected readonly userRepository: UserRepository) {} async addAvatar(userId: string, imageBuffer: Buffer, filename: string, manager?: EntityManager): Promise { const user = await this.userRepository.getUser({ @@ -31,6 +31,7 @@ export class ProfileUtilService implements IProfileUtilService { if (currentAvatarId) { await this.filesRepository.removeOne(currentAvatarId, manager); } + return avatar; } } diff --git a/server/src/modules/session/constants/feature.ts b/server/src/modules/session/constants/feature.ts index fd482bcfd6..9c887c9355 100644 --- a/server/src/modules/session/constants/feature.ts +++ b/server/src/modules/session/constants/feature.ts @@ -4,7 +4,10 @@ import { FeaturesConfig } from '../types'; export const FEATURES: FeaturesConfig = { [MODULES.SESSION]: { - [FEATURE_KEY.LOG_OUT]: {}, + [FEATURE_KEY.LOG_OUT]: { + isPublic: true, + auditLogsKey: 'USER_LOGOUT', + }, [FEATURE_KEY.GET_INVITED_USER_SESSION]: { isPublic: true, }, diff --git a/server/src/modules/session/service.ts b/server/src/modules/session/service.ts index ba0b089aa9..3aa0aedaf4 100644 --- a/server/src/modules/session/service.ts +++ b/server/src/modules/session/service.ts @@ -19,6 +19,8 @@ import { OrganizationRepository } from '@modules/organizations/repository'; import { OrganizationUsersRepository } from '@modules/organization-users/repository'; import { fullName, generateOrgInviteURL, isSuperAdmin } from '@helpers/utils.helper'; import { decamelizeKeys } from 'humps'; +import { RequestContext } from '@modules/request-context/service'; +import { AUDIT_LOGS_REQUEST_CONTEXT_KEY } from '@modules/app/constants'; @Injectable() export class SessionService { @@ -34,6 +36,17 @@ export class SessionService { response.clearCookie('tj_auth_token'); await dbTransactionWrap(async (manager: EntityManager) => { await manager.delete(UserSessions, { id: sessionId, userId }); + const user = await manager.findOneOrFail(User, { + where: { id: userId }, + }); + + const auditLogData = { + userId: user.id, + organizationId: user.defaultOrganizationId, + resourceId: user.id, + resourceName: user.email, + }; + RequestContext.setLocals(AUDIT_LOGS_REQUEST_CONTEXT_KEY, auditLogData); }); } diff --git a/server/src/modules/session/util.service.ts b/server/src/modules/session/util.service.ts index 282a6179e5..fcfb61d9f0 100644 --- a/server/src/modules/session/util.service.ts +++ b/server/src/modules/session/util.service.ts @@ -44,6 +44,7 @@ export class SessionUtilService { protected readonly encryptionService: EncryptionService, protected readonly jwtService: JwtService ) {} + async terminateAllSessions(userId: string): Promise { await dbTransactionWrap(async (manager: EntityManager) => { await manager.delete(UserSessions, { userId }); @@ -333,7 +334,7 @@ export class SessionUtilService { }) : null; - const noWorkspaceAttachedInTheSession = await this.checkUserWorkspaceStatus(user.id) && !isSuperAdmin(user); + const noWorkspaceAttachedInTheSession = (await this.checkUserWorkspaceStatus(user.id)) && !isSuperAdmin(user); const isAllWorkspacesArchived = await this.#isAllWorkspacesArchivedBySuperAdmin(user.id); const onboardingFlags = await this.#onboardingFlags(user); const metadata = await this.metadataUtilService.fetchMetadata(); @@ -367,7 +368,7 @@ export class SessionUtilService { async #onboardingFlags(user: User) { let isFirstUserOnboardingCompleted = true; - let isOnboardingCompleted = true; + const isOnboardingCompleted = true; // const isOnboardingQuestionsEnabled = // this.configService.get('ENABLE_ONBOARDING_QUESTIONS_FOR_ALL_SIGN_UPS') === 'true'; diff --git a/server/src/modules/users/constants/features.ts b/server/src/modules/users/constants/features.ts index cc68400c25..1524e517a1 100644 --- a/server/src/modules/users/constants/features.ts +++ b/server/src/modules/users/constants/features.ts @@ -5,8 +5,21 @@ import { FeaturesConfig } from '../types'; export const FEATURES: FeaturesConfig = { [MODULES.USER]: { [FEATURE_KEY.GET_ALL_USERS]: {}, - [FEATURE_KEY.UPDATE_USER_TYPE]: {}, - [FEATURE_KEY.AUTO_UPDATE_USER_PASSWORD]: {}, - [FEATURE_KEY.CHANGE_USER_PASSWORD]: {}, + [FEATURE_KEY.UPDATE_USER_TYPE]: { + isPublic: true, + auditLogsKey: 'USER_DETAILS_UPDATE', + }, + [FEATURE_KEY.UPDATE_USER_TYPE_INSTANCE]: { + isPublic: true, + auditLogsKey: 'SET_AS_SUPERADMIN', + }, + [FEATURE_KEY.AUTO_UPDATE_USER_PASSWORD]: { + isPublic: true, + auditLogsKey: 'USER_PASSWORD_RESET', + }, + [FEATURE_KEY.CHANGE_USER_PASSWORD]: { + isPublic: true, + auditLogsKey: 'USER_PASSWORD_RESET', + }, }, }; diff --git a/server/src/modules/users/constants/index.ts b/server/src/modules/users/constants/index.ts index 0808b21fc1..9e14e275cf 100644 --- a/server/src/modules/users/constants/index.ts +++ b/server/src/modules/users/constants/index.ts @@ -3,4 +3,5 @@ export enum FEATURE_KEY { UPDATE_USER_TYPE = 'UPDATE_USER_TYPE', AUTO_UPDATE_USER_PASSWORD = 'AUTO_UPDATE_USER_PASSWORD', CHANGE_USER_PASSWORD = 'CHANGE_USER_PASSWORD', + UPDATE_USER_TYPE_INSTANCE = 'UPDATE_USER_TYPE_INSTANCE', } diff --git a/server/src/modules/users/controller.ts b/server/src/modules/users/controller.ts index 145320a22e..31d62ac5de 100644 --- a/server/src/modules/users/controller.ts +++ b/server/src/modules/users/controller.ts @@ -2,19 +2,20 @@ import { Controller, NotFoundException } from '@nestjs/common'; import { UpdateUserTypeDto } from '@modules/onboarding/dto/user.dto'; import { IUserController } from './interfaces/IController'; import { ChangePasswordDto } from './dto'; +import { User } from '@entities/user.entity'; @Controller('users') export class UsersController implements IUserController { getAllUsers(query: { page?: number; searchText?: string; status?: string }): Promise { throw new NotFoundException(); } - updateUserType(updateUserTypeDto: UpdateUserTypeDto): Promise { + updateUserType(updateUserTypeDto: UpdateUserTypeDto, user: User): Promise { throw new NotFoundException(); } - autoUpdateUserPassword(userId: string): Promise<{ newPassword: string }> { + autoUpdateUserPassword(userId: string, user: User): Promise<{ newPassword: string }> { throw new NotFoundException(); } - changeUserPassword(userId: string, changePasswordDto: ChangePasswordDto): Promise { + changeUserPassword(userId: string, changePasswordDto: ChangePasswordDto, user: User): Promise { throw new NotFoundException(); } } diff --git a/server/src/modules/users/dto/index.ts b/server/src/modules/users/dto/index.ts index d7b5b1a450..ea2a8f58f0 100644 --- a/server/src/modules/users/dto/index.ts +++ b/server/src/modules/users/dto/index.ts @@ -11,12 +11,6 @@ export class UpdateUserTypeDto { @MaxLength(100) userId: string; - @IsNotEmpty() - @IsString() - @Transform(({ value }) => sanitizeInput(value)) - @MaxLength(100) - userType: USER_TYPE; - @IsOptional() @IsString() @Transform(({ value }) => sanitizeInput(value)) @@ -27,6 +21,19 @@ export class UpdateUserTypeDto { @Transform(({ value }) => sanitizeInput(value)) lastName: string; } +export class UpdateUserTypeInstanceDto { + @IsNotEmpty() + @IsString() + @Transform(({ value }) => sanitizeInput(value)) + @MaxLength(100) + userId: string; + + @IsNotEmpty() + @IsString() + @Transform(({ value }) => sanitizeInput(value)) + @MaxLength(100) + userType: USER_TYPE; +} @Exclude() export class AllUserResponse { diff --git a/server/src/modules/users/interfaces/IController.ts b/server/src/modules/users/interfaces/IController.ts index 793b7d2738..80b9ce9119 100644 --- a/server/src/modules/users/interfaces/IController.ts +++ b/server/src/modules/users/interfaces/IController.ts @@ -1,11 +1,12 @@ +import { User } from '@entities/user.entity'; import { UpdateUserTypeDto, ChangePasswordDto } from '../dto'; export interface IUserController { getAllUsers(query: { page?: number; searchText?: string; status?: string }): Promise; - updateUserType(updateUserTypeDto: UpdateUserTypeDto): Promise; + updateUserType(updateUserTypeDto: UpdateUserTypeDto, user: User): Promise; - autoUpdateUserPassword(userId: string): Promise<{ newPassword: string }>; + autoUpdateUserPassword(userId: string, user: User): Promise<{ newPassword: string }>; - changeUserPassword(userId: string, changePasswordDto: ChangePasswordDto): Promise; + changeUserPassword(userId: string, changePasswordDto: ChangePasswordDto, user: User): Promise; } diff --git a/server/src/modules/users/interfaces/IService.ts b/server/src/modules/users/interfaces/IService.ts index fe3cd48469..9676fd049e 100644 --- a/server/src/modules/users/interfaces/IService.ts +++ b/server/src/modules/users/interfaces/IService.ts @@ -1,3 +1,4 @@ +import { User } from '@entities/user.entity'; import { AllUserResponse, UpdateUserTypeDto } from '@modules/onboarding/dto/user.dto'; export interface IUsersService { @@ -6,9 +7,9 @@ export interface IUsersService { users: AllUserResponse[]; }>; - updateUserType(updateUserTypeDto: UpdateUserTypeDto): Promise; + updateUserType(updateUserTypeDto: UpdateUserTypeDto, user: User): Promise; - updatePassword(userId: string, password: string): Promise; + updatePassword(userId: string, user: User, password: string): Promise; - autoUpdateUserPassword(userId: string): Promise; + autoUpdateUserPassword(userId: string, user: User): Promise; } diff --git a/server/src/modules/users/module.ts b/server/src/modules/users/module.ts index 963eb08fca..9ba2992f32 100644 --- a/server/src/modules/users/module.ts +++ b/server/src/modules/users/module.ts @@ -3,6 +3,7 @@ import { DynamicModule } from '@nestjs/common'; import { UserRepository } from './repository'; import { SessionModule } from '@modules/session/module'; import { FeatureAbilityFactory } from './ability'; +import { OrganizationUsersRepository } from '@modules/organization-users/repository'; export class UsersModule { static async register(configs?: { IS_GET_CONTEXT: boolean }): Promise { @@ -15,7 +16,7 @@ export class UsersModule { module: UsersModule, imports: [await SessionModule.register(configs)], controllers: [UsersController], - providers: [UsersService, UserRepository, UsersUtilService, FeatureAbilityFactory], + providers: [UsersService, UserRepository, UsersUtilService, FeatureAbilityFactory, OrganizationUsersRepository], exports: [UsersUtilService], }; } diff --git a/server/src/modules/users/service.ts b/server/src/modules/users/service.ts index c1870f1f4d..a422f99a68 100644 --- a/server/src/modules/users/service.ts +++ b/server/src/modules/users/service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; import { AllUserResponse, UpdateUserTypeDto } from '@modules/onboarding/dto/user.dto'; import { IUsersService } from '@modules/users/interfaces/IService'; +import { User } from '@entities/user.entity'; @Injectable() export class UsersService implements IUsersService { @@ -9,13 +10,13 @@ export class UsersService implements IUsersService { ): Promise<{ meta: { total_pages: number; total_count: number; current_page: number }; users: AllUserResponse[] }> { throw new Error('Method not implemented.'); } - updateUserType(updateUserTypeDto: UpdateUserTypeDto): Promise { + updateUserType(updateUserTypeDto: UpdateUserTypeDto, user: User): Promise { throw new Error('Method not implemented.'); } - updatePassword(userId: string, password: string): Promise { + updatePassword(userId: string, user: User, password: string): Promise { throw new Error('Method not implemented.'); } - autoUpdateUserPassword(userId: string): Promise { + autoUpdateUserPassword(userId: string, user: User): Promise { throw new Error('Method not implemented.'); } } diff --git a/server/src/modules/users/types.ts b/server/src/modules/users/types.ts index c05429936a..37319f7b43 100644 --- a/server/src/modules/users/types.ts +++ b/server/src/modules/users/types.ts @@ -7,6 +7,7 @@ interface Features { [FEATURE_KEY.UPDATE_USER_TYPE]: FeatureConfig; [FEATURE_KEY.AUTO_UPDATE_USER_PASSWORD]: FeatureConfig; [FEATURE_KEY.CHANGE_USER_PASSWORD]: FeatureConfig; + [FEATURE_KEY.UPDATE_USER_TYPE_INSTANCE]: FeatureConfig; } export interface FeaturesConfig { From efed245f08de31f5336cf361d3708196f940c679 Mon Sep 17 00:00:00 2001 From: johnsoncherian Date: Wed, 4 Jun 2025 12:20:11 +0530 Subject: [PATCH 18/19] Merge branch 'main' into appbuilder/sprint-13 --- frontend/ee | 2 +- server/ee | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/ee b/frontend/ee index 4ca98b6bb6..aa3c4f603f 160000 --- a/frontend/ee +++ b/frontend/ee @@ -1 +1 @@ -Subproject commit 4ca98b6bb66d1d9845f8b326100945a969488f94 +Subproject commit aa3c4f603f549337fc88a772a6a31e18eaf38701 diff --git a/server/ee b/server/ee index 2f8843cb03..f70ac83c38 160000 --- a/server/ee +++ b/server/ee @@ -1 +1 @@ -Subproject commit 2f8843cb03eef3ea8ef87878a050280b89637345 +Subproject commit f70ac83c38e0a8b44aeb2a0fb2059690eb5e2f46 From ea5e6beb7e5c061da66d82e006294cd1b5b15cd1 Mon Sep 17 00:00:00 2001 From: Ajith KV Date: Wed, 4 Jun 2025 12:30:00 +0530 Subject: [PATCH 19/19] Update platform cypress workflow for enterprise edition (#12875) * Update platform cypress workflow * fix syntax * fix syntax * update the workflow * update workflow * update the port * correction in the .env variables * correction in the matrix check * correction in the matrix check * correction in the matrix check * fix for platform ee cypress workflow * Update the workflow for environment specific cypress env * Update ee config * update the file name * update the file name * update typo * update dockerfile * update the port * adding logs to check the migration * added redis to the dockerfile * added redis to the dockerfile * fix redis issue * corrections ce and ee steps * clean up * adding latest submodules * removing submodules * removing submodules --------- Co-authored-by: Adish M --- .github/workflows/cypress-platform.yml | 197 +++++++++++++------- cypress-tests/cypress-ee-platform.config.js | 114 +++++++++++ cypress-tests/cypress-platform.config.js | 2 +- cypress-tests/cypress.Dockerfile | 189 +++++++++++++++++++ cypress-tests/cypress/support/utils/apps.js | 2 +- server/scripts/preview.sh | 2 + 6 files changed, 432 insertions(+), 74 deletions(-) create mode 100644 cypress-tests/cypress-ee-platform.config.js create mode 100644 cypress-tests/cypress.Dockerfile diff --git a/.github/workflows/cypress-platform.yml b/.github/workflows/cypress-platform.yml index c6a0db4be6..a29c46d495 100644 --- a/.github/workflows/cypress-platform.yml +++ b/.github/workflows/cypress-platform.yml @@ -12,91 +12,106 @@ env: jobs: Cypress-Platform: runs-on: ubuntu-22.04 - if: contains(github.event.pull_request.labels.*.name, 'run-cypress') || - contains(github.event.pull_request.labels.*.name, 'run-cypress-platform-ce') || - contains(github.event.pull_request.labels.*.name, 'run-cypress-platform-ee') || - contains(github.event.pull_request.labels.*.name, 'run-cypress-ce') + if: contains(github.event.pull_request.labels.*.name, 'run-cypress') || + contains(github.event.pull_request.labels.*.name, 'run-cypress-platform-ce') || + contains(github.event.pull_request.labels.*.name, 'run-cypress-platform-ee') || + contains(github.event.pull_request.labels.*.name, 'run-cypress-ce') strategy: + fail-fast: false matrix: - edition: >- - ${{ - contains(github.event.pull_request.labels.*.name, 'run-cypress') && fromJson('["ce", "ee"]') || - contains(github.event.pull_request.labels.*.name, 'run-cypress-ce') && fromJson('["ce"]') || - contains(github.event.pull_request.labels.*.name, 'run-cypress-platform-ce') && fromJson('["ce"]') || - contains(github.event.pull_request.labels.*.name, 'run-cypress-platform-ee') && fromJson('["ee"]') || - fromJson('[]') - }} + edition: + - ${{ contains(github.event.pull_request.labels.*.name, 'run-cypress') && 'ce' || contains(github.event.pull_request.labels.*.name, 'run-cypress-platform-ce') && 'ce' || contains(github.event.pull_request.labels.*.name, 'run-cypress-ce') && 'ce' || '' }} + - ${{ contains(github.event.pull_request.labels.*.name, 'run-cypress') && 'ee' || contains(github.event.pull_request.labels.*.name, 'run-cypress-platform-ee') && 'ee' || '' }} + exclude: + - edition: "" steps: - - name: Setup Node.js - uses: actions/setup-node@v2 - with: - node-version: 18.18.2 - - - name: Set up Git authentication for private submodules + - name: Debug labels and matrix edition run: | - git config --global url."https://x-access-token:${{ secrets.CUSTOM_GITHUB_TOKEN }}@github.com/".insteadOf "https://github.com/" + echo "Labels: ${{ toJSON(github.event.pull_request.labels.*.name) }}" + echo "Matrix edition: ${{ matrix.edition }}" - - name: Checkout with Submodules + - name: Checkout uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.ref }} - - name: Checking out the correct branch for submodules EE + # Create Docker Buildx builder with platform configuration + - name: Set up Docker Buildx + run: | + mkdir -p ~/.docker/cli-plugins + curl -SL https://github.com/docker/buildx/releases/download/v0.11.0/buildx-v0.11.0.linux-amd64 -o ~/.docker/cli-plugins/docker-buildx + chmod a+x ~/.docker/cli-plugins/docker-buildx + docker buildx create --name mybuilder --platform linux/arm64,linux/amd64 + docker buildx use mybuilder + + - name: Set DOCKER_CLI_EXPERIMENTAL + run: echo "DOCKER_CLI_EXPERIMENTAL=enabled" >> $GITHUB_ENV + + - name: use mybuilder buildx + run: docker buildx use mybuilder + + - name: Docker Login + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Set SAFE_BRANCH_NAME + run: echo "SAFE_BRANCH_NAME=$(echo ${{ env.BRANCH_NAME }} | tr '/' '-')" >> $GITHUB_ENV + + - name: Build CE Docker image + if: matrix.edition == 'ce' + uses: docker/build-push-action@v4 + with: + context: . + file: docker/ce-production.Dockerfile + push: true + tags: tooljet/tj-osv:${{ env.SAFE_BRANCH_NAME }}-ce + platforms: linux/amd64 + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build EE Docker image if: matrix.edition == 'ee' - run: | - git submodule update --init --recursive - git submodule foreach --recursive ' - git checkout ${{ env.BRANCH_NAME }} 2>/dev/null || git checkout main' - - - name: Set up Docker - uses: docker-practice/actions-setup-docker@master - - - name: Install and build dependencies - run: | - npm cache clean --force - npm install - npm install --prefix server - npm install --prefix frontend - npm run build:plugins - - - name: Local development setup - run: | - sudo docker network create tooljet - sudo docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=postgres -e POSTGRES_USER=postgres -e POSTGRES_PORT=5432 -d postgres:13 - - - name: Run PostgREST Docker Container - run: | - sudo docker run -d --name postgrest --network tooljet -p 3001:3000 \ - -e PGRST_DB_URI="postgres://postgres:postgres@localhost:5432/tooljet" \ - -e PGRST_DB_ANON_ROLE="postgres" \ - -e PGRST_JWT_SECRET="r9iMKoe5CRMgvJBBtp4HrqN7QiPpUToj" \ - -e PGRST_DB_PRE_CONFIG=postgrest.pre_config \ - postgrest/postgrest:v12.2.0 + uses: docker/build-push-action@v4 + with: + context: . + build-args: | + CUSTOM_GITHUB_TOKEN=${{ secrets.CUSTOM_GITHUB_TOKEN }} + BRANCH_NAME=${{ github.event.pull_request.head.ref }} + file: cypress-tests/cypress.Dockerfile + push: true + tags: tooljet/tj-osv:${{ env.SAFE_BRANCH_NAME }}-ee + platforms: linux/amd64 + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - name: Set up environment variables run: | - echo "TOOLJET_EDITION=${{ matrix.edition == 'ee' && 'ee' || 'ce' }}" >> .env - echo "TOOLJET_HOST=http://localhost:8082" >> .env + echo "TOOLJET_EDITION=${{ matrix.edition }}" >> .env + echo "TOOLJET_HOST=http://localhost:3000" >> .env echo "LOCKBOX_MASTER_KEY=cd97331a419c09387bef49787f7da8d2a81d30733f0de6bed23ad8356d2068b2" >> .env echo "SECRET_KEY_BASE=7073b9a35a15dd20914ae17e36a693093f25b74b96517a5fec461fc901c51e011cd142c731bee48c5081ec8bac321c1f259ef097ef2a16f25df17a3798c03426" >> .env echo "PG_DB=tooljet_development" >> .env echo "PG_USER=postgres" >> .env - echo "PG_HOST=localhost" >> .env + echo "PG_HOST=postgres" >> .env echo "PG_PASS=postgres" >> .env echo "PG_PORT=5432" >> .env echo "ENABLE_TOOLJET_DB=true" >> .env echo "TOOLJET_DB=tooljet_db" >> .env echo "TOOLJET_DB_USER=postgres" >> .env - echo "TOOLJET_DB_HOST=localhost" >> .env + echo "TOOLJET_DB_HOST=postgres" >> .env echo "TOOLJET_DB_PASS=postgres" >> .env echo "TOOLJET_DB_STATEMENT_TIMEOUT=60000" >> .env echo "TOOLJET_DB_RECONFIG=true" >> .env echo "PGRST_JWT_SECRET=r9iMKoe5CRMgvJBBtp4HrqN7QiPpUToj" >> .env echo "PGRST_HOST=localhost:3001" >> .env echo "PGRST_DB_PRE_CONFIG=postgrest.pre_config" >> .env - echo "PGRST_DB_URI=postgres://postgres:postgres@localhost:5432/tooljet" >> .env + echo "PGRST_DB_URI=postgres://postgres:postgres@postgres/tooljet_db" >> .env echo "ENABLE_MARKETPLACE_FEATURE=true" >> .env echo "ENABLE_MARKETPLACE_DEV_MODE=true" >> .env echo "ENABLE_PRIVATE_APP_EMBED=true" >> .env @@ -105,29 +120,50 @@ jobs: echo "SSO_GIT_OAUTH2_CLIENT_ID=1234567890" >> .env echo "SSO_GIT_OAUTH2_CLIENT_SECRET=3346shfvkdjjsfkvxce32854e026a4531ed" >> .env - - name: Set up database - run: | - npm run --prefix server db:create - npm run --prefix server db:reset - sleep 5 + # Only add EE-specific env vars if edition is ee + if [ "${{ matrix.edition }}" = "ee" ]; then + echo "SSO_OPENID_NAME=tj-oidc-simulator" >> .env + echo "SSO_OPENID_CLIENT_ID=${{ secrets.SSO_OPENID_CLIENT_ID }}" >> .env + echo "SSO_OPENID_CLIENT_SECRET=${{ secrets.SSO_OPENID_CLIENT_SECRET }}" >> .env + echo "SSO_OPENID_WELL_KNOWN_URL=http://34.66.166.236:8080/.well-known/openid-configuration" >> .env + echo "LICENSE_KEY=${{ secrets.RENDER_LICENSE_KEY }}" >> .env + fi - - name: Start services + - name: Pulling the docker-compose file + run: curl -LO https://tooljet-test.s3.us-west-1.amazonaws.com/docker-compose.yaml && mkdir postgres_data + + - name: Update docker-compose file run: | - cd plugins && npm start & - cd server && npm run start:dev & - cd frontend && npm start & + # Update docker-compose.yaml with the appropriate image based on edition + if [ "${{ matrix.edition }}" = "ce" ]; then + sed -i '/^[[:space:]]*tooljet:/,/^$/ s|^\([[:space:]]*image:[[:space:]]*\).*|\1tooljet/tj-osv:${{ env.SAFE_BRANCH_NAME }}-ce|' docker-compose.yaml + elif [ "${{ matrix.edition }}" = "ee" ]; then + sed -i '/^[[:space:]]*tooljet:/,/^$/ s|^\([[:space:]]*image:[[:space:]]*\).*|\1tooljet/tj-osv:${{ env.SAFE_BRANCH_NAME }}-ee|' docker-compose.yaml + fi + + - name: Install Docker Compose + run: | + curl -L "https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + chmod +x /usr/local/bin/docker-compose + + - name: Run docker-compose file + run: docker-compose up -d + + - name: Checking containers + run: docker ps -a + + - name: docker logs + run: sudo docker logs Tooljet-app - name: Wait for the server to be ready run: | - timeout 300 bash -c ' - until curl --silent --fail http://localhost:8082; do + timeout 500 bash -c ' + until curl --silent --fail http://localhost:3000; do sleep 5 done' - - name: Postgres logs - run: docker logs postgrest - - - name: Create Cypress environment file + - name: Create Cypress environment file for CE + if: matrix.edition == 'ce' id: create-json uses: jsdaniell/create-json@1.1.2 with: @@ -135,13 +171,30 @@ jobs: json: ${{ secrets.CYPRESS_SECRETS }} dir: "./cypress-tests" - - name: Run Cypress tests + - name: Run Cypress tests for CE + if: matrix.edition == 'ce' uses: cypress-io/github-action@v6 with: working-directory: ./cypress-tests - config: "baseUrl=http://localhost:8082" + config: "baseUrl=http://localhost:3000" config-file: cypress-platform.config.js + - name: Create Cypress environment file for EE + if: matrix.edition == 'ee' + uses: jsdaniell/create-json@1.1.2 + with: + name: "cypress.env.json" + json: ${{ secrets.CYPRESS_EE_SECRETS }} + dir: "./cypress-tests" + + - name: Run Cypress tests for EE + if: matrix.edition == 'ee' + uses: cypress-io/github-action@v6 + with: + working-directory: ./cypress-tests + config: "baseUrl=http://localhost:3000" + config-file: cypress-ee-platform.config.js + - name: Capture Screenshots uses: actions/upload-artifact@v4 if: always() diff --git a/cypress-tests/cypress-ee-platform.config.js b/cypress-tests/cypress-ee-platform.config.js new file mode 100644 index 0000000000..02b8c1d952 --- /dev/null +++ b/cypress-tests/cypress-ee-platform.config.js @@ -0,0 +1,114 @@ +const { defineConfig } = require("cypress"); +const { rmdir } = require("fs"); +const fs = require("fs"); +const XLSX = require("node-xlsx"); +const pg = require("pg"); +const path = require("path"); +const pdf = require("pdf-parse"); + +const environments = { + 'run-cypress-platform': { + baseUrl: "http://localhost:3000", + configFile: "cypress-platform.config.js" + }, + 'run-cypress-platform-subpath': { + baseUrl: "http://localhost:3000/apps", + configFile: "cypress-platform.config.js" + }, + 'run-cypress-platform-proxy': { + baseUrl: "http://localhost:4001", + configFile: "cypress-platform.config.js" + }, + 'run-cypress-platform-proxy-subpath': { + baseUrl: "http://localhost:4001/apps", + configFile: "cypress-platform.config.js" + } +}; + +const githubLabel = process.env.GITHUB_LABEL || 'run-cypress-platform'; +const environment = environments[githubLabel]; + +module.exports = defineConfig({ + execTimeout: 1800000, + defaultCommandTimeout: 30000, + requestTimeout: 30000, + pageLoadTimeout: 30000, + responseTimeout: 30000, + viewportWidth: 1440, + viewportHeight: 960, + chromeWebSecurity: false, + trashAssetsBeforeRuns: true, + e2e: { + setupNodeEvents (on, config) { + config.baseUrl = environment.baseUrl; + + on("task", { + readPdf (pathToPdf) { + return new Promise((resolve) => { + const pdfPath = path.resolve(pathToPdf); + let dataBuffer = fs.readFileSync(pdfPath); + pdf(dataBuffer).then(function ({ text }) { + resolve(text); + }); + }); + }, + }); + + on("task", { + readXlsx (filePath) { + return new Promise((resolve, reject) => { + try { + let dataBuffer = fs.readFileSync(filePath); + const jsonData = XLSX.parse(dataBuffer); + resolve(jsonData[0]["data"].toString()); + } catch (e) { + reject(e); + } + }); + }, + }); + + on("task", { + deleteFolder (folderName) { + return new Promise((resolve, reject) => { + rmdir(folderName, { maxRetries: 10, recursive: true }, (err) => { + if (err) { + console.error(err); + return reject(err); + } + resolve(null); + }); + }); + }, + }); + + on("task", { + dbConnection ({ dbconfig, sql }) { + const client = new pg.Pool(dbconfig); + return client.query(sql); + }, + }); + + return require("./cypress/plugins/index.js")(on, config); + }, + downloadsFolder: "cypress/downloads", + experimentalRunAllSpecs: true, + experimentalModfyObstructiveThirdPartyCode: true, + baseUrl: environment.baseUrl, + configFile: environment.configFile, + specPattern: [ + "cypress/e2e/happyPath/platform/firstUser/firstUserOnboarding.cy.js", + "cypress/e2e/happyPath/platform/commonTestcases/**/*.cy.js", + "cypress/e2e/happyPath/platform/eeTestcases/**/*.cy.js", + ], + numTestsKeptInMemory: 1, + redirectionLimit: 15, + experimentalMemoryManagement: true, + video: false, + videoUploadOnPasses: false, + retries: { + runMode: 2, + openMode: 0, + }, + }, +}); \ No newline at end of file diff --git a/cypress-tests/cypress-platform.config.js b/cypress-tests/cypress-platform.config.js index b565a0c1d1..6b1954140a 100644 --- a/cypress-tests/cypress-platform.config.js +++ b/cypress-tests/cypress-platform.config.js @@ -8,7 +8,7 @@ const pdf = require("pdf-parse"); const environments = { 'run-cypress-platform': { - baseUrl: "http://localhost:8082", + baseUrl: "http://localhost:3000", configFile: "cypress-platform.config.js" }, 'run-cypress-platform-subpath': { diff --git a/cypress-tests/cypress.Dockerfile b/cypress-tests/cypress.Dockerfile new file mode 100644 index 0000000000..373b3bafd3 --- /dev/null +++ b/cypress-tests/cypress.Dockerfile @@ -0,0 +1,189 @@ +FROM node:18.18.2-buster AS builder +# Fix for JS heap limit allocation issue +ENV NODE_OPTIONS="--max-old-space-size=4096" + +RUN mkdir -p /app + +WORKDIR /app + +ARG CUSTOM_GITHUB_TOKEN +ARG BRANCH_NAME + +# Clone and checkout the frontend repositorys +RUN git config --global url."https://x-access-token:${CUSTOM_GITHUB_TOKEN}@github.com/".insteadOf "https://github.com/" + +RUN git config --global http.version HTTP/1.1 +RUN git config --global http.postBuffer 524288000 +RUN git clone https://github.com/ToolJet/ToolJet.git . + +# The branch name needs to be changed the branch with modularisation in CE repo +RUN git checkout ${BRANCH_NAME} + +RUN git submodule update --init --recursive + +# Checkout the same branch in submodules if it exists, otherwise stay on default branch +RUN git submodule foreach 'git checkout ${BRANCH_NAME} || true' + +# Scripts for building +COPY ./package.json ./package.json + +# Build plugins +COPY ./plugins/package.json ./plugins/package-lock.json ./plugins/ +RUN npm --prefix plugins install +COPY ./plugins/ ./plugins/ +RUN NODE_ENV=production npm --prefix plugins run build +RUN npm --prefix plugins prune --production + +ENV TOOLJET_EDITION=ee + +# Build frontend +COPY ./frontend/package.json ./frontend/package-lock.json ./frontend/ +RUN npm --prefix frontend install +COPY ./frontend/ ./frontend/ +RUN npm --prefix frontend run build --production +RUN npm --prefix frontend prune --production + +ENV NODE_ENV=production +ENV TOOLJET_EDITION=ee + +# Build server +COPY ./server/package.json ./server/package-lock.json ./server/ +RUN npm --prefix server install +COPY ./server/ ./server/ +RUN npm install -g @nestjs/cli +RUN npm --prefix server run build + +FROM node:18.18.2-bullseye + +RUN apt-get update -yq \ + && apt-get install curl wget gnupg zip -yq \ + && apt-get install -yq build-essential \ + && apt -y install redis \ + && apt-get clean -y + +# copy postgrest executable +COPY --from=postgrest/postgrest:v12.2.0 /bin/postgrest /bin + +ENV NODE_ENV=production +ENV TOOLJET_EDITION=ee +ENV NODE_OPTIONS="--max-old-space-size=4096" +RUN apt-get update && apt-get install -y freetds-dev libaio1 wget supervisor + +# Install Instantclient Basic Light Oracle and Dependencies +WORKDIR /opt/oracle +RUN wget https://tooljet-plugins-production.s3.us-east-2.amazonaws.com/marketplace-assets/oracledb/instantclients/instantclient-basiclite-linuxx64.zip && \ + wget https://tooljet-plugins-production.s3.us-east-2.amazonaws.com/marketplace-assets/oracledb/instantclients/instantclient-basiclite-linux.x64-11.2.0.4.0.zip && \ + unzip instantclient-basiclite-linuxx64.zip && rm -f instantclient-basiclite-linuxx64.zip && \ + unzip instantclient-basiclite-linux.x64-11.2.0.4.0.zip && rm -f instantclient-basiclite-linux.x64-11.2.0.4.0.zip && \ + cd /opt/oracle/instantclient_21_10 && rm -f *jdbc* *occi* *mysql* *mql1* *ipc1* *jar uidrvci genezi adrci && \ + cd /opt/oracle/instantclient_11_2 && rm -f *jdbc* *occi* *mysql* *mql1* *ipc1* *jar uidrvci genezi adrci && \ + echo /opt/oracle/instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf && ldconfig +# Set the Instant Client library paths +ENV LD_LIBRARY_PATH="/opt/oracle/instantclient_11_2:/opt/oracle/instantclient_21_10:${LD_LIBRARY_PATH}" + +WORKDIR / + +# copy npm scripts +COPY --from=builder /app/package.json ./app/package.json +# copy plugins dependencies +COPY --from=builder /app/plugins/dist ./app/plugins/dist +COPY --from=builder /app/plugins/client.js ./app/plugins/client.js +COPY --from=builder /app/plugins/node_modules ./app/plugins/node_modules +COPY --from=builder /app/plugins/packages/common ./app/plugins/packages/common +COPY --from=builder /app/plugins/package.json ./app/plugins/package.json +# copy frontend build +COPY --from=builder /app/frontend/build ./app/frontend/build +# copy server build +COPY --from=builder /app/server/package.json ./app/server/package.json +COPY --from=builder /app/server/.version ./app/server/.version +COPY --from=builder /app/server/ee/keys ./app/server/ee/keys +COPY --from=builder /app/server/node_modules ./app/server/node_modules +COPY --from=builder /app/server/templates ./app/server/templates +COPY --from=builder /app/server/scripts ./app/server/scripts +COPY --from=builder /app/server/dist ./app/server/dist + +WORKDIR /app + +# Install PostgreSQL +USER root +RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - +RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ bullseye-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list +RUN apt update && apt -y install postgresql-13 postgresql-client-13 supervisor --fix-missing + + +# Explicitly create PG main directory with correct ownership +RUN mkdir -p /var/lib/postgresql/13/main && \ + chown -R postgres:postgres /var/lib/postgresql + +RUN mkdir -p /var/log/supervisor /var/run/postgresql && \ + chown -R postgres:postgres /var/run/postgresql /var/log/supervisor + +# Remove existing data and create directory with proper ownership +RUN rm -rf /var/lib/postgresql/13/main && \ + mkdir -p /var/lib/postgresql/13/main && \ + chown -R postgres:postgres /var/lib/postgresql + +# Initialize PostgreSQL +RUN su - postgres -c "/usr/lib/postgresql/13/bin/initdb -D /var/lib/postgresql/13/main" + +# Configure Supervisor to manage PostgREST, ToolJet, and Redis +RUN echo "[supervisord] \n" \ + "nodaemon=true \n" \ + "user=root \n" \ + "\n" \ + "[program:redis] \n" \ + "command=redis-server /etc/redis/redis.conf \n" \ + "user=redis \n" \ + "autostart=true \n" \ + "autorestart=true \n" \ + "stderr_logfile=/var/log/redis/redis-server.log \n" \ + "stdout_logfile=/var/log/redis/redis-server.log \n" \ + "\n" \ + "[program:postgrest] \n" \ + "command=/bin/postgrest \n" \ + "autostart=true \n" \ + "autorestart=true \n" \ + "\n" \ + "[program:tooljet] \n" \ + "user=root \n" \ + "command=/bin/bash -c '/app/server/scripts/boot.sh' \n" \ + "autostart=true \n" \ + "autorestart=true \n" \ + "stderr_logfile=/dev/stdout \n" \ + "stderr_logfile_maxbytes=0 \n" \ + "stdout_logfile=/dev/stdout \n" \ + "stdout_logfile_maxbytes=0 \n" | sed 's/ //' > /etc/supervisor/conf.d/supervisord.conf + +# ENV defaults +ENV TOOLJET_HOST=http://localhost \ + PORT=3000 \ + NODE_ENV=production \ + LOCKBOX_MASTER_KEY=replace_with_lockbox_master_key \ + SECRET_KEY_BASE=replace_with_secret_key_base \ + PG_DB=tooljet_production \ + PG_USER=postgres \ + PG_PASS=postgres \ + PG_HOST=localhost \ + ENABLE_TOOLJET_DB=true \ + TOOLJET_DB_HOST=localhost \ + TOOLJET_DB_USER=postgres \ + TOOLJET_DB_PASS=postgres \ + TOOLJET_DB=tooljet_db \ + PGRST_HOST=http://localhost:3001 \ + PGRST_SERVER_PORT=3001 \ + PGRST_DB_URI=postgres://postgres:postgres@localhost/tooljet_db \ + PGRST_JWT_SECRET=r9iMKoe5CRMgvJBBtp4HrqN7QiPpUToj \ + PGRST_DB_PRE_CONFIG=postgrest.pre_config \ + REDIS_HOST=localhost \ + REDIS_PORT=6379 \ + REDIS_USER= \ + REDIS_PASSWORD= \ + ORM_LOGGING=true \ + DEPLOYMENT_PLATFORM=docker:local \ + HOME=/home/appuser \ + TERM=xterm + + +RUN chmod +x ./server/scripts/preview.sh +# Set the entrypoint +ENTRYPOINT ["./server/scripts/preview.sh"] diff --git a/cypress-tests/cypress/support/utils/apps.js b/cypress-tests/cypress/support/utils/apps.js index 0ddfd72ac7..2a6b9da2b9 100644 --- a/cypress-tests/cypress/support/utils/apps.js +++ b/cypress-tests/cypress/support/utils/apps.js @@ -135,7 +135,7 @@ export const resolveHost = () => { const baseUrl = Cypress.config("baseUrl"); const urlMapping = { - "http://localhost:8082": "http://localhost:8082", + "http://localhost:3000": "http://localhost:3000", "http://localhost:3000/apps": "http://localhost:3000/apps", "http://localhost:4001": "http://localhost:3000", "http://localhost:4001/apps": "http://localhost:3000/apps", diff --git a/server/scripts/preview.sh b/server/scripts/preview.sh index 6664902874..d45e6ccb60 100644 --- a/server/scripts/preview.sh +++ b/server/scripts/preview.sh @@ -1,6 +1,8 @@ #!/bin/bash set -e +redis-server /etc/redis/redis.conf & + # Fix ownership and permissions chown -R postgres:postgres /var/lib/postgresql /var/run/postgresql chmod 0700 /var/lib/postgresql/13/main