diff --git a/.github/workflows/cloud-frontend-gcp.yml b/.github/workflows/cloud-frontend-gcp.yml index fceb991dff..f3119c4ac1 100644 --- a/.github/workflows/cloud-frontend-gcp.yml +++ b/.github/workflows/cloud-frontend-gcp.yml @@ -140,3 +140,50 @@ jobs: TOOLJET_SERVER_URL: ${{ secrets.CLOUD_TOOLJET_SERVER_URL }} WEBSITE_SIGNUP_URL: https://website-stage.tooljet.ai/signup TOOLJET_EDITION: cloud + + Purge_Cloudflare_Cache: + needs: deploy + runs-on: ubuntu-latest + + steps: + - name: โœ… Check user authorization + run: | + allowed_user1=${{ secrets.ALLOWED_USER1_USERNAME }} + allowed_user2=${{ secrets.ALLOWED_USER2_USERNAME }} + allowed_user3=${{ secrets.ALLOWED_USER3_USERNAME }} + + if [[ "${{ github.actor }}" != "$allowed_user1" && \ + "${{ github.actor }}" != "$allowed_user2" && \ + "${{ github.actor }}" != "$allowed_user3" ]]; then + echo "โŒ User '${{ github.actor }}' is not authorized to trigger this workflow." + exit 1 + else + echo "โœ… User '${{ github.actor }}' is authorized." + fi + + - name: ๐Ÿงน Purge Cloudflare Cache + continue-on-error: true + run: | + echo "๐Ÿ”„ Purging Cloudflare cache for specific URLs..." + response=$(curl -s -w "\n%{http_code}" -X POST \ + "https://api.cloudflare.com/client/v4/zones/${{ secrets.CLOUDFLARE_ZONE_ID_PROD }}/purge_cache" \ + -H "Authorization: Bearer ${{ secrets.CLOUDFLARE_API_TOKEN_PROD }}" \ + -H "Content-Type: application/json" \ + --data '{ + "files": [ + "${{ secrets.CLOUDFLARE_CONFIG_URL_STAGE }}", + "${{ secrets.CLOUDFLARE_METADATA_URL_STAGE }}" + ] + }') + + http_code=$(echo "$response" | tail -n1) + body=$(echo "$response" | sed '$d') + + if [ "$http_code" = "200" ]; then + echo "โœ… Cloudflare cache purged successfully for specified URLs" + echo "$body" + else + echo "โš ๏ธ Cloudflare cache purge failed with status code: $http_code" + echo "$body" + exit 1 + fi diff --git a/.github/workflows/cloud-frontend.yml b/.github/workflows/cloud-frontend.yml index c40c12e4fd..548a38718c 100644 --- a/.github/workflows/cloud-frontend.yml +++ b/.github/workflows/cloud-frontend.yml @@ -118,7 +118,7 @@ jobs: SERVER_IP: ${{ secrets.CLOUD_PROD_CLOUD_SERVER_IP }} TJDB_SQL_MODE_DISABLE: ${{ secrets.CLOUD_TJDB_SQL_MODE_DISABLE }} TOOLJET_SERVER_URL: ${{ secrets.CLOUD_TOOLJET_SERVER_URL }} - WEBSITE_SIGNUP_URL: https://tooljet.ai/ai-create-account + WEBSITE_SIGNUP_URL: https://www.tooljet.com/create-account TOOLJET_EDITION: cloud - name: ๐Ÿš€ Deploy to Netlify @@ -138,5 +138,52 @@ jobs: SERVER_IP: ${{ secrets.CLOUD_PROD_CLOUD_SERVER_IP }} TJDB_SQL_MODE_DISABLE: ${{ secrets.CLOUD_PROD_TJDB_SQL_MODE_DISABLE }} TOOLJET_SERVER_URL: ${{ secrets.CLOUD_PROD_TOOLJET_SERVER_URL }} - WEBSITE_SIGNUP_URL: https://www.tooljet.ai/create-account + WEBSITE_SIGNUP_URL: https://www.tooljet.com/create-account TOOLJET_EDITION: cloud + + Purge_Cloudflare_Cache: + needs: deploy + runs-on: ubuntu-latest + + steps: + - name: โœ… Check user authorization + run: | + allowed_user1=${{ secrets.ALLOWED_USER1_USERNAME }} + allowed_user2=${{ secrets.ALLOWED_USER2_USERNAME }} + allowed_user3=${{ secrets.ALLOWED_USER3_USERNAME }} + + if [[ "${{ github.actor }}" != "$allowed_user1" && \ + "${{ github.actor }}" != "$allowed_user2" && \ + "${{ github.actor }}" != "$allowed_user3" ]]; then + echo "โŒ User '${{ github.actor }}' is not authorized to trigger this workflow." + exit 1 + else + echo "โœ… User '${{ github.actor }}' is authorized." + fi + + - name: ๐Ÿงน Purge Cloudflare Cache + continue-on-error: true + run: | + echo "๐Ÿ”„ Purging Cloudflare cache for specific URLs..." + response=$(curl -s -w "\n%{http_code}" -X POST \ + "https://api.cloudflare.com/client/v4/zones/${{ secrets.CLOUDFLARE_ZONE_ID_PROD }}/purge_cache" \ + -H "Authorization: Bearer ${{ secrets.CLOUDFLARE_API_TOKEN_PROD }}" \ + -H "Content-Type: application/json" \ + --data '{ + "files": [ + "${{ secrets.CLOUDFLARE_CONFIG_URL_PROD }}", + "${{ secrets.CLOUDFLARE_METADATA_URL_PROD }}" + ] + }') + + http_code=$(echo "$response" | tail -n1) + body=$(echo "$response" | sed '$d') + + if [ "$http_code" = "200" ]; then + echo "โœ… Cloudflare cache purged successfully for specified URLs" + echo "$body" + else + echo "โš ๏ธ Cloudflare cache purge failed with status code: $http_code" + echo "$body" + exit 1 + fi diff --git a/.github/workflows/manual-docker-build.yml b/.github/workflows/manual-docker-build.yml index 50c41c7ebf..f9d06848b2 100644 --- a/.github/workflows/manual-docker-build.yml +++ b/.github/workflows/manual-docker-build.yml @@ -4,11 +4,11 @@ on: workflow_dispatch: inputs: branch_name: - description: 'Git branch to build from' + description: "Git branch to build from" required: true - default: 'main' + default: "main" dockerfile_path: - description: 'Path to Dockerfile' + description: "Path to Dockerfile" required: true type: choice options: @@ -16,7 +16,7 @@ on: - ./docker/pre-release/ee/ee-production.Dockerfile - ./docker/LTS/cloud/cloud-server.Dockerfile docker_tag: - description: 'Docker tag suffix (e.g., pre-release-14)' + description: "Docker tag suffix (e.g., pre-release-14)" required: true jobs: @@ -24,6 +24,16 @@ jobs: runs-on: ubuntu-latest steps: + - name: Free up disk space + run: | + sudo rm -rf /usr/share/dotnet + sudo rm -rf /opt/ghc + sudo rm -rf /usr/local/share/boost + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + sudo docker system prune -af + sudo apt-get clean + df -h + - name: Checkout repo uses: actions/checkout@v4 with: @@ -57,6 +67,8 @@ jobs: push: true tags: ${{ steps.taggen.outputs.tag }} platforms: linux/amd64 + cache-from: type=gha + cache-to: type=gha,mode=max build-args: | CUSTOM_GITHUB_TOKEN=${{ secrets.CUSTOM_GITHUB_TOKEN }} BRANCH_NAME=${{ github.event.inputs.branch_name }} diff --git a/.github/workflows/render-preview-deploy.yml b/.github/workflows/render-preview-deploy.yml index c53ebe784c..bea66feada 100644 --- a/.github/workflows/render-preview-deploy.yml +++ b/.github/workflows/render-preview-deploy.yml @@ -5,8 +5,8 @@ on: issue_comment: types: [created, edited, deleted] env: - PR_NUMBER: ${{ github.event.number }} - BRANCH_NAME: ${{ github.head_ref || github.ref_name }} + PR_NUMBER: ${{ github.event.pull_request.number || github.event.issue.number }} + BRANCH_NAME: ${{ github.event.pull_request.head.ref || github.head_ref || github.ref_name }} permissions: pull-requests: write @@ -20,6 +20,21 @@ jobs: runs-on: ubuntu-latest steps: + - name: Get PR details for issue_comment events + if: github.event_name == 'issue_comment' + uses: actions/github-script@v6 + with: + script: | + const pr = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: context.issue.number + }); + core.exportVariable('PR_NUMBER', pr.data.number); + core.exportVariable('BRANCH_NAME', pr.data.head.ref); + console.log(`โœ… PR Number: ${pr.data.number}`); + console.log(`โœ… Branch Name: ${pr.data.head.ref}`); + - name: Sync repo uses: actions/checkout@v3 @@ -285,36 +300,7 @@ jobs: console.log(e) } - # - name: Install PostgreSQL client - # run: | - # sudo apt update - # sudo apt install postgresql-client -y - - # - name: Wait after installing PostgreSQL - # run: sleep 25 - - # - name: Drop PostgreSQL PR databases - # env: - # PGHOST: ${{ secrets.RENDER_DS_PG_HOST }} - # PGPORT: 5432 - # PGUSER: ${{ secrets.RENDER_DS_PG_USER }} - # PGDATABASE: ${{ env.PR_NUMBER }}-ce - # PGTJBDATABASE: ${{ env.PR_NUMBER }}-ce-tjdb - # run: | - # if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGDATABASE; then - # echo "Database $PGDATABASE exists, deleting..." - # PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "drop database \"$PGDATABASE\" ;" - # else - # echo "Database $PGDATABASE does not exist." - # fi - - # if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGTJBDATABASE; then - # echo "Database $PGTJBDATABASE exists, deleting..." - # PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "drop database \"$PGTJBDATABASE\" ;" - # else - # echo "Database $PGTJBDATABASE does not exist." - # fi - + suspend-ce-review-app: if: ${{ github.event.action == 'labeled' && github.event.label.name == 'suspend-ce-review-app' }} runs-on: ubuntu-latest @@ -391,10 +377,27 @@ jobs: # Enterprise Edition create-ee-review-app: - if: ${{ github.event.action == 'labeled' && (github.event.label.name == 'create-ee-review-app' || github.event.label.name == 'review-app') }} + if: | + (github.event.action == 'labeled' && (github.event.label.name == 'create-ee-review-app' || github.event.label.name == 'create-ee-lts-review-app' || github.event.label.name == 'review-app')) || + (github.event.action == 'created' && (contains(github.event.comment.body, '/deploy-ee') || contains(github.event.comment.body, '/deploy-ee-lts'))) runs-on: ubuntu-latest steps: + - name: Get PR details for issue_comment events + if: github.event_name == 'issue_comment' + uses: actions/github-script@v6 + with: + script: | + const pr = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: context.issue.number + }); + core.exportVariable('PR_NUMBER', pr.data.number); + core.exportVariable('BRANCH_NAME', pr.data.head.ref); + console.log(`โœ… PR Number: ${pr.data.number}`); + console.log(`โœ… Branch Name: ${pr.data.head.ref}`); + - name: Sync repo uses: actions/checkout@v3 @@ -426,25 +429,26 @@ jobs: if: env.is_fork == 'false' uses: actions/checkout@v3 - - name: Detect base branch and set Dockerfile path + - name: Determine Dockerfile path run: | - BASE_BRANCH="${{ github.event.pull_request.base.ref }}" - echo "Base branch: $BASE_BRANCH" - - if [[ "$BASE_BRANCH" == "main" || "$BASE_BRANCH" == release/* ]]; then - DOCKERFILE="./docker/pre-release/ee/ee-preview.Dockerfile" - echo "Using pre-release track" - elif [[ "$BASE_BRANCH" == "lts-3.16" || "$BASE_BRANCH" == release-lts/* ]]; then + # Check if LTS deployment is requested via comment or label + if [[ "${{ github.event.action }}" == "labeled" && "${{ github.event.label.name }}" == "create-ee-lts-review-app" ]]; then DOCKERFILE="./docker/LTS/ee/ee-preview.Dockerfile" - echo "Using LTS track" + EDITION_TYPE="LTS" + echo "Using LTS EE Dockerfile (triggered by label)" + elif [[ "${{ github.event.action }}" == "created" && "${{ github.event.comment.body }}" == *"/deploy-ee-lts"* ]]; then + DOCKERFILE="./docker/LTS/ee/ee-preview.Dockerfile" + EDITION_TYPE="LTS" + echo "Using LTS EE Dockerfile (triggered by comment)" else - echo "Error: Unsupported base branch '$BASE_BRANCH'" - echo "Supported branches: main, release/*, lts-3.16, release-lts/*" - exit 1 + DOCKERFILE="./docker/pre-release/ee/ee-preview.Dockerfile" + EDITION_TYPE="pre-release" + echo "Using pre-release EE Dockerfile" fi - + echo "Edition Type: $EDITION_TYPE" echo "Selected Dockerfile: $DOCKERFILE" echo "DOCKERFILE=$DOCKERFILE" >> $GITHUB_ENV + echo "EDITION_TYPE=$EDITION_TYPE" >> $GITHUB_ENV - name: Creating deployment for Enterprise Edition id: create-ee-deployment @@ -626,11 +630,12 @@ jobs: with: github-token: ${{secrets.GITHUB_TOKEN}} script: | + const editionType = '${{ env.EDITION_TYPE }}' === 'LTS' ? '(LTS)' : ''; github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, - body: 'Enterpise Edition: \n Deployment: https://tooljet-ee-pr-${{ env.PR_NUMBER }}.onrender.com \n Dashboard: https://dashboard.render.com/web/${{ env.SERVICE_ID }}' + body: `Enterprise Edition ${editionType}: \n Deployment: https://tooljet-ee-pr-${{ env.PR_NUMBER }}.onrender.com \n Dashboard: https://dashboard.render.com/web/${{ env.SERVICE_ID }}` }) - uses: actions/github-script@v6 @@ -646,6 +651,17 @@ jobs: } catch (e) { console.log(e) } + + try { + await github.rest.issues.removeLabel({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + name: 'create-ee-lts-review-app' + }) + } catch (e) { + console.log(e) + } await github.rest.issues.addLabels({ issue_number: context.issue.number, @@ -708,35 +724,7 @@ jobs: console.log(e) } - # - name: Install PostgreSQL client - # run: | - # sudo apt update - # sudo apt install postgresql-client -y - # - name: Wait after installing PostgreSQL - # run: sleep 25 - - # - name: Drop PostgreSQL PR databases - # env: - # PGHOST: ${{ secrets.RENDER_DS_PG_HOST }} - # PGPORT: 5432 - # PGUSER: ${{ secrets.RENDER_DS_PG_USER }} - # PGDATABASE: ${{ env.PR_NUMBER }}-ee - # PGTJBDATABASE: ${{ env.PR_NUMBER }}-ee-tjdb - # run: | - # if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGDATABASE; then - # echo "Database $PGDATABASE exists, deleting..." - # PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "drop database \"$PGDATABASE\" ;" - # else - # echo "Database $PGDATABASE does not exist." - # fi - - # if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGTJBDATABASE; then - # echo "Database $PGTJBDATABASE exists, deleting..." - # PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "drop database \"$PGTJBDATABASE\" ;" - # else - # echo "Database $PGTJBDATABASE does not exist." - # fi suspend-ee-review-app: if: ${{ github.event.action == 'labeled' && github.event.label.name == 'suspend-ee-review-app' }} @@ -811,369 +799,6 @@ jobs: - -# Cloud Edition - - # create-cloud-review-app: - # if: ${{ github.event.action == 'labeled' && (github.event.label.name == 'create-cloud-review-app' || github.event.label.name == 'review-app') }} - # runs-on: ubuntu-latest - - # steps: - # - name: Creating deployment for Cloud Edition - # id: create-cloud-deployment - # run: | - # export RESPONSE=$(curl --request POST \ - # --url https://api.render.com/v1/services \ - # --header 'accept: application/json' \ - # --header 'content-type: application/json' \ - # --header 'Authorization: Bearer ${{ secrets.RENDER_API_KEY }}' \ - # --data ' - # { - # "autoDeploy": "yes", - # "branch": "${{ env.BRANCH_NAME }}", - # "name": "ToolJet Cloud PR #${{ env.PR_NUMBER }}", - # "notifyOnFail": "default", - # "ownerId": "tea-caeo4bj19n072h3dddc0", - # "repo": "https://github.com/ToolJet/ToolJet", - # "slug": "tooljet-cloud-pr-${{ env.PR_NUMBER }}", - # "suspended": "not_suspended", - # "suspenders": [], - # "type": "web_service", - # "envVars": [ - # { - # "key": "PG_HOST", - # "value": "${{ secrets.RENDER_PG_HOST }}" - # }, - # { - # "key": "PG_PORT", - # "value": "5432" - # }, - # { - # "key": "PG_USER", - # "value": "${{ secrets.RENDER_PG_USER }}" - # }, - # { - # "key": "PG_PASS", - # "value": "${{ secrets.RENDER_PG_PASS }}" - # }, - # { - # "key": "PG_DB", - # "value": "${{ env.PR_NUMBER }}-cloud" - # }, - # { - # "key": "TOOLJET_DB", - # "value": "${{ env.PR_NUMBER }}-cloud-tjdb" - # }, - # { - # "key": "TOOLJET_DB_HOST", - # "value": "${{ secrets.RENDER_PG_HOST }}" - # }, - # { - # "key": "TOOLJET_DB_USER", - # "value": "${{ secrets.RENDER_PG_USER }}" - # }, - # { - # "key": "TOOLJET_DB_PASS", - # "value": "${{ secrets.RENDER_PG_PASS }}" - # }, - # { - # "key": "TOOLJET_DB_PORT", - # "value": "5432" - # }, - # { - # "key": "PGRST_DB_PRE_CONFIG", - # "value": "postgrest.pre_config" - # }, - # { - # "key": "PGRST_DB_URI", - # "value": "postgres://${{ secrets.RENDER_PG_USER }}:${{ secrets.RENDER_PG_PASS }}@${{ secrets.RENDER_PG_HOST }}/${{ env.PR_NUMBER }}-cloud-tjdb" - # }, - # { - # "key": "PGRST_HOST", - # "value": "127.0.0.1:3000" - # }, - # { - # "key": "PGRST_JWT_SECRET", - # "value": "r9iMKoe5CRMgvJBBtp4HrqN7QiPpUToj" - # }, - # { - # "key": "PGRST_LOG_LEVEL", - # "value": "info" - # }, - # { - # "key": "PORT", - # "value": "80" - # }, - # { - # "key": "TOOLJET_HOST", - # "value": "https://tooljet-cloud-pr-${{ env.PR_NUMBER }}.onrender.com" - # }, - # { - # "key": "DISABLE_TOOLJET_TELEMETRY", - # "value": "true" - # }, - # { - # "key": "SMTP_ADDRESS", - # "value": "smtp.mailtrap.io" - # }, - # { - # "key": "SMTP_DOMAIN", - # "value": "smtp.mailtrap.io" - # }, - # { - # "key": "SMTP_PORT", - # "value": "2525" - # }, - # { - # "key": "SMTP_USERNAME", - # "value": "${{ secrets.RENDER_SMTP_USERNAME }}" - # }, - # { - # "key": "SMTP_PASSWORD", - # "value": "${{ secrets.RENDER_SMTP_PASSWORD }}" - # }, - # { - # "key": "REDIS_HOST", - # "value": "${{ secrets.RENDER_REDIS_HOST }}" - # }, - # { - # "key": "REDIS_PORT", - # "value": "${{ secrets.RENDER_REDIS_PORT }}" - # }, - # { - # "key": "TEMPORAL_SERVER_ADDRESS", - # "value": "https://auto-setup-1-25-1.onrender.com" - # }, - # { - # "key": "TEMPORAL_TASK_QUEUE_NAME_FOR_WORKFLOWS", - # "value": "tooljet-cloud-pr-${{ env.PR_NUMBER }}" - # }, - # { - # "key": "TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE", - # "value": "default" - # }, - # { - # "key": "TOOLJET_MARKETPLACE_URL", - # "value": "${{ secrets.MARKETPLACE_BUCKET }}" - # }, - # { - # "key": "CUSTOM_GITHUB_TOKEN", - # "value": "${{ secrets.CUSTOM_GITHUB_TOKEN }}" - # } - # ], - # "serviceDetails": { - # "disk": null, - # "env": "docker", - # "envSpecificDetails": { - # "dockerCommand": "", - # "dockerContext": "./", - # "dockerfilePath": "./docker/cloud/cloud-preview.Dockerfile" - # }, - # "healthCheckPath": "/api/health", - # "numInstances": 1, - # "openPorts": [{ - # "port": 80, - # "protocol": "TCP" - # }], - # "plan": "starter", - # "pullRequestPreviewsEnabled": "no", - # "region": "oregon", - # "url": "https://tooljet-cloud-pr-${{ env.PR_NUMBER }}.onrender.com" - # } - # }') - - # echo "response: $RESPONSE" - # export SERVICE_ID=$(echo $RESPONSE | jq -r '.service.id') - # echo "SERVICE_ID=$SERVICE_ID" >> $GITHUB_ENV - - # - name: Comment deployment URL - # uses: actions/github-script@v5 - # with: - # github-token: ${{secrets.GITHUB_TOKEN}} - # script: | - # github.rest.issues.createComment({ - # issue_number: context.issue.number, - # owner: context.repo.owner, - # repo: context.repo.repo, - # body: 'Cloud Edition: \n Deployment: https://tooljet-cloud-pr-${{ env.PR_NUMBER }}.onrender.com \n Dashboard: https://dashboard.render.com/web/${{ env.SERVICE_ID }}' - # }) - - # - uses: actions/github-script@v6 - # with: - # script: | - # try { - # await github.rest.issues.removeLabel({ - # issue_number: context.issue.number, - # owner: context.repo.owner, - # repo: context.repo.repo, - # name: 'create-cloud-review-app' - # }) - # } catch (e) { - # console.log(e) - # } - - # await github.rest.issues.addLabels({ - # issue_number: context.issue.number, - # owner: context.repo.owner, - # repo: context.repo.repo, - # labels: ['active-cloud-review-app'] - # }) - - # destroy-cloud-review-app: - # if: ${{ (github.event.action == 'labeled' && github.event.label.name == 'destroy-cloud-review-app') || github.event.action == 'closed' }} - # runs-on: ubuntu-latest - - # steps: - # - name: Delete service - # run: | - # export SERVICE_ID=$(curl --request GET \ - # --url 'https://api.render.com/v1/services?name=ToolJet%20PR%20%23${{ env.PR_NUMBER }}&limit=1' \ - # --header 'accept: application/json' \ - # --header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}' | \ - # jq -r '.[0].service.id') - - # curl --request DELETE \ - # --url https://api.render.com/v1/services/$SERVICE_ID \ - # --header 'accept: application/json' \ - # --header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}' - - # - uses: actions/github-script@v6 - # with: - # script: | - # try { - # await github.rest.issues.removeLabel({ - # issue_number: context.issue.number, - # owner: context.repo.owner, - # repo: context.repo.repo, - # name: 'destroy-cloud-review-app' - # }) - # } catch (e) { - # console.log(e) - # } - - # try { - # await github.rest.issues.removeLabel({ - # issue_number: context.issue.number, - # owner: context.repo.owner, - # repo: context.repo.repo, - # name: 'suspend-cloud-review-app' - # }) - # } catch (e) { - # console.log(e) - # } - - # try { - # await github.rest.issues.removeLabel({ - # issue_number: context.issue.number, - # owner: context.repo.owner, - # repo: context.repo.repo, - # name: 'active-cloud-review-app' - # }) - # } catch (e) { - # console.log(e) - # } - - # - name: Install PostgreSQL client - # run: | - # sudo apt update - # sudo apt install postgresql-client -y - - # - name: Wait after installing PostgreSQL - # run: sleep 25 - - # - name: Drop PostgreSQL PR databases - # env: - # PGHOST: ${{ secrets.RENDER_DS_PG_HOST }} - # PGPORT: 5432 - # PGUSER: ${{ secrets.RENDER_DS_PG_USER }} - # PGDATABASE: ${{ env.PR_NUMBER }}-cloud - # PGTJBDATABASE: ${{ env.PR_NUMBER }}-cloud-tjdb - # run: | - # if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGDATABASE; then - # echo "Database $PGDATABASE exists, deleting..." - # PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "drop database \"$PGDATABASE\" ;" - # else - # echo "Database $PGDATABASE does not exist." - # fi - - # if PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -lqt | cut -d \| -f 1 | grep -qw $PGTJBDATABASE; then - # echo "Database $PGTJBDATABASE exists, deleting..." - # PGPASSWORD=${{ secrets.RENDER_DS_PG_PASS }} psql -h $PGHOST -p $PGPORT -U $PGUSER -d postgres -c "drop database \"$PGTJBDATABASE\" ;" - # else - # echo "Database $PGTJBDATABASE does not exist." - # fi - - # suspend-cloud-review-app: - # if: ${{ github.event.action == 'labeled' && github.event.label.name == 'suspend-cloud-review-app' }} - # runs-on: ubuntu-latest - - # steps: - # - name: Suspend service - # run: | - # export SERVICE_ID=$(curl --request GET \ - # --url 'https://api.render.com/v1/services?name=ToolJet%20PR%20%23${{ env.PR_NUMBER }}&limit=1' \ - # --header 'accept: application/json' \ - # --header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}' | \ - # jq -r '.[0].service.id') - - # curl --request POST \ - # --url https://api.render.com/v1/services/$SERVICE_ID/suspend \ - # --header 'accept: application/json' \ - # --header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}' - - # - uses: actions/github-script@v6 - # with: - # script: | - # try { - # await github.rest.issues.removeLabel({ - # issue_number: context.issue.number, - # owner: context.repo.owner, - # repo: context.repo.repo, - # name: 'active-cloud-review-app' - # }) - # } catch (e) { - # console.log(e) - # } - - # resume-cloud-review-app: - # if: ${{ github.event.action == 'unlabeled' && github.event.label.name == 'suspend-cloud-review-app' }} - # runs-on: ubuntu-latest - - # steps: - # - name: Resume service - # run: | - # export SERVICE_ID=$(curl --request GET \ - # --url 'https://api.render.com/v1/services?name=ToolJet%20PR%20%23${{ env.PR_NUMBER }}&limit=1' \ - # --header 'accept: application/json' \ - # --header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}' | \ - # jq -r '.[0].service.id') - - # curl --request POST \ - # --url https://api.render.com/v1/services/$SERVICE_ID/resume \ - # --header 'accept: application/json' \ - # --header 'authorization: Bearer ${{ secrets.RENDER_API_KEY }}' - - # - uses: actions/github-script@v6 - # with: - # script: | - # await github.rest.issues.addLabels({ - # issue_number: context.issue.number, - # owner: context.repo.owner, - # repo: context.repo.repo, - # labels: ['active-cloud-review-app'] - # }) - - # try { - # await github.rest.issues.removeLabel({ - # issue_number: context.issue.number, - # owner: context.repo.owner, - # repo: context.repo.repo, - # name: 'suspend-cloud-review-app' - # }) - # } catch (e) { - # console.log(e) - # } - redeploy-review-app: if: ${{ github.event.action == 'synchronize' || github.event.action == 'opened' }} runs-on: ubuntu-latest @@ -1404,3 +1029,4 @@ jobs: } catch (e) { console.log(e) } + \ No newline at end of file diff --git a/.github/workflows/update-test-system.yml b/.github/workflows/update-test-system.yml index ac5554040f..49ec505d39 100644 --- a/.github/workflows/update-test-system.yml +++ b/.github/workflows/update-test-system.yml @@ -4,21 +4,21 @@ on: workflow_dispatch: inputs: branch_name: - description: 'Git branch to build from' + description: "Git branch to build from" required: true - default: 'main' + default: "main" dockerfile_path: - description: 'Select Dockerfile' + description: "Select Dockerfile" required: true type: choice options: - ./docker/LTS/ee/ee-production.Dockerfile - ./docker/pre-release/ee/ee-production.Dockerfile docker_tag: - description: 'Docker tag suffix (e.g., pre-release-14, 3.16-lts, etc.)' + description: "Docker tag suffix (e.g., pre-release-14, 3.16-lts, etc.)" required: true test_system: - description: 'Select test system' + description: "Select test system" required: true type: choice options: @@ -36,6 +36,16 @@ jobs: runs-on: ubuntu-latest steps: + - name: Free up disk space + run: | + sudo rm -rf /usr/share/dotnet + sudo rm -rf /opt/ghc + sudo rm -rf /usr/local/share/boost + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + sudo docker system prune -af + sudo apt-get clean + df -h + - name: โœ… Check user authorization run: | # Define allowed users @@ -52,18 +62,20 @@ jobs: "${{ secrets.ALLOWED_USER10_TEST_SYSTEM }}" "${{ secrets.ALLOWED_USER11_TEST_SYSTEM }}" "${{ secrets.ALLOWED_USER12_TEST_SYSTEM }}" + "${{ secrets.ALLOWED_USER13_TEST_SYSTEM }}" + "${{ secrets.ALLOWED_USER14_TEST_SYSTEM }}" ) - + current_user="${{ github.actor }}" authorized=false - + for user in "${allowed_users[@]}"; do if [[ "$current_user" == "$user" ]]; then authorized=true break fi done - + if [[ "$authorized" == "false" ]]; then echo "โŒ User '$current_user' is not authorized to trigger this workflow." exit 1 @@ -104,6 +116,8 @@ jobs: push: true tags: ${{ steps.taggen.outputs.tag }} platforms: linux/amd64 + cache-from: type=gha + cache-to: type=gha,mode=max build-args: | CUSTOM_GITHUB_TOKEN=${{ secrets.CUSTOM_GITHUB_TOKEN }} BRANCH_NAME=${{ github.event.inputs.branch_name }} @@ -119,39 +133,39 @@ jobs: run: | test_system="${{ github.event.inputs.test_system }}" vm_host=$(echo '${{ secrets.VM_HOST_MAP_JSON }}' | jq -r --arg sys "$test_system" '.[$sys]') - + if [[ -z "$vm_host" || "$vm_host" == "null" ]]; then echo "VM mapping not found for $test_system" exit 1 fi - + echo "host=$vm_host" >> $GITHUB_OUTPUT - name: Deploy to target environment run: | echo "$SSH_KEY" > key.pem chmod 600 key.pem - + IMAGE_TAG="${{ steps.taggen.outputs.tag }}" TARGET_SYSTEM="${{ github.event.inputs.test_system }}" - + # Debug: Show what we're deploying echo "DEBUG: IMAGE_TAG=$IMAGE_TAG" echo "DEBUG: TARGET_SYSTEM=$TARGET_SYSTEM" - + ssh -o StrictHostKeyChecking=no -i key.pem $SSH_USER@${{ steps.vmhost.outputs.host }} << EOF set -e - + IMAGE_TAG="$IMAGE_TAG" TARGET_SYSTEM="$TARGET_SYSTEM" - + cd ~ echo "๐Ÿ“ Finding correct deployment directory" - + # Debug: Show variables on remote host echo "Debug on remote: IMAGE_TAG=\$IMAGE_TAG" echo "Debug on remote: TARGET_SYSTEM=\$TARGET_SYSTEM" - + if [[ "\$TARGET_SYSTEM" == *-3.16-lts ]]; then echo "Detected LTS system: \$TARGET_SYSTEM" echo "๐Ÿ” Searching for LTS directories..." @@ -182,39 +196,39 @@ jobs: cd ~ echo "โœ… Now in directory: \$(pwd)" fi - + echo "๐Ÿ” Docker login" echo "${{ secrets.DOCKER_PASSWORD }}" | sudo docker login --username "${{ secrets.DOCKER_USERNAME }}" --password-stdin - + echo "current image" cat .env | grep TOOLJET_IMAGE - + echo "๐Ÿ“ฆ Reading current TOOLJET_IMAGE from .env" CURRENT_IMAGE=\$(grep '^TOOLJET_IMAGE=' .env | cut -d '=' -f2- | tr -d '"' | tr -d "'") echo "Found CURRENT_IMAGE: \$CURRENT_IMAGE" - + echo "๐Ÿ›‘ Stopping containers" sudo docker-compose down - + echo "๐Ÿ“ Updating .env with new image" sudo sed -i "s|^TOOLJET_IMAGE=.*|TOOLJET_IMAGE=\$IMAGE_TAG|" .env - + echo "๐Ÿ“ฅ Pulling new image: \$IMAGE_TAG" if [ -z "\$IMAGE_TAG" ]; then echo "โŒ IMAGE_TAG is empty!" exit 1 fi sudo docker pull "\$IMAGE_TAG" - + echo "๐Ÿš€ Starting container in background" sudo docker-compose up -d - + # Wait for ToolJet to start and show success message echo "โณ Waiting for ToolJet to start (timeout: 300 seconds)..." SUCCESS_FOUND=false TIMEOUT=300 ELAPSED=0 - + while [ \$ELAPSED -lt \$TIMEOUT ]; do # Check for success message in logs if sudo docker-compose logs 2>/dev/null | grep -qE "๐Ÿš€ TOOLJET APPLICATION STARTED SUCCESSFULLY|Ready to use at http://localhost:82 ๐Ÿš€|Ready to use at http://localhost:80"; then @@ -227,7 +241,7 @@ jobs: sleep 10 ELAPSED=\$((ELAPSED + 10)) done - + if [ "\$SUCCESS_FOUND" = false ]; then echo "โŒ Timeout reached without finding success logs" echo "๐Ÿ“„ Showing current logs for troubleshooting..." @@ -248,20 +262,19 @@ jobs: echo "โœ… Rollback completed!" exit 1 fi - + echo "โœ… Deployment successful!" - + echo "๐Ÿ“Œ Storing successful deployment info in .env" sudo sed -i "/^OLD_IMAGE=/d" .env echo "OLD_IMAGE=\$CURRENT_IMAGE" | sudo tee -a .env echo "๐Ÿ“„ Final application logs:" sudo docker-compose logs --tail=50 - + echo "๐Ÿงน Pruning old Docker images" sudo docker image prune -a -f - + EOF env: SSH_USER: ${{ secrets.AZURE_VM_USER }} SSH_KEY: ${{ secrets.AZURE_VM_KEY }} - diff --git a/.github/workflows/updating-dockertag.yml b/.github/workflows/updating-dockertag.yml index d13089bbbb..b2d03cf2df 100644 --- a/.github/workflows/updating-dockertag.yml +++ b/.github/workflows/updating-dockertag.yml @@ -2,8 +2,8 @@ name: Update LTS Table on: workflow_dispatch: # manually triggered - schedule: - - cron: '30 5 * * 1,4' + # schedule: + # - cron: '30 5 * * 1,4' jobs: update-lts: diff --git a/.github/workflows/vulnerability-ci.yml b/.github/workflows/vulnerability-ci.yml index 7a002d56ff..b325bbc84c 100644 --- a/.github/workflows/vulnerability-ci.yml +++ b/.github/workflows/vulnerability-ci.yml @@ -8,27 +8,27 @@ on: # Allows you to run this workflow manually from the Actions tab workflow_dispatch: - # Schedule the workflow to run every two weeks once + # Schedule the workflow to run weekly every Monday at 5:30 AM UTC schedule: - - cron: '30 5 * * 1' + - cron: "30 5 * * 1" jobs: PeriodicVulnerability-CheckOn-frontend-code: - if: github.event_name == 'schedule' + if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v3 with: - ref: refs/heads/main + ref: refs/heads/lts-3.16 - name: Use Node.js 22.15.1 uses: actions/setup-node@v3 with: node-version: 22.15.1 - + - name: Install dependencies run: npm --prefix frontend install @@ -43,43 +43,156 @@ jobs: moderate=$(echo $vulnerabilities | jq '.moderate') high=$(echo $vulnerabilities | jq '.high') critical=$(echo $vulnerabilities | jq '.critical') - echo "::set-output name=moderate::$moderate" - echo "::set-output name=high::$high" - echo "::set-output name=critical::$critical" + echo "moderate=$moderate" >> $GITHUB_OUTPUT + echo "high=$high" >> $GITHUB_OUTPUT + echo "critical=$critical" >> $GITHUB_OUTPUT - name: Upload audit report uses: actions/upload-artifact@v4 with: name: Periodic-frontend-audit-report path: Periodic-frontend-audit.json + retention-days: 7 + + - name: Determine notification color + id: determine-color + run: | + critical=${{ steps.parse-audit.outputs.critical }} + high=${{ steps.parse-audit.outputs.high }} + moderate=${{ steps.parse-audit.outputs.moderate }} + total=$((critical + high + moderate)) + + if [ "$critical" -gt 0 ]; then + echo "color=#FF0000" >> $GITHUB_OUTPUT + elif [ "$high" -gt 0 ]; then + echo "color=#FFA500" >> $GITHUB_OUTPUT + else + echo "color=#FFD700" >> $GITHUB_OUTPUT + fi + + echo "total=$total" >> $GITHUB_OUTPUT - name: Send Slack Notification run: | - message="Periodic Security Audit Report Of Frontend directory\n - Node module vulnerabilities summary:\n - ๐Ÿ”ด Critical: ${{ steps.parse-audit.outputs.critical }}\n - ๐ŸŸ  High: ${{ steps.parse-audit.outputs.high }}\n - ๐ŸŸก Moderate: ${{ steps.parse-audit.outputs.moderate }}\n - \nDownload Audit Report: http://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - - curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$message\"}" ${{ secrets.SLACK_WEBHOOK_URL_VUR }} + payload=$(cat <> $GITHUB_OUTPUT + echo "high=$high" >> $GITHUB_OUTPUT + echo "critical=$critical" >> $GITHUB_OUTPUT - name: Upload audit report uses: actions/upload-artifact@v4 with: name: Periodic-server-audit-report path: Periodic-server-audit.json + retention-days: 7 + + - name: Determine notification color + id: determine-color + run: | + critical=${{ steps.parse-audit.outputs.critical }} + high=${{ steps.parse-audit.outputs.high }} + moderate=${{ steps.parse-audit.outputs.moderate }} + total=$((critical + high + moderate)) + + if [ "$critical" -gt 0 ]; then + echo "color=#FF0000" >> $GITHUB_OUTPUT + elif [ "$high" -gt 0 ]; then + echo "color=#FFA500" >> $GITHUB_OUTPUT + else + echo "color=#FFD700" >> $GITHUB_OUTPUT + fi + + echo "total=$total" >> $GITHUB_OUTPUT - name: Send Slack Notification run: | - message="Periodic Security Audit Report Of Server directory\n - Node module vulnerabilities summary:\n - ๐Ÿ”ด Critical: ${{ steps.parse-audit.outputs.critical }}\n - ๐ŸŸ  High: ${{ steps.parse-audit.outputs.high }}\n - ๐ŸŸก Moderate: ${{ steps.parse-audit.outputs.moderate }}\n - \nDownload Audit Report: http://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - - curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$message\"}" ${{ secrets.SLACK_WEBHOOK_URL_VUR }} + payload=$(cat <> $GITHUB_OUTPUT + echo "high=$high" >> $GITHUB_OUTPUT + echo "critical=$critical" >> $GITHUB_OUTPUT - name: Upload audit report uses: actions/upload-artifact@v4 with: name: Periodic-marketplace-audit-report path: Periodic-marketplace-audit.json + retention-days: 7 + + - name: Determine notification color + id: determine-color + run: | + critical=${{ steps.parse-audit.outputs.critical }} + high=${{ steps.parse-audit.outputs.high }} + moderate=${{ steps.parse-audit.outputs.moderate }} + total=$((critical + high + moderate)) + + if [ "$critical" -gt 0 ]; then + echo "color=#FF0000" >> $GITHUB_OUTPUT + elif [ "$high" -gt 0 ]; then + echo "color=#FFA500" >> $GITHUB_OUTPUT + else + echo "color=#FFD700" >> $GITHUB_OUTPUT + fi + + echo "total=$total" >> $GITHUB_OUTPUT - name: Send Slack Notification run: | - message="Periodic Security Audit Report Of Marketplace directory\n - Node module vulnerabilities summary:\n - ๐Ÿ”ด Critical: ${{ steps.parse-audit.outputs.critical }}\n - ๐ŸŸ  High: ${{ steps.parse-audit.outputs.high }}\n - ๐ŸŸก Moderate: ${{ steps.parse-audit.outputs.moderate }}\n - \nDownload Audit Report: http://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - - curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$message\"}" ${{ secrets.SLACK_WEBHOOK_URL_VUR }} + payload=$(cat <> $GITHUB_OUTPUT + echo "high=$high" >> $GITHUB_OUTPUT + echo "critical=$critical" >> $GITHUB_OUTPUT - name: Upload audit report uses: actions/upload-artifact@v4 with: name: Periodic-plugins-audit-report path: Periodic-plugins-audit.json + retention-days: 7 + + - name: Determine notification color + id: determine-color + run: | + critical=${{ steps.parse-audit.outputs.critical }} + high=${{ steps.parse-audit.outputs.high }} + moderate=${{ steps.parse-audit.outputs.moderate }} + total=$((critical + high + moderate)) + + if [ "$critical" -gt 0 ]; then + echo "color=#FF0000" >> $GITHUB_OUTPUT + elif [ "$high" -gt 0 ]; then + echo "color=#FFA500" >> $GITHUB_OUTPUT + else + echo "color=#FFD700" >> $GITHUB_OUTPUT + fi + + echo "total=$total" >> $GITHUB_OUTPUT - name: Send Slack Notification run: | - message="Periodic Security Audit Report Of Plugins directory\n - Node module vulnerabilities summary:\n - ๐Ÿ”ด Critical: ${{ steps.parse-audit.outputs.critical }}\n - ๐ŸŸ  High: ${{ steps.parse-audit.outputs.high }}\n - ๐ŸŸก Moderate: ${{ steps.parse-audit.outputs.moderate }}\n - \nDownload Audit Report: http://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - - curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$message\"}" ${{ secrets.SLACK_WEBHOOK_URL_VUR }} + payload=$(cat < Periodic-cypress-audit.json - continue-on-error: true - - - name: Parse audit summary - id: parse-audit - run: | - vulnerabilities=$(jq '.metadata.vulnerabilities' Periodic-cypress-audit.json) - moderate=$(echo $vulnerabilities | jq '.moderate') - high=$(echo $vulnerabilities | jq '.high') - critical=$(echo $vulnerabilities | jq '.critical') - echo "::set-output name=moderate::$moderate" - echo "::set-output name=high::$high" - echo "::set-output name=critical::$critical" - - - name: Upload audit report - uses: actions/upload-artifact@v4 - with: - name: Periodic-cypress-audit-report - path: Periodic-cypress-audit.json - - - name: Send Slack Notification - run: | - message="Periodic Security Audit Report Of Cypress directory\n - Node module vulnerabilities summary:\n - ๐Ÿ”ด Critical: ${{ steps.parse-audit.outputs.critical }}\n - ๐ŸŸ  High: ${{ steps.parse-audit.outputs.high }}\n - ๐ŸŸก Moderate: ${{ steps.parse-audit.outputs.moderate }}\n - \nDownload Audit Report: http://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - - curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$message\"}" ${{ secrets.SLACK_WEBHOOK_URL_VUR }} + http_code="${response: -3}" + if [ "$http_code" != "200" ]; then + echo "Slack notification failed with HTTP $http_code" + exit 1 + fi + echo "Slack notification sent successfully" PeriodicVulnerability-CheckOn-root-code: - if: github.event_name == 'schedule' + if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v3 with: - ref: refs/heads/main + ref: refs/heads/lts-3.16 - name: Use Node.js 22.15.1 uses: actions/setup-node@v3 with: node-version: 22.15.1 - + - name: Install dependencies run: npm install @@ -298,27 +699,140 @@ jobs: moderate=$(echo $vulnerabilities | jq '.moderate') high=$(echo $vulnerabilities | jq '.high') critical=$(echo $vulnerabilities | jq '.critical') - echo "::set-output name=moderate::$moderate" - echo "::set-output name=high::$high" - echo "::set-output name=critical::$critical" + echo "moderate=$moderate" >> $GITHUB_OUTPUT + echo "high=$high" >> $GITHUB_OUTPUT + echo "critical=$critical" >> $GITHUB_OUTPUT - name: Upload audit report uses: actions/upload-artifact@v4 with: name: Periodic-root-audit-report path: Periodic-root-audit.json + retention-days: 7 + + - name: Determine notification color + id: determine-color + run: | + critical=${{ steps.parse-audit.outputs.critical }} + high=${{ steps.parse-audit.outputs.high }} + moderate=${{ steps.parse-audit.outputs.moderate }} + total=$((critical + high + moderate)) + + if [ "$critical" -gt 0 ]; then + echo "color=#FF0000" >> $GITHUB_OUTPUT + elif [ "$high" -gt 0 ]; then + echo "color=#FFA500" >> $GITHUB_OUTPUT + else + echo "color=#FFD700" >> $GITHUB_OUTPUT + fi + + echo "total=$total" >> $GITHUB_OUTPUT - name: Send Slack Notification run: | - message="Periodic Security Audit Report Of Root directory\n - Node module vulnerabilities summary:\n - ๐Ÿ”ด Critical: ${{ steps.parse-audit.outputs.critical }}\n - ๐ŸŸ  High: ${{ steps.parse-audit.outputs.high }}\n - ๐ŸŸก Moderate: ${{ steps.parse-audit.outputs.moderate }}\n - \nDownload Audit Report: http://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - - curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$message\"}" ${{ secrets.SLACK_WEBHOOK_URL_VUR }} + payload=$(cat <> $GITHUB_OUTPUT + echo "high=$high" >> $GITHUB_OUTPUT + echo "critical=$critical" >> $GITHUB_OUTPUT - name: Upload audit report uses: actions/upload-artifact@v4 with: name: frontend-audit-report path: frontend-audit.json + retention-days: 7 - name: Create or update PR comment uses: peter-evans/create-or-update-comment@v1 @@ -374,7 +889,6 @@ jobs: Please find the JSON file in the [summary page](${{ github.frontend_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}). - ManualVulnerability-CheckOn-server-code: if: ${{ github.event.action == 'labeled' && (github.event.label.name == 'server-vulnerability' || github.event.label.name == 'check-vulnerability') }} runs-on: ubuntu-latest @@ -383,13 +897,13 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 with: - ref: ${{ github.event.pull_request.head.ref }} + ref: ${{ github.event.pull_request.head.ref }} - name: Use Node.js 22.15.1 uses: actions/setup-node@v3 with: node-version: 22.15.1 - + - name: Install dependencies run: npm --prefix server install @@ -404,15 +918,16 @@ jobs: moderate=$(echo $vulnerabilities | jq '.moderate') high=$(echo $vulnerabilities | jq '.high') critical=$(echo $vulnerabilities | jq '.critical') - echo "::set-output name=moderate::$moderate" - echo "::set-output name=high::$high" - echo "::set-output name=critical::$critical" + echo "moderate=$moderate" >> $GITHUB_OUTPUT + echo "high=$high" >> $GITHUB_OUTPUT + echo "critical=$critical" >> $GITHUB_OUTPUT - name: Upload audit report uses: actions/upload-artifact@v4 with: name: server-audit-report path: server-audit.json + retention-days: 7 - name: Create or update PR comment uses: peter-evans/create-or-update-comment@v1 @@ -429,7 +944,6 @@ jobs: Please find the JSON file in the [summary page](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}). - ManualVulnerability-CheckOn-marketplace-code: if: ${{ github.event.action == 'labeled' && (github.event.label.name == 'marketplace-vulnerability' || github.event.label.name == 'check-vulnerability') }} runs-on: ubuntu-latest @@ -438,13 +952,13 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 with: - ref: ${{ github.event.pull_request.head.ref }} + ref: ${{ github.event.pull_request.head.ref }} - name: Use Node.js 22.15.1 uses: actions/setup-node@v3 with: node-version: 22.15.1 - + - name: Install dependencies run: npm --prefix marketplace install @@ -459,15 +973,16 @@ jobs: moderate=$(echo $vulnerabilities | jq '.moderate') high=$(echo $vulnerabilities | jq '.high') critical=$(echo $vulnerabilities | jq '.critical') - echo "::set-output name=moderate::$moderate" - echo "::set-output name=high::$high" - echo "::set-output name=critical::$critical" + echo "moderate=$moderate" >> $GITHUB_OUTPUT + echo "high=$high" >> $GITHUB_OUTPUT + echo "critical=$critical" >> $GITHUB_OUTPUT - name: Upload audit report uses: actions/upload-artifact@v4 with: name: marketplace-audit-report path: marketplace-audit.json + retention-days: 7 - name: Create or update PR comment uses: peter-evans/create-or-update-comment@v1 @@ -484,21 +999,20 @@ jobs: Please find the JSON file in the [summary page](${{ github.marketplace_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}). - ManualVulnerability-CheckOn-plugins-code: if: ${{ github.event.action == 'labeled' && (github.event.label.name == 'plugins-vulnerability' || github.event.label.name == 'check-vulnerability') }} - runs-on: ubuntu-latest + runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v3 with: - ref: ${{ github.event.pull_request.head.ref }} + ref: ${{ github.event.pull_request.head.ref }} - name: Use Node.js 22.15.1 uses: actions/setup-node@v3 with: node-version: 22.15.1 - + - name: Install dependencies run: npm --prefix plugins install @@ -513,15 +1027,16 @@ jobs: moderate=$(echo $vulnerabilities | jq '.moderate') high=$(echo $vulnerabilities | jq '.high') critical=$(echo $vulnerabilities | jq '.critical') - echo "::set-output name=moderate::$moderate" - echo "::set-output name=high::$high" - echo "::set-output name=critical::$critical" + echo "moderate=$moderate" >> $GITHUB_OUTPUT + echo "high=$high" >> $GITHUB_OUTPUT + echo "critical=$critical" >> $GITHUB_OUTPUT - name: Upload audit report uses: actions/upload-artifact@v4 with: name: plugins-audit-report path: plugins-audit.json + retention-days: 7 - name: Create or update PR comment uses: peter-evans/create-or-update-comment@v1 @@ -538,64 +1053,6 @@ jobs: Please find the JSON file in the [summary page](${{ github.plugins_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}). - - - ManualVulnerability-CheckOn-cypress-code: - if: ${{ github.event.action == 'labeled' && (github.event.label.name == 'cypress-vulnerability' || github.event.label.name == 'check-vulnerability') }} - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - with: - ref: ${{ github.event.pull_request.head.ref }} - - - name: Use Node.js 22.15.1 - uses: actions/setup-node@v3 - with: - node-version: 22.15.1 - - - name: Install dependencies - run: npm --prefix cypress-tests install - - - name: Running security audit - run: npm --prefix cypress-tests audit --json > cypress-audit.json - continue-on-error: true - - - name: Parse audit summary - id: parse-audit - run: | - vulnerabilities=$(jq '.metadata.vulnerabilities' cypress-audit.json) - moderate=$(echo $vulnerabilities | jq '.moderate') - high=$(echo $vulnerabilities | jq '.high') - critical=$(echo $vulnerabilities | jq '.critical') - echo "::set-output name=moderate::$moderate" - echo "::set-output name=high::$high" - echo "::set-output name=critical::$critical" - - - name: Upload audit report - uses: actions/upload-artifact@v4 - with: - name: cypress-audit-report - path: cypress-audit.json - - - name: Create or update PR comment - uses: peter-evans/create-or-update-comment@v1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - repository: ${{ github.repository }} - issue-number: ${{ github.event.pull_request.number }} - body: | - ### Security Audit Report Of Cypress directory - **Node module vulnerabilities summary:** - ๐Ÿ”ด Critical: ${{ steps.parse-audit.outputs.critical }} - ๐ŸŸ  High: ${{ steps.parse-audit.outputs.high }} - ๐ŸŸก Moderate: ${{ steps.parse-audit.outputs.moderate }} - - Please find the JSON file in the [summary page](${{ github.cypress_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}). - - - ManualVulnerability-CheckOn-root-code: if: ${{ github.event.action == 'labeled' && (github.event.label.name == 'root-vulnerability' || github.event.label.name == 'check-vulnerability') }} runs-on: ubuntu-latest @@ -604,13 +1061,13 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 with: - ref: ${{ github.event.pull_request.head.ref }} + ref: ${{ github.event.pull_request.head.ref }} - name: Use Node.js 22.15.1 uses: actions/setup-node@v3 with: node-version: 22.15.1 - + - name: Install dependencies run: npm install @@ -625,15 +1082,16 @@ jobs: moderate=$(echo $vulnerabilities | jq '.moderate') high=$(echo $vulnerabilities | jq '.high') critical=$(echo $vulnerabilities | jq '.critical') - echo "::set-output name=moderate::$moderate" - echo "::set-output name=high::$high" - echo "::set-output name=critical::$critical" + echo "moderate=$moderate" >> $GITHUB_OUTPUT + echo "high=$high" >> $GITHUB_OUTPUT + echo "critical=$critical" >> $GITHUB_OUTPUT - name: Upload audit report uses: actions/upload-artifact@v4 with: name: root-audit-report path: root-audit.json + retention-days: 7 - name: Create or update PR comment uses: peter-evans/create-or-update-comment@v1 diff --git a/docs/docs/setup/tooljet-domain-change.md b/docs/docs/setup/tooljet-domain-change.md new file mode 100644 index 0000000000..98a42aa364 --- /dev/null +++ b/docs/docs/setup/tooljet-domain-change.md @@ -0,0 +1,46 @@ +--- +id: tooljet-domain-change +title: ToolJet Domain Change +--- + +We're updating our domain from `tooljet.ai` to `tooljet.com`. + +## When is This Happening? + +The change will take place at the following times: + +- **ET (Eastern Time):** Sunday, November 23, 2025 โ€“ 11:00 PM +- **PT (Pacific Time):** Sunday, November 23, 2025 โ€“ 8:00 PM +- **GMT (Greenwich Mean Time):** Monday, November 24, 2025 โ€“ 4:00 AM +- **IST (Indian Standard Time):** Monday, November 24, 2025 โ€“ 9:30 AM + +## What This Means For You + +If your organization uses **Single Sign-On (SSO)** to access ToolJet, youโ€™ll need to update your SSO redirect URLs to continue signing in after the domain change. + +- This change is **only applicable to ToolJet Cloud** users. +- If you do **not** update your SSO configuration, **SSO login will stop working** after the domain change. + +## How to Fix it + +Youโ€™ll need to regenerate and update the redirect URL for **each SSO provider** you have configured. + +### Steps + +1. Log in to ToolJet at **`https://app.tooljet.com`**. +2. Go to: **Workspace settings โ†’ Workspace login**. +3. Under SSO providers (Google, OIDC, SAML, etc.): + - Click on each configured provider. + - Copy the new redirect URL (it will now contain `tooljet.com` instead of `tooljet.ai`). +4. Go to your SSO providerโ€™s admin console (e.g., Google, Okta, Azure AD). +5. Update the redirect/callback URL with the new **`tooljet.com`** URL. +6. Save the changes. +7. Test SSO login to ensure everything is working correctly. + +For provider-specific configuration details, refer to your usual **[SSO](/docs/user-management/sso/overview)** setup guides. + +## When to Update + +To ensure uninterrupted access for your team, **please complete this update by Sunday, November 23, 2025, at 8:00 PM** (aligned with your relevant timezone in the schedule above). + +If the redirect URLs are not updated before the domain change window, users relying on SSO will not be able to sign in until the configuration is updated. diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index df4f725e1f..f747937a9f 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -16,7 +16,7 @@ const isProd = process.env.NODE_ENV === 'production'; module.exports = { title: 'ToolJet', tagline: 'Low-code framework to Build internal tools and business apps.', - url: 'https://docs.tooljet.ai', + url: 'https://docs.tooljet.com', baseUrl: '/', onBrokenLinks: 'ignore', onBrokenMarkdownLinks: 'warn', @@ -60,21 +60,21 @@ module.exports = { position: 'right', }, { - href: 'https://www.tooljet.ai/', + href: 'https://www.tooljet.com/', position: 'right', label: 'Website', className: 'navbar-signin', 'aria-label': 'Visit ToolJet Website', }, { - href: 'https://www.tooljet.ai/login', + href: 'https://www.tooljet.com/login', position: 'right', label: 'Sign in', className: 'navbar-signin', 'aria-label': 'Signin to ToolJet', }, { - href: 'https://www.tooljet.ai/create-account', + href: 'https://www.tooljet.com/create-account', position: 'right', label: 'Try for free', className: 'navbar-website', @@ -83,7 +83,7 @@ module.exports = { ], }, footer: { - style: 'light', + style: 'light', logo: { alt: 'ToolJet Logo', src: '/img/docs_logo.svg', @@ -93,35 +93,35 @@ module.exports = { { title: 'Platform', items: [ - { label: 'App builder', to: 'https://www.tooljet.ai/visual-app-builder' }, - { label: 'AI Agent builder', to: 'https://www.tooljet.ai/ai-agent-builder' }, - { label: 'ToolJet Database', to: 'https://www.tooljet.ai/database' }, + { label: 'App builder', to: 'https://www.tooljet.com/visual-app-builder' }, + { label: 'AI Agent builder', to: 'https://www.tooljet.com/ai-agent-builder' }, + { label: 'ToolJet Database', to: 'https://www.tooljet.com/database' }, ], }, { title: 'Solutions', items: [ - { label: 'Back office tools', to: 'https://www.tooljet.ai/building-back-office-apps' }, - { label: 'Business applications', to: 'https://www.tooljet.ai/business-applications' }, + { label: 'Back office tools', to: 'https://www.tooljet.com/building-back-office-apps' }, + { label: 'Business applications', to: 'https://www.tooljet.com/business-applications' }, ], }, { title: 'Developers', items: [ - { label: 'Blogs', to: 'https://blog.tooljet.ai/' }, - { label: 'Events', to: 'https://www.tooljet.ai/events' }, + { label: 'Blogs', to: 'https://blog.tooljet.com/' }, + { label: 'Events', to: 'https://www.tooljet.com/events' }, { label: 'GitHub', href: 'https://github.com/ToolJet/ToolJet' }, - { label: 'Slack', href: 'https://tooljet.ai/slack' }, + { label: 'Slack', href: 'https://tooljet.com/slack' }, ], }, { title: 'Templates', items: [ - { label: 'Lead management', to: 'https://www.tooljet.ai/templates/lead-management-system' }, - { label: 'KPI management', to: 'https://www.tooljet.ai/templates/kpi-management-dashboard' }, - { label: 'Inventory management', to: 'https://www.tooljet.ai/templates/inventory-management-system' }, - { label: 'Leave management', to: 'https://www.tooljet.ai/templates/leave-management-portal' }, - { label: 'Applicant tracking', to: 'https://www.tooljet.ai/templates/applicant-tracking-system' }, + { label: 'Lead management', to: 'https://www.tooljet.com/templates/lead-management-system' }, + { label: 'KPI management', to: 'https://www.tooljet.com/templates/kpi-management-dashboard' }, + { label: 'Inventory management', to: 'https://www.tooljet.com/templates/inventory-management-system' }, + { label: 'Leave management', to: 'https://www.tooljet.com/templates/leave-management-portal' }, + { label: 'Applicant tracking', to: 'https://www.tooljet.com/templates/applicant-tracking-system' }, ], }, { @@ -242,8 +242,41 @@ module.exports = { window.buildUrlWithStoredParams = buildUrlWithStoredParams; // NEW: Build URLs with UTM params })(); + + + + `, - }, + }, algolia: { appId: 'O8HQRLI0WA', apiKey: process.env.ALGOLIA_API_KEY || 'development', // Public API key: it is safe to commit it @@ -298,6 +331,7 @@ module.exports = { ignorePatterns: ['/docs/1.x.x/**'], filename: 'sitemap.xml', }, + googleTagManager: isProd ? { containerId: process.env.GTM || 'development', @@ -305,6 +339,18 @@ module.exports = { : undefined, }, ], + [ + 'redocusaurus', + { + openapi: { + path: 'openapi', // scans all folders inside openapi/, e.g., scim, tj-api + routeBasePath: '/api', // pages will be /api/scim, /api/tj-api + }, + theme: { + primaryColor: '#1890ff', // customize the color + }, + }, + ], ], plugins: [ devServerPlugin, diff --git a/docs/openapi/scim/index.openapi.yaml b/docs/openapi/scim/index.openapi.yaml new file mode 100644 index 0000000000..a2c7e425f5 --- /dev/null +++ b/docs/openapi/scim/index.openapi.yaml @@ -0,0 +1,419 @@ +openapi: 3.0.3 +info: + title: ToolJet SCIM API + version: 1.0.0 + description: > + ToolJet supports SCIM 2.0 for automated user and group provisioning. + All standard SCIM endpoints are supported โ€” including `/Schemas`, `/ResourceTypes`, `/Users`, and `/Groups`. + +servers: + - url: https://app.tooljet.com/api/scim/v2 + description: Production server + - url: http://localhost:3000/api/scim/v2 + description: Local development server + +paths: + + /Users: + get: + summary: List Users + responses: + "200": + description: List of users + content: + application/scim+json: + schema: + $ref: '#/components/schemas/SCIMListResponse' + post: + summary: Create User + requestBody: + required: true + content: + application/scim+json: + schema: + $ref: '#/components/schemas/SCIMUserRequest' + responses: + "201": + description: User created + content: + application/scim+json: + schema: + $ref: '#/components/schemas/SCIMUserResponse' + + /Users/{id}: + get: + summary: Get User by ID + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + "200": + description: User details + content: + application/scim+json: + schema: + $ref: '#/components/schemas/SCIMUserResponse' + put: + summary: Replace User + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/scim+json: + schema: + $ref: '#/components/schemas/SCIMUserRequest' + responses: + "200": + description: Updated user + content: + application/scim+json: + schema: + $ref: '#/components/schemas/SCIMUserResponse' + patch: + summary: Patch User + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/scim+json: + schema: + $ref: '#/components/schemas/SCIMPatchRequest' + responses: + "200": + description: User updated + content: + application/scim+json: + schema: + $ref: '#/components/schemas/SCIMUserResponse' + delete: + summary: Delete User + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + "204": + description: User deleted + + /Groups: + get: + summary: List Groups + responses: + "200": + description: List of groups + content: + application/scim+json: + schema: + $ref: '#/components/schemas/SCIMGroupListResponse' + post: + summary: Create Group + requestBody: + required: true + content: + application/scim+json: + schema: + $ref: '#/components/schemas/SCIMGroupRequest' + responses: + "201": + description: Group created + content: + application/scim+json: + schema: + $ref: '#/components/schemas/SCIMGroupResponse' + + /Groups/{id}: + get: + summary: Get Group by ID + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + "200": + description: Group details + content: + application/scim+json: + schema: + $ref: '#/components/schemas/SCIMGroupResponse' + put: + summary: Replace Group + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/scim+json: + schema: + $ref: '#/components/schemas/SCIMGroupRequest' + responses: + "200": + description: Group updated + content: + application/scim+json: + schema: + $ref: '#/components/schemas/SCIMGroupResponse' + patch: + summary: Patch Group + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/scim+json: + schema: + $ref: '#/components/schemas/SCIMPatchRequest' + responses: + "200": + description: Group updated + content: + application/scim+json: + schema: + $ref: '#/components/schemas/SCIMGroupResponse' + delete: + summary: Delete Group + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + "204": + description: Group deleted + +components: + schemas: + + SCIMUserRequest: + type: object + required: + - schemas + - userName + properties: + schemas: + type: array + items: + type: string + example: + - "urn:ietf:params:scim:schemas:core:2.0:User" + - "urn:ietf:params:scim:schemas:extension:tooljet:User:2.0" + userName: + type: string + name: + type: object + properties: + givenName: + type: string + familyName: + type: string + active: + type: boolean + password: + type: string + description: User password for creation. + emails: + type: array + items: + type: object + properties: + value: + type: string + primary: + type: boolean + type: + type: string + groups: + type: array + items: + type: object + properties: + value: + type: string + display: + type: string + meta: + type: object + properties: + resourceType: + type: string + urn:ietf:params:scim:schemas:extension:tooljet:User:2.0: + type: object + description: ToolJetโ€™s custom SCIM extension (only used in requests) + properties: + role: + type: string + + SCIMUserResponse: + type: object + properties: + schemas: + type: array + items: + type: string + example: + - "urn:ietf:params:scim:schemas:core:2.0:User" + id: + type: string + format: uuid + userName: + type: string + name: + type: object + properties: + givenName: + type: string + familyName: + type: string + active: + type: boolean + emails: + type: array + items: + type: object + properties: + value: + type: string + primary: + type: boolean + type: + type: string + meta: + type: object + properties: + resourceType: + type: string + example: "User" + created: + type: string + format: date-time + lastModified: + type: string + format: date-time + + SCIMListResponse: + type: object + properties: + totalResults: + type: integer + startIndex: + type: integer + itemsPerPage: + type: integer + Resources: + type: array + items: + $ref: '#/components/schemas/SCIMUserResponse' + + SCIMPatchRequest: + type: object + required: + - schemas + - Operations + properties: + schemas: + type: array + items: + type: string + example: + - "urn:ietf:params:scim:api:messages:2.0:PatchOp" + Operations: + type: array + items: + type: object + properties: + op: + type: string + enum: [add, remove, replace] + path: + type: string + value: {} + + SCIMGroupRequest: + type: object + required: + - schemas + - displayName + properties: + schemas: + type: array + items: + type: string + example: + - "urn:ietf:params:scim:schemas:core:2.0:Group" + displayName: + type: string + example: "Developers" + members: + type: array + description: List of User members belonging to this group. + items: + type: object + properties: + value: + type: string + format: uuid + description: User ID + display: + type: string + description: User display name + + + SCIMGroupResponse: + allOf: + - $ref: '#/components/schemas/SCIMGroupRequest' + - type: object + properties: + id: + type: string + format: uuid + meta: + type: object + properties: + resourceType: + type: string + example: "Group" + created: + type: string + format: date-time + lastModified: + type: string + format: date-time + + SCIMGroupListResponse: + type: object + properties: + totalResults: + type: integer + startIndex: + type: integer + itemsPerPage: + type: integer + Resources: + type: array + items: + $ref: '#/components/schemas/SCIMGroupResponse' \ No newline at end of file diff --git a/docs/package-lock.json b/docs/package-lock.json index f23d4145b6..209ac06ec3 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -22,6 +22,7 @@ "prism-react-renderer": "^2.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "redocusaurus": "^2.5.0", "tailwindcss": "^3.4.12" }, "devDependencies": { @@ -3777,6 +3778,29 @@ "node": ">=18.0" } }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@exodus/schemasafe": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", + "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==" + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -4073,6 +4097,77 @@ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==" }, + "node_modules/@redocly/ajv": { + "version": "8.11.4", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.4.tgz", + "integrity": "sha512-77MhyFgZ1zGMwtCpqsk532SJEc3IJmSOXKTCeWoMTAvPnQOkuOgxEip1n5pG5YX1IzCTJ4kCvPKr8xYyzWFdhg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js-replace": "^1.0.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@redocly/ajv/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/@redocly/config": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.6.3.tgz", + "integrity": "sha512-hGWJgCsXRw0Ow4rplqRlUQifZvoSwZipkYnt11e3SeH1Eb23VUIDBcRuaQOUqy1wn0eevXkU2GzzQ8fbKdQ7Mg==" + }, + "node_modules/@redocly/openapi-core": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.16.0.tgz", + "integrity": "sha512-z06h+svyqbUcdAaePq8LPSwTPlm6Ig7j2VlL8skPBYnJvyaQ2IN7x/JkOvRL4ta+wcOCBdAex5JWnZbKaNktJg==", + "dependencies": { + "@redocly/ajv": "^8.11.0", + "@redocly/config": "^0.6.0", + "colorette": "^1.2.0", + "https-proxy-agent": "^7.0.4", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "lodash.isequal": "^4.5.0", + "minimatch": "^5.0.1", + "node-fetch": "^2.6.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=14.19.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" + }, + "node_modules/@redocly/openapi-core/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@sideway/address": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", @@ -4702,6 +4797,17 @@ "@types/node": "*" } }, + "node_modules/@types/stylis": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", + "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "optional": true + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -4921,6 +5027,14 @@ "node": ">= 0.12.0" } }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "engines": { + "node": ">= 14" + } + }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -5567,6 +5681,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -5603,6 +5722,14 @@ "node": ">= 6" } }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -5785,6 +5912,11 @@ "node": ">=8" } }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, "node_modules/clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", @@ -5829,6 +5961,35 @@ "@colors/colors": "1.5.0" } }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -6237,6 +6398,14 @@ "node": ">=4" } }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "engines": { + "node": ">=4" + } + }, "node_modules/css-declaration-sorter": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", @@ -6459,6 +6628,16 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/css-tree": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", @@ -6632,9 +6811,9 @@ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" }, "node_modules/csstype": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", - "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/debounce": { "version": "1.2.1", @@ -6657,6 +6836,11 @@ } } }, + "node_modules/decko": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decko/-/decko-1.2.0.tgz", + "integrity": "sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==" + }, "node_modules/decode-named-character-reference": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", @@ -6906,6 +7090,51 @@ "node": ">=6" } }, + "node_modules/docusaurus-plugin-redoc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-redoc/-/docusaurus-plugin-redoc-2.5.0.tgz", + "integrity": "sha512-44sDhuXvItHnUuPdKswF3cRhiN5UW3YZxmMBsQLSfCYKcYr9tgWF2qvDfQoZO9i1DwpaYbIZ/RKMrSgny/iWYA==", + "dependencies": { + "@redocly/openapi-core": "1.16.0", + "redoc": "2.4.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@docusaurus/utils": "^3.6.0" + } + }, + "node_modules/docusaurus-theme-redoc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/docusaurus-theme-redoc/-/docusaurus-theme-redoc-2.5.0.tgz", + "integrity": "sha512-ykLmnnvE20Im3eABlIpUnXnT2gSHVAjgyy2fU2G8yecu7zqIE+G/SiBpBg/hrWMUycL31a8VSG7Ehkf3pg1u+A==", + "dependencies": { + "@redocly/openapi-core": "1.16.0", + "clsx": "^1.2.1", + "lodash": "^4.17.21", + "mobx": "^6.12.4", + "postcss": "^8.4.45", + "postcss-prefix-selector": "^1.16.1", + "redoc": "2.4.0", + "styled-components": "^6.1.11" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^3.6.0", + "webpack": "^5.0.0" + } + }, + "node_modules/docusaurus-theme-redoc/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -6952,6 +7181,14 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/dompurify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.0.tgz", + "integrity": "sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, "node_modules/domutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", @@ -7106,6 +7343,11 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==" }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==" + }, "node_modules/esast-util-from-estree": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", @@ -7529,6 +7771,28 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fast-xml-parser": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", + "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^1.1.1" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastq": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", @@ -7735,6 +7999,11 @@ } } }, + "node_modules/foreach": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==" + }, "node_modules/foreground-child": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", @@ -7960,6 +8229,14 @@ "node": ">=6.9.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -8741,6 +9018,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/http2-client": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==" + }, "node_modules/http2-wrapper": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", @@ -8753,6 +9035,18 @@ "node": ">=10.19.0" } }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -9265,6 +9559,14 @@ "@sideway/pinpoint": "^2.0.0" } }, + "node_modules/js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9302,6 +9604,14 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, + "node_modules/json-pointer": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", + "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", + "dependencies": { + "foreach": "^2.0.4" + } + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -9445,6 +9755,12 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead." + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -9513,6 +9829,16 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" } }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==" + }, "node_modules/markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", @@ -9533,6 +9859,17 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/mdast-util-directive": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", @@ -11770,6 +12107,63 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/mobx": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.15.0.tgz", + "integrity": "sha512-UczzB+0nnwGotYSgllfARAqWCJ5e/skuV2K/l+Zyck/H6pJIhLXuBnz+6vn2i211o7DtbE78HQtsYEKICHGI+g==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + } + }, + "node_modules/mobx-react": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-9.2.1.tgz", + "integrity": "sha512-WJNNm0FB2n0Z0u+jS1QHmmWyV8l2WiAj8V8I/96kbUEN2YbYCoKW+hbbqKKRUBqElu0llxM7nWKehvRIkhBVJw==", + "dependencies": { + "mobx-react-lite": "^4.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.9.0", + "react": "^16.8.0 || ^17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/mobx-react-lite": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-4.1.1.tgz", + "integrity": "sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==", + "dependencies": { + "use-sync-external-store": "^1.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.9.0", + "react": "^16.8.0 || ^17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -11858,6 +12252,36 @@ "node": ">=18" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-h2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", + "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", + "dependencies": { + "http2-client": "^1.2.5" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -11866,6 +12290,14 @@ "node": ">= 6.13.0" } }, + "node_modules/node-readfiles": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", + "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", + "dependencies": { + "es6-promise": "^3.2.1" + } + }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", @@ -11950,6 +12382,71 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/oas-kit-common": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", + "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/oas-linter": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", + "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", + "dependencies": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-resolver": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", + "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-schema-walker": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", + "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", + "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", + "dependencies": { + "call-me-maybe": "^1.0.1", + "oas-kit-common": "^1.0.8", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "reftools": "^1.1.9", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -12061,6 +12558,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openapi-sampler": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.6.2.tgz", + "integrity": "sha512-NyKGiFKfSWAZr4srD/5WDhInOWDhfml32h/FKUqLpEwKJt0kG0LGUU0MdyNkKrVGuJnw6DuPWq/sHCwAMpiRxg==", + "dependencies": { + "@types/json-schema": "^7.0.7", + "fast-xml-parser": "^4.5.0", + "json-pointer": "0.6.2" + } + }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -12281,6 +12788,11 @@ "tslib": "^2.0.3" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, "node_modules/path-exists": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", @@ -12348,6 +12860,11 @@ "node": ">=8" } }, + "node_modules/perfect-scrollbar": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.6.tgz", + "integrity": "sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -12469,6 +12986,25 @@ "medium-zoom": "^1.0.8" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/polished": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", + "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", @@ -13680,6 +14216,14 @@ "postcss": "^8.4" } }, + "node_modules/postcss-prefix-selector": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.1.tgz", + "integrity": "sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==", + "peerDependencies": { + "postcss": ">4 <9" + } + }, "node_modules/postcss-preset-env": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.1.tgz", @@ -14015,13 +14559,13 @@ } }, "node_modules/prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", - "react-is": "^16.8.1" + "react-is": "^16.13.1" } }, "node_modules/property-information": { @@ -14477,6 +15021,18 @@ "isarray": "0.0.1" } }, + "node_modules/react-tabs": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-6.1.0.tgz", + "integrity": "sha512-6QtbTRDKM+jA/MZTTefvigNxo0zz+gnBTVFw2CFVvq+f2BuH0nF0vDLNClL045nuTAdOoK/IL1vTP0ZLX0DAyQ==", + "dependencies": { + "clsx": "^2.0.0", + "prop-types": "^15.5.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -14596,6 +15152,74 @@ "node": ">=6.0.0" } }, + "node_modules/redoc": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/redoc/-/redoc-2.4.0.tgz", + "integrity": "sha512-rFlfzFVWS9XJ6aYAs/bHnLhHP5FQEhwAHDBVgwb9L2FqDQ8Hu8rQ1G84iwaWXxZfPP9UWn7JdWkxI6MXr2ZDjw==", + "dependencies": { + "@redocly/openapi-core": "^1.4.0", + "classnames": "^2.3.2", + "decko": "^1.2.0", + "dompurify": "^3.0.6", + "eventemitter3": "^5.0.1", + "json-pointer": "^0.6.2", + "lunr": "^2.3.9", + "mark.js": "^8.11.1", + "marked": "^4.3.0", + "mobx-react": "^9.1.1", + "openapi-sampler": "^1.5.0", + "path-browserify": "^1.0.1", + "perfect-scrollbar": "^1.5.5", + "polished": "^4.2.2", + "prismjs": "^1.29.0", + "prop-types": "^15.8.1", + "react-tabs": "^6.0.2", + "slugify": "~1.4.7", + "stickyfill": "^1.1.1", + "swagger2openapi": "^7.0.8", + "url-template": "^2.0.8" + }, + "engines": { + "node": ">=6.9", + "npm": ">=3.0.0" + }, + "peerDependencies": { + "core-js": "^3.1.4", + "mobx": "^6.0.4", + "react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "styled-components": "^4.1.1 || ^5.1.1 || ^6.0.5" + } + }, + "node_modules/redoc/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/redocusaurus": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/redocusaurus/-/redocusaurus-2.5.0.tgz", + "integrity": "sha512-QWJX2hgnEfSDb7fZzS4iZe6aqdAvm/XLCsNv6RkgDw6Pl/lsTZKipP2n1r5QS1CC5hY8eAwsjVXeF7B03vkz2g==", + "dependencies": { + "docusaurus-plugin-redoc": "2.5.0", + "docusaurus-theme-redoc": "2.5.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^3.6.0", + "@docusaurus/utils": "^3.6.0" + } + }, + "node_modules/reftools": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", + "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -14939,6 +15563,14 @@ "node": ">=0.10" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -15480,6 +16112,54 @@ "node": ">=4" } }, + "node_modules/should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "dependencies": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "node_modules/should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "dependencies": { + "should-type": "^1.4.0" + } + }, + "node_modules/should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", + "dependencies": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "node_modules/should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==" + }, + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "dependencies": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "node_modules/should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==" + }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", @@ -15557,6 +16237,14 @@ "node": ">=8" } }, + "node_modules/slugify": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.7.tgz", + "integrity": "sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", @@ -15675,6 +16363,11 @@ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==" }, + "node_modules/stickyfill": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stickyfill/-/stickyfill-1.1.1.tgz", + "integrity": "sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==" + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -15703,13 +16396,13 @@ ] }, "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" @@ -15805,6 +16498,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ] + }, "node_modules/style-to-object": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", @@ -15813,6 +16517,33 @@ "inline-style-parser": "0.2.4" } }, + "node_modules/styled-components": { + "version": "6.1.19", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.19.tgz", + "integrity": "sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA==", + "dependencies": { + "@emotion/is-prop-valid": "1.2.2", + "@emotion/unitless": "0.8.1", + "@types/stylis": "4.2.5", + "css-to-react-native": "3.2.0", + "csstype": "3.1.3", + "postcss": "8.4.49", + "shallowequal": "1.1.0", + "stylis": "4.3.2", + "tslib": "2.6.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + } + }, "node_modules/stylehacks": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", @@ -15828,6 +16559,11 @@ "postcss": "^8.4.31" } }, + "node_modules/stylis": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -15957,6 +16693,32 @@ "node": ">= 10" } }, + "node_modules/swagger2openapi": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", + "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", + "dependencies": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "node-fetch-h2": "^2.3.0", + "node-readfiles": "^0.2.0", + "oas-kit-common": "^1.0.8", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "boast": "boast.js", + "oas-validate": "oas-validate.js", + "swagger2openapi": "swagger2openapi.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, "node_modules/tailwindcss": { "version": "3.4.12", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.12.tgz", @@ -16158,6 +16920,11 @@ "node": ">=6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -16575,6 +17342,11 @@ "punycode": "^2.1.0" } }, + "node_modules/uri-js-replace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", + "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==" + }, "node_modules/url-loader": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", @@ -16618,6 +17390,19 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==" + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16733,6 +17518,11 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, "node_modules/webpack": { "version": "5.96.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", @@ -17024,6 +17814,15 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -17251,6 +18050,14 @@ "xml-js": "bin/cli.js" } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -17264,6 +18071,36 @@ "node": ">= 6" } }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, "node_modules/yocto-queue": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", @@ -19601,6 +20438,29 @@ "tslib": "^2.6.0" } }, + "@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "requires": { + "@emotion/memoize": "^0.8.1" + } + }, + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "@exodus/schemasafe": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", + "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==" + }, "@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -19829,6 +20689,70 @@ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==" }, + "@redocly/ajv": { + "version": "8.11.4", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.4.tgz", + "integrity": "sha512-77MhyFgZ1zGMwtCpqsk532SJEc3IJmSOXKTCeWoMTAvPnQOkuOgxEip1n5pG5YX1IzCTJ4kCvPKr8xYyzWFdhg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js-replace": "^1.0.1" + }, + "dependencies": { + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } + }, + "@redocly/config": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.6.3.tgz", + "integrity": "sha512-hGWJgCsXRw0Ow4rplqRlUQifZvoSwZipkYnt11e3SeH1Eb23VUIDBcRuaQOUqy1wn0eevXkU2GzzQ8fbKdQ7Mg==" + }, + "@redocly/openapi-core": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.16.0.tgz", + "integrity": "sha512-z06h+svyqbUcdAaePq8LPSwTPlm6Ig7j2VlL8skPBYnJvyaQ2IN7x/JkOvRL4ta+wcOCBdAex5JWnZbKaNktJg==", + "requires": { + "@redocly/ajv": "^8.11.0", + "@redocly/config": "^0.6.0", + "colorette": "^1.2.0", + "https-proxy-agent": "^7.0.4", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "lodash.isequal": "^4.5.0", + "minimatch": "^5.0.1", + "node-fetch": "^2.6.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "@sideway/address": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", @@ -20323,6 +21247,17 @@ "@types/node": "*" } }, + "@types/stylis": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", + "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==" + }, + "@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "optional": true + }, "@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -20525,6 +21460,11 @@ "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" }, + "agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==" + }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -20990,6 +21930,11 @@ "set-function-length": "^1.2.1" } }, + "call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -21014,6 +21959,11 @@ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" }, + "camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==" + }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -21121,6 +22071,11 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" }, + "classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, "clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", @@ -21148,6 +22103,28 @@ "string-width": "^4.2.0" } }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, "clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -21425,6 +22402,11 @@ } } }, + "css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==" + }, "css-declaration-sorter": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", @@ -21532,6 +22514,16 @@ "nth-check": "^2.0.1" } }, + "css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "requires": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "css-tree": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", @@ -21647,9 +22639,9 @@ } }, "csstype": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", - "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "debounce": { "version": "1.2.1", @@ -21664,6 +22656,11 @@ "ms": "2.1.2" } }, + "decko": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decko/-/decko-1.2.0.tgz", + "integrity": "sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==" + }, "decode-named-character-reference": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", @@ -21837,6 +22834,37 @@ "@leichtgewicht/ip-codec": "^2.0.1" } }, + "docusaurus-plugin-redoc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-redoc/-/docusaurus-plugin-redoc-2.5.0.tgz", + "integrity": "sha512-44sDhuXvItHnUuPdKswF3cRhiN5UW3YZxmMBsQLSfCYKcYr9tgWF2qvDfQoZO9i1DwpaYbIZ/RKMrSgny/iWYA==", + "requires": { + "@redocly/openapi-core": "1.16.0", + "redoc": "2.4.0" + } + }, + "docusaurus-theme-redoc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/docusaurus-theme-redoc/-/docusaurus-theme-redoc-2.5.0.tgz", + "integrity": "sha512-ykLmnnvE20Im3eABlIpUnXnT2gSHVAjgyy2fU2G8yecu7zqIE+G/SiBpBg/hrWMUycL31a8VSG7Ehkf3pg1u+A==", + "requires": { + "@redocly/openapi-core": "1.16.0", + "clsx": "^1.2.1", + "lodash": "^4.17.21", + "mobx": "^6.12.4", + "postcss": "^8.4.45", + "postcss-prefix-selector": "^1.16.1", + "redoc": "2.4.0", + "styled-components": "^6.1.11" + }, + "dependencies": { + "clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" + } + } + }, "dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -21868,6 +22896,14 @@ "domelementtype": "^2.3.0" } }, + "dompurify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.0.tgz", + "integrity": "sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==", + "requires": { + "@types/trusted-types": "^2.0.7" + } + }, "domutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", @@ -21987,6 +23023,11 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==" }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==" + }, "esast-util-from-estree": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", @@ -22294,6 +23335,19 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "fast-xml-parser": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", + "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "requires": { + "strnum": "^1.1.1" + } + }, "fastq": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", @@ -22432,6 +23486,11 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, + "foreach": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==" + }, "foreground-child": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", @@ -22574,6 +23633,11 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, "get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -23149,6 +24213,11 @@ } } }, + "http2-client": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==" + }, "http2-wrapper": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", @@ -23158,6 +24227,15 @@ "resolve-alpn": "^1.2.0" } }, + "https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "requires": { + "agent-base": "^7.1.2", + "debug": "4" + } + }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -23501,6 +24579,11 @@ "@sideway/pinpoint": "^2.0.0" } }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -23529,6 +24612,14 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, + "json-pointer": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", + "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", + "requires": { + "foreach": "^2.0.4" + } + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -23631,6 +24722,11 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -23681,6 +24777,16 @@ "integrity": "sha512-N292bIxoqm1aObAg0MzFtvhYwgQE6qnIOWx/GLj5ONgcTPH6N0fD9bVq/GfdeC9ZORBXozt/XeEKDpiB3x3vlQ==", "requires": {} }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" + }, + "mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==" + }, "markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", @@ -23691,6 +24797,11 @@ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==" }, + "marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==" + }, "mdast-util-directive": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", @@ -24959,6 +26070,27 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" }, + "mobx": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.15.0.tgz", + "integrity": "sha512-UczzB+0nnwGotYSgllfARAqWCJ5e/skuV2K/l+Zyck/H6pJIhLXuBnz+6vn2i211o7DtbE78HQtsYEKICHGI+g==" + }, + "mobx-react": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-9.2.1.tgz", + "integrity": "sha512-WJNNm0FB2n0Z0u+jS1QHmmWyV8l2WiAj8V8I/96kbUEN2YbYCoKW+hbbqKKRUBqElu0llxM7nWKehvRIkhBVJw==", + "requires": { + "mobx-react-lite": "^4.1.1" + } + }, + "mobx-react-lite": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-4.1.1.tgz", + "integrity": "sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==", + "requires": { + "use-sync-external-store": "^1.4.0" + } + }, "mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -25023,11 +26155,35 @@ "skin-tone": "^2.0.0" } }, + "node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-fetch-h2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", + "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", + "requires": { + "http2-client": "^1.2.5" + } + }, "node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, + "node-readfiles": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", + "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", + "requires": { + "es6-promise": "^3.2.1" + } + }, "node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", @@ -25085,6 +26241,56 @@ } } }, + "oas-kit-common": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", + "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", + "requires": { + "fast-safe-stringify": "^2.0.7" + } + }, + "oas-linter": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", + "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", + "requires": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" + } + }, + "oas-resolver": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", + "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", + "requires": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + } + }, + "oas-schema-walker": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", + "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==" + }, + "oas-validator": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", + "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", + "requires": { + "call-me-maybe": "^1.0.1", + "oas-kit-common": "^1.0.8", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "reftools": "^1.1.9", + "should": "^13.2.1", + "yaml": "^1.10.0" + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -25160,6 +26366,16 @@ "is-wsl": "^2.2.0" } }, + "openapi-sampler": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.6.2.tgz", + "integrity": "sha512-NyKGiFKfSWAZr4srD/5WDhInOWDhfml32h/FKUqLpEwKJt0kG0LGUU0MdyNkKrVGuJnw6DuPWq/sHCwAMpiRxg==", + "requires": { + "@types/json-schema": "^7.0.7", + "fast-xml-parser": "^4.5.0", + "json-pointer": "0.6.2" + } + }, "opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -25320,6 +26536,11 @@ "tslib": "^2.0.3" } }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, "path-exists": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", @@ -25371,6 +26592,11 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, + "perfect-scrollbar": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.6.tgz", + "integrity": "sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==" + }, "picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -25454,6 +26680,19 @@ "medium-zoom": "^1.0.8" } }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==" + }, + "polished": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", + "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", + "requires": { + "@babel/runtime": "^7.17.8" + } + }, "postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", @@ -26054,6 +27293,12 @@ "postcss-value-parser": "^4.2.0" } }, + "postcss-prefix-selector": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.1.tgz", + "integrity": "sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==", + "requires": {} + }, "postcss-preset-env": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.1.tgz", @@ -26281,13 +27526,13 @@ } }, "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "requires": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", - "react-is": "^16.8.1" + "react-is": "^16.13.1" } }, "property-information": { @@ -26606,6 +27851,15 @@ "tiny-warning": "^1.0.0" } }, + "react-tabs": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-6.1.0.tgz", + "integrity": "sha512-6QtbTRDKM+jA/MZTTefvigNxo0zz+gnBTVFw2CFVvq+f2BuH0nF0vDLNClL045nuTAdOoK/IL1vTP0ZLX0DAyQ==", + "requires": { + "clsx": "^2.0.0", + "prop-types": "^15.5.0" + } + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -26697,6 +27951,55 @@ "minimatch": "^3.0.5" } }, + "redoc": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/redoc/-/redoc-2.4.0.tgz", + "integrity": "sha512-rFlfzFVWS9XJ6aYAs/bHnLhHP5FQEhwAHDBVgwb9L2FqDQ8Hu8rQ1G84iwaWXxZfPP9UWn7JdWkxI6MXr2ZDjw==", + "requires": { + "@redocly/openapi-core": "^1.4.0", + "classnames": "^2.3.2", + "decko": "^1.2.0", + "dompurify": "^3.0.6", + "eventemitter3": "^5.0.1", + "json-pointer": "^0.6.2", + "lunr": "^2.3.9", + "mark.js": "^8.11.1", + "marked": "^4.3.0", + "mobx-react": "^9.1.1", + "openapi-sampler": "^1.5.0", + "path-browserify": "^1.0.1", + "perfect-scrollbar": "^1.5.5", + "polished": "^4.2.2", + "prismjs": "^1.29.0", + "prop-types": "^15.8.1", + "react-tabs": "^6.0.2", + "slugify": "~1.4.7", + "stickyfill": "^1.1.1", + "swagger2openapi": "^7.0.8", + "url-template": "^2.0.8" + }, + "dependencies": { + "eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + } + } + }, + "redocusaurus": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/redocusaurus/-/redocusaurus-2.5.0.tgz", + "integrity": "sha512-QWJX2hgnEfSDb7fZzS4iZe6aqdAvm/XLCsNv6RkgDw6Pl/lsTZKipP2n1r5QS1CC5hY8eAwsjVXeF7B03vkz2g==", + "requires": { + "docusaurus-plugin-redoc": "2.5.0", + "docusaurus-theme-redoc": "2.5.0" + } + }, + "reftools": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", + "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==" + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -26954,6 +28257,11 @@ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -27370,6 +28678,54 @@ "rechoir": "^0.6.2" } }, + "should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "requires": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "requires": { + "should-type": "^1.4.0" + } + }, + "should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", + "requires": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==" + }, + "should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "requires": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==" + }, "side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", @@ -27425,6 +28781,11 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, + "slugify": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.7.tgz", + "integrity": "sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==" + }, "snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", @@ -27518,6 +28879,11 @@ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==" }, + "stickyfill": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stickyfill/-/stickyfill-1.1.1.tgz", + "integrity": "sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==" + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -27534,13 +28900,13 @@ } }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" } }, "string-width-cjs": { @@ -27603,6 +28969,11 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, + "strnum": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==" + }, "style-to-object": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", @@ -27611,6 +28982,22 @@ "inline-style-parser": "0.2.4" } }, + "styled-components": { + "version": "6.1.19", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.19.tgz", + "integrity": "sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA==", + "requires": { + "@emotion/is-prop-valid": "1.2.2", + "@emotion/unitless": "0.8.1", + "@types/stylis": "4.2.5", + "css-to-react-native": "3.2.0", + "csstype": "3.1.3", + "postcss": "8.4.49", + "shallowequal": "1.1.0", + "stylis": "4.3.2", + "tslib": "2.6.2" + } + }, "stylehacks": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", @@ -27620,6 +29007,11 @@ "postcss-selector-parser": "^6.0.16" } }, + "stylis": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" + }, "sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -27709,6 +29101,24 @@ } } }, + "swagger2openapi": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", + "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", + "requires": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "node-fetch-h2": "^2.3.0", + "node-readfiles": "^0.2.0", + "oas-kit-common": "^1.0.8", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + } + }, "tailwindcss": { "version": "3.4.12", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.12.tgz", @@ -27854,6 +29264,11 @@ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==" }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -28120,6 +29535,11 @@ "punycode": "^2.1.0" } }, + "uri-js-replace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", + "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==" + }, "url-loader": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", @@ -28142,6 +29562,17 @@ } } }, + "url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==" + }, + "use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "requires": {} + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -28226,6 +29657,11 @@ "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==" }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, "webpack": { "version": "5.96.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", @@ -28421,6 +29857,15 @@ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -28562,6 +30007,11 @@ "sax": "^1.2.4" } }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -28572,6 +30022,30 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, + "yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==" + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + }, "yocto-queue": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", diff --git a/docs/package.json b/docs/package.json index 1c537597d1..184223666d 100644 --- a/docs/package.json +++ b/docs/package.json @@ -28,6 +28,7 @@ "prism-react-renderer": "^2.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "redocusaurus": "^2.5.0", "tailwindcss": "^3.4.12" }, "devDependencies": { diff --git a/docs/sidebars.js b/docs/sidebars.js index 975dd80438..676cee20a5 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -86,7 +86,7 @@ const sidebars = { 'setup/upgrade-to-v3', 'setup/cloud-v3-migration', 'setup/upgrade-to-v3.16', - + 'setup/tooljet-domain-change' ] } ], diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index f1dcf1bf18..81455c932b 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -967,3 +967,24 @@ button[title="Switch between dark and light mode (currently light mode)"] svg, .footer { padding: 0px 70px !important; } + +.sc-kSaXSp.dkiBl { /* This hides the redocly branding at the bottom on the API pages.*/ + visibility: hidden; +} + +.jcDBan { + border: 0px !important; + margin-left: 0px !important; +} + +.gHrCVQ { + padding: 30px 0 !important; +} + +.hgujxv { + margin: 0 !important; +} + +.sc-dTvVRJ { + padding: 10px 0px !important; +} \ No newline at end of file diff --git a/docs/static/img/datasource-reference/bigquery/bq-create-v3.png b/docs/static/img/datasource-reference/bigquery/bq-create-v3.png new file mode 100644 index 0000000000..31550188b1 Binary files /dev/null and b/docs/static/img/datasource-reference/bigquery/bq-create-v3.png differ diff --git a/docs/static/img/datasource-reference/snowflake/snowflake-connect-v4.png b/docs/static/img/datasource-reference/snowflake/snowflake-connect-v4.png new file mode 100644 index 0000000000..bc24509957 Binary files /dev/null and b/docs/static/img/datasource-reference/snowflake/snowflake-connect-v4.png differ diff --git a/docs/static/img/development-lifecycle/branching/branch-name-modal.png b/docs/static/img/development-lifecycle/branching/branch-name-modal.png new file mode 100644 index 0000000000..25801d58dc Binary files /dev/null and b/docs/static/img/development-lifecycle/branching/branch-name-modal.png differ diff --git a/docs/static/img/development-lifecycle/branching/commit-changes.png b/docs/static/img/development-lifecycle/branching/commit-changes.png new file mode 100644 index 0000000000..5eb06372c4 Binary files /dev/null and b/docs/static/img/development-lifecycle/branching/commit-changes.png differ diff --git a/docs/static/img/development-lifecycle/branching/new-branch-modal.png b/docs/static/img/development-lifecycle/branching/new-branch-modal.png new file mode 100644 index 0000000000..f4bd08c815 Binary files /dev/null and b/docs/static/img/development-lifecycle/branching/new-branch-modal.png differ diff --git a/docs/static/img/development-lifecycle/branching/pr-button.png b/docs/static/img/development-lifecycle/branching/pr-button.png new file mode 100644 index 0000000000..3342e9fa06 Binary files /dev/null and b/docs/static/img/development-lifecycle/branching/pr-button.png differ diff --git a/docs/static/img/marketplace/plugins/gmail/connection-v2.png b/docs/static/img/marketplace/plugins/gmail/connection-v2.png new file mode 100644 index 0000000000..e08b717965 Binary files /dev/null and b/docs/static/img/marketplace/plugins/gmail/connection-v2.png differ diff --git a/docs/static/img/marketplace/plugins/googlecal/connection-v2.png b/docs/static/img/marketplace/plugins/googlecal/connection-v2.png new file mode 100644 index 0000000000..6f467f929d Binary files /dev/null and b/docs/static/img/marketplace/plugins/googlecal/connection-v2.png differ diff --git a/docs/static/img/marketplace/plugins/hubspot/config-v2.png b/docs/static/img/marketplace/plugins/hubspot/config-v2.png new file mode 100644 index 0000000000..aaf118ad9b Binary files /dev/null and b/docs/static/img/marketplace/plugins/hubspot/config-v2.png differ diff --git a/docs/static/img/marketplace/plugins/microsoft-graph/connection-v2.png b/docs/static/img/marketplace/plugins/microsoft-graph/connection-v2.png new file mode 100644 index 0000000000..531cf49f31 Binary files /dev/null and b/docs/static/img/marketplace/plugins/microsoft-graph/connection-v2.png differ diff --git a/docs/static/img/marketplace/plugins/salesforce/setup-v3.png b/docs/static/img/marketplace/plugins/salesforce/setup-v3.png new file mode 100644 index 0000000000..6da0f57e26 Binary files /dev/null and b/docs/static/img/marketplace/plugins/salesforce/setup-v3.png differ diff --git a/docs/static/img/user-management/rbac/access-control/app-permission.png b/docs/static/img/user-management/rbac/access-control/app-permission.png index 242722a502..56e2359461 100644 Binary files a/docs/static/img/user-management/rbac/access-control/app-permission.png and b/docs/static/img/user-management/rbac/access-control/app-permission.png differ diff --git a/docs/static/img/user-management/sso/oidc/config-v2.png b/docs/static/img/user-management/sso/oidc/config-v2.png new file mode 100644 index 0000000000..644b2c2963 Binary files /dev/null and b/docs/static/img/user-management/sso/oidc/config-v2.png differ diff --git a/docs/static/img/user-management/sso/scim/okta/attribute-mapping.png b/docs/static/img/user-management/sso/scim/okta/attribute-mapping.png new file mode 100644 index 0000000000..fc822783dd Binary files /dev/null and b/docs/static/img/user-management/sso/scim/okta/attribute-mapping.png differ diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/codespaces.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/codespaces.md index c64aacb24a..c877dfa1b2 100644 --- a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/codespaces.md +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/codespaces.md @@ -3,13 +3,13 @@ id: codespaces title: GitHub Codespaces --- -Follow the steps below to set up ToolJet on GitHub Codespaces. We recommend reading our guide on [architecture](https://docs.tooljet.ai/docs/contributing-guide/setup/architecture) of ToolJet before proceeding. +Follow the steps below to set up ToolJet on GitHub Codespaces. We recommend reading our guide on [architecture](https://docs.tooljet.com/docs/contributing-guide/setup/architecture) of ToolJet before proceeding. Open the terminal and run the commands below. ## Setting up -### 1. Set up the environment +### 1. Set up the environment 1. Install Node.js ( version: v18.18.2 ) and npm (version: v9.8.1) @@ -31,7 +31,7 @@ sudo apt-get update sudo apt-get install postgresql-13 postgresql-contrib-13 ``` -To start the postgresql service run the below command: +To start the postgresql service run the below command: ``` sudo service postgresql start @@ -44,14 +44,14 @@ sudo su sudo -u postgres psql -\password postgres +\password postgres \q ``` ### 2. Set up environment variables -Create a `.env` file by running the command `touch .env`. More information on the variables that can be set is given in the [environment variables reference](https://docs.tooljet.ai/docs/setup/env-vars) +Create a `.env` file by running the command `touch .env`. More information on the variables that can be set is given in the [environment variables reference](https://docs.tooljet.com/docs/setup/env-vars) **For basic set-up you add the below env variables:** @@ -81,7 +81,7 @@ SERVE_CLIENT=true > > `LOCKBOX_MASTER_KEY` requires a 32 byte key. (Run `openssl rand -hex 32` to create a 32 byte secure random key) -### 3. Install and build dependencies +### 3. Install and build dependencies Make sure node version is set to 18.18.2 before running the below command: @@ -92,7 +92,6 @@ npm install --prefix frontend npm run build:plugins ``` - ### 4. Set up database ``` diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/custom-js.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/custom-js.md index b39f9633e7..2eb94109c6 100644 --- a/docs/versioned_docs/version-3.0.0-LTS/data-sources/custom-js.md +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/custom-js.md @@ -149,7 +149,7 @@ This ID will be longer than the one generated earlier, and it could look like "2 :::tip Resources -- You can also write custom JavaScript code to get the data from **External APIs** and manipulate the response for graphical representation. Here's the [tutorial](https://blog.tooljet.ai/build-github-stars-history-app-in-5-minutes-using-low-code/) on how we used custom JavaScript code to build an app using GitHub API. +- You can also write custom JavaScript code to get the data from **External APIs** and manipulate the response for graphical representation. Here's the [tutorial](https://blog.tooljet.com/build-github-stars-history-app-in-5-minutes-using-low-code/) on how we used custom JavaScript code to build an app using GitHub API. - [Import external libraries](/docs/how-to/import-external-libraries-using-runjs) using RunJS. - [Intentionally Fail](/docs/how-to/intentionally-fail-js-query) a RunJS query. - [Trigger query at specified intervals](/docs/how-to/run-query-at-specified-intervals) using RunJS. diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/s3.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/s3.md index 6517794bf4..1764864c43 100644 --- a/docs/versioned_docs/version-3.0.0-LTS/data-sources/s3.md +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/s3.md @@ -11,7 +11,7 @@ ToolJet can connect to **Amazon S3** buckets and perform various operations on t To establish a connection with the **Amazon S3** data source, you can either click on the **+ Add new Data source** button located on the query panel or navigate to the **[Data Sources](/docs/data-sources/overview/)** page from the ToolJet dashboard. -ToolJet supports connecting to AWS S3 using **IAM Access Keys**, **AWS Instance Credentials** or **AWS ARN Role**. +ToolJet supports connecting to AWS S3 using **IAM Access Keys**, **AWS Instance Credentials** or **AWS ARN Role**. If you are using **IAM Access Keys**, you will need to provide the following details: @@ -64,18 +64,19 @@ Query results can be transformed using transformations. Read our [transformation ## Supported Operations You can create query for AWS S3 data source to perform several actions such as: + - **[Create a new bucket](#create-a-new-bucket)** - **[Read object](#read-object)** - **[Upload object](#upload-object)** - **[Remove object](#remove-object)** - **[List buckets](#list-buckets)** - **[List objects in a bucket](#list-objects-in-a-bucket)** -- **[Signed URL for download](#signed-url-for-download)** -- **[Signed URL for upload](#signed-url-for-upload)** +- **[Signed URL for download](#signed-url-for-download)** +- **[Signed URL for upload](#signed-url-for-upload)** ### Create a New Bucket -You can create a new bucket in your S3 by using this operation. +You can create a new bucket in your S3 by using this operation. #### Required Parameters @@ -85,7 +86,7 @@ You can create a new bucket in your S3 by using this operation. ### Read Object -You can read an object in a bucket by using this operation. +You can read an object in a bucket by using this operation. #### Required Parameters @@ -96,7 +97,7 @@ You can read an object in a bucket by using this operation. ### Upload Object -You can use this operation to upload objects(files) to your S3 bucket. +You can use this operation to upload objects(files) to your S3 bucket. #### Required Parameters @@ -105,11 +106,11 @@ You can use this operation to upload objects(files) to your S3 bucket. - **Content Type** - **Upload data** -aws s3 upload +aws s3 upload ### Remove Object -You can use this operation to remove an object from your S3 bucket. +You can use this operation to remove an object from your S3 bucket. #### Required Parameters @@ -139,7 +140,6 @@ This operation will fetch the list of all the files in your bucket. It requires - **Offset** - **Next Continuation Token** - :::info **Next Continuation Token**
For listing a bucket for objects that begin with a specific character or a prefix, then use the **Offset** parameter. For example, if you want to list all the objects that begin with **a**, then set the **Offset** parameter to **a**. Similarly, if you want to list all the objects that begin with **ab**, then set the **Offset** parameter to **ab**.
@@ -151,7 +151,7 @@ The results will continue from where the last listing finished. ### Signed URL for Download -The object owner can optionally share objects with others by creating a presigned URL, using their own security credentials, to grant time-limited permission to download the objects. +The object owner can optionally share objects with others by creating a presigned URL, using their own security credentials, to grant time-limited permission to download the objects. #### Required Parameters @@ -163,7 +163,7 @@ The object owner can optionally share objects with others by creating a presigne ### Signed URL for Upload -The presigned URLs are useful if you want your user/customer to be able to upload a specific object to your bucket, but you don't require them to have AWS security credentials or permissions. +The presigned URLs are useful if you want your user/customer to be able to upload a specific object to your bucket, but you don't require them to have AWS security credentials or permissions. #### Required Parameters @@ -175,7 +175,7 @@ The presigned URLs are useful if you want your user/customer to be able to uploa aws s3 signed upload :::info -We built an app to view and upload files to AWS S3 buckets. Check out the complete tutorial **[here](https://blog.tooljet.ai/build-an-aws-s3-broswer-with-tooljet/)**. +We built an app to view and upload files to AWS S3 buckets. Check out the complete tutorial **[here](https://blog.tooljet.com/build-an-aws-s3-broswer-with-tooljet/)**. ::: - \ No newline at end of file + diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/stripe.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/stripe.md index 2352956053..678a0b51f9 100644 --- a/docs/versioned_docs/version-3.0.0-LTS/data-sources/stripe.md +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/stripe.md @@ -6,7 +6,7 @@ title: Stripe ToolJet can connect to your Stripe account to read or write customers' and payments' data. :::info -Check out the **[Stripe Refund App tutorial](https://blog.tooljet.ai/build-a-stripe-refund-tool-using-low-code/)** +Check out the **[Stripe Refund App tutorial](https://blog.tooljet.com/build-a-stripe-refund-tool-using-low-code/)** :::
@@ -16,6 +16,7 @@ Check out the **[Stripe Refund App tutorial](https://blog.tooljet.ai/build-a-str To establish a connection with the Stripe data source, you can either click on the **+ Add new Data source** button located on the query panel or navigate to the **[Data Sources](/docs/data-sources/overview/)** page from the ToolJet dashboard and choose Stripe as the data source. ToolJet requires the following to connect to Stripe datasource. + - **Stripe API key** ToolJet - Data source - Stripe @@ -49,149 +50,149 @@ You can check out the some of the operations mentioned below. All the operations

Account Operations

-| **Method** | **Endpoint** | **Description** | -|------------|------------------------|-----------------------------------| -| DELETE | `/v1/account` | Delete an account | -| GET | `/v1/account` | Retrieve account details | -| POST | `/v1/account` | Create or update account | +| **Method** | **Endpoint** | **Description** | +| ---------- | ------------- | ------------------------ | +| DELETE | `/v1/account` | Delete an account | +| GET | `/v1/account` | Retrieve account details | +| POST | `/v1/account` | Create or update account |

Bank Accounts (Account)

-| **Method** | **Endpoint** | **Description** | -|------------|---------------------------------------|-----------------------------------| -| POST | `/v1/account/bank_accounts` | Add a bank account | -| DELETE | `/v1/account/bank_accounts/{id}` | Delete a bank account | -| GET | `/v1/account/bank_accounts/{id}` | Retrieve bank account details | -| POST | `/v1/account/bank_accounts/{id}` | Update bank account details | +| **Method** | **Endpoint** | **Description** | +| ---------- | -------------------------------- | ----------------------------- | +| POST | `/v1/account/bank_accounts` | Add a bank account | +| DELETE | `/v1/account/bank_accounts/{id}` | Delete a bank account | +| GET | `/v1/account/bank_accounts/{id}` | Retrieve bank account details | +| POST | `/v1/account/bank_accounts/{id}` | Update bank account details |

Capabilities (Account)

-| **Method** | **Endpoint** | **Description** | -|------------|------------------------------------------|-----------------------------------| -| GET | `/v1/account/capabilities` | Retrieve account capabilities | -| GET | `/v1/account/capabilities/{capability}` | Retrieve specific capability | -| POST | `/v1/account/capabilities/{capability}` | Update specific capability | +| **Method** | **Endpoint** | **Description** | +| ---------- | --------------------------------------- | ----------------------------- | +| GET | `/v1/account/capabilities` | Retrieve account capabilities | +| GET | `/v1/account/capabilities/{capability}` | Retrieve specific capability | +| POST | `/v1/account/capabilities/{capability}` | Update specific capability |

External Accounts (Account)

-| **Method** | **Endpoint** | **Description** | -|------------|---------------------------------------|-----------------------------------| -| GET | `/v1/account/external_accounts` | Retrieve external accounts | -| POST | `/v1/account/external_accounts` | Add an external account | -| DELETE | `/v1/account/external_accounts/{id}` | Delete an external account | -| GET | `/v1/account/external_accounts/{id}` | Retrieve external account details | -| POST | `/v1/account/external_accounts/{id}` | Update external account details | +| **Method** | **Endpoint** | **Description** | +| ---------- | ------------------------------------ | --------------------------------- | +| GET | `/v1/account/external_accounts` | Retrieve external accounts | +| POST | `/v1/account/external_accounts` | Add an external account | +| DELETE | `/v1/account/external_accounts/{id}` | Delete an external account | +| GET | `/v1/account/external_accounts/{id}` | Retrieve external account details | +| POST | `/v1/account/external_accounts/{id}` | Update external account details |

People (Account)

-| **Method** | **Endpoint** | **Description** | -|------------|---------------------------------------|-----------------------------------| -| GET | `/v1/account/people` | Retrieve people associated | -| POST | `/v1/account/people` | Add a person to account | -| DELETE | `/v1/account/people/{person}` | Delete a person | -| GET | `/v1/account/people/{person}` | Retrieve person details | -| POST | `/v1/account/people/{person}` | Update person details | +| **Method** | **Endpoint** | **Description** | +| ---------- | ----------------------------- | -------------------------- | +| GET | `/v1/account/people` | Retrieve people associated | +| POST | `/v1/account/people` | Add a person to account | +| DELETE | `/v1/account/people/{person}` | Delete a person | +| GET | `/v1/account/people/{person}` | Retrieve person details | +| POST | `/v1/account/people/{person}` | Update person details |

Persons (Account)

-| **Method** | **Endpoint** | **Description** | -|------------|---------------------------------------|-----------------------------------| -| POST | `/v1/account/persons` | Add a person | -| DELETE | `/v1/account/persons/{person}` | Delete a person | -| GET | `/v1/account/persons/{person}` | Retrieve person details | -| POST | `/v1/account/persons/{person}` | Update person details | +| **Method** | **Endpoint** | **Description** | +| ---------- | ------------------------------ | ----------------------- | +| POST | `/v1/account/persons` | Add a person | +| DELETE | `/v1/account/persons/{person}` | Delete a person | +| GET | `/v1/account/persons/{person}` | Retrieve person details | +| POST | `/v1/account/persons/{person}` | Update person details |

Other Account Operations

-| **Method** | **Endpoint** | **Description** | -|------------|-------------------------------|-----------------------------------| -| POST | `/v1/account/login_links` | Create login link for account | -| POST | `/v1/account_links` | Create account links | +| **Method** | **Endpoint** | **Description** | +| ---------- | ------------------------- | ----------------------------- | +| POST | `/v1/account/login_links` | Create login link for account | +| POST | `/v1/account_links` | Create account links |

Accounts (Specific) Operations

-| **Method** | **Endpoint** | **Description** | -|------------|---------------------------------------|-----------------------------------| -| GET | `/v1/accounts` | Retrieve list of accounts | -| POST | `/v1/accounts` | Create a new account | -| DELETE | `/v1/accounts/{account}` | Delete a specific account | -| GET | `/v1/accounts/{account}` | Retrieve specific account details | -| POST | `/v1/accounts/{account}` | Update specific account details | +| **Method** | **Endpoint** | **Description** | +| ---------- | ------------------------ | --------------------------------- | +| GET | `/v1/accounts` | Retrieve list of accounts | +| POST | `/v1/accounts` | Create a new account | +| DELETE | `/v1/accounts/{account}` | Delete a specific account | +| GET | `/v1/accounts/{account}` | Retrieve specific account details | +| POST | `/v1/accounts/{account}` | Update specific account details |

Bank Accounts (Specific)

-| **Method** | **Endpoint** | **Description** | -|------------|---------------------------------------|-----------------------------------| -| POST | `/v1/accounts/{account}/bank_accounts`| Add a bank account | -| DELETE | `/v1/accounts/{account}/bank_accounts/{id}`| Delete a bank account | -| GET | `/v1/accounts/{account}/bank_accounts/{id}`| Retrieve bank account details | +| **Method** | **Endpoint** | **Description** | +| ---------- | ------------------------------------------- | ----------------------------- | +| POST | `/v1/accounts/{account}/bank_accounts` | Add a bank account | +| DELETE | `/v1/accounts/{account}/bank_accounts/{id}` | Delete a bank account | +| GET | `/v1/accounts/{account}/bank_accounts/{id}` | Retrieve bank account details |

Capabilities (Specific)

-| **Method** | **Endpoint** | **Description** | -|------------|------------------------------------------|-----------------------------------| -| GET | `/v1/accounts/{account}/capabilities` | Retrieve account capabilities | -| GET | `/v1/accounts/{account}/capabilities/{capability}`| Retrieve specific capability details | -| POST | `/v1/accounts/{account}/capabilities/{capability}`| Update specific capability | +| **Method** | **Endpoint** | **Description** | +| ---------- | -------------------------------------------------- | ------------------------------------ | +| GET | `/v1/accounts/{account}/capabilities` | Retrieve account capabilities | +| GET | `/v1/accounts/{account}/capabilities/{capability}` | Retrieve specific capability details | +| POST | `/v1/accounts/{account}/capabilities/{capability}` | Update specific capability |

External Accounts (Specific)

-| **Method** | **Endpoint** | **Description** | -|------------|------------------------------------------|-----------------------------------| -| GET | `/v1/accounts/{account}/external_accounts`| Retrieve external accounts | -| POST | `/v1/accounts/{account}/external_accounts`| Add an external account | -| DELETE | `/v1/accounts/{account}/external_accounts/{id}`| Delete an external account | -| GET | `/v1/accounts/{account}/external_accounts/{id}`| Retrieve external account details| +| **Method** | **Endpoint** | **Description** | +| ---------- | ----------------------------------------------- | --------------------------------- | +| GET | `/v1/accounts/{account}/external_accounts` | Retrieve external accounts | +| POST | `/v1/accounts/{account}/external_accounts` | Add an external account | +| DELETE | `/v1/accounts/{account}/external_accounts/{id}` | Delete an external account | +| GET | `/v1/accounts/{account}/external_accounts/{id}` | Retrieve external account details |

People (Specific)

-| **Method** | **Endpoint** | **Description** | -|------------|------------------------------------------|-----------------------------------| -| GET | `/v1/accounts/{account}/people` | Retrieve people associated | -| POST | `/v1/accounts/{account}/people` | Add a person to account | -| DELETE | `/v1/accounts/{account}/people/{person}` | Delete a person | -| GET | `/v1/accounts/{account}/people/{person}` | Retrieve person details | -| POST | `/v1/accounts/{account}/people/{person}` | Update person details | +| **Method** | **Endpoint** | **Description** | +| ---------- | ---------------------------------------- | -------------------------- | +| GET | `/v1/accounts/{account}/people` | Retrieve people associated | +| POST | `/v1/accounts/{account}/people` | Add a person to account | +| DELETE | `/v1/accounts/{account}/people/{person}` | Delete a person | +| GET | `/v1/accounts/{account}/people/{person}` | Retrieve person details | +| POST | `/v1/accounts/{account}/people/{person}` | Update person details |

Persons (Specific)

-| **Method** | **Endpoint** | **Description** | -|------------|---------------------------------------|-----------------------------------| -| POST | `/v1/accounts/{account}/persons` | Add a person | -| DELETE | `/v1/accounts/{account}/persons/{person}`| Delete a person | -| GET | `/v1/accounts/{account}/persons/{person}`| Retrieve person details | -| POST | `/v1/accounts/{account}/persons/{person}`| Update person details | +| **Method** | **Endpoint** | **Description** | +| ---------- | ----------------------------------------- | ----------------------- | +| POST | `/v1/accounts/{account}/persons` | Add a person | +| DELETE | `/v1/accounts/{account}/persons/{person}` | Delete a person | +| GET | `/v1/accounts/{account}/persons/{person}` | Retrieve person details | +| POST | `/v1/accounts/{account}/persons/{person}` | Update person details |

Other Account-Specific Operations

-| **Method** | **Endpoint** | **Description** | -|------------|------------------------------------------|-----------------------------------| -| POST | `/v1/accounts/{account}/login_links` | Create login link for account | -| POST | `/v1/accounts/{account}/reject` | Reject an account | +| **Method** | **Endpoint** | **Description** | +| ---------- | ------------------------------------ | ----------------------------- | +| POST | `/v1/accounts/{account}/login_links` | Create login link for account | +| POST | `/v1/accounts/{account}/reject` | Reject an account |

Apple Pay Operations

-| **Method** | **Endpoint** | **Description** | -|------------|---------------------------------|-----------------------------------| -| GET | `/v1/apple_pay/domains` | Retrieve Apple Pay domains | -| POST | `/v1/apple_pay/domains` | Add a domain to Apple Pay | -| DELETE | `/v1/apple_pay/domains/{domain}`| Delete a domain from Apple Pay | -| GET | `/v1/apple_pay/domains/{domain}`| Retrieve specific Apple Pay domain| +| **Method** | **Endpoint** | **Description** | +| ---------- | -------------------------------- | ---------------------------------- | +| GET | `/v1/apple_pay/domains` | Retrieve Apple Pay domains | +| POST | `/v1/apple_pay/domains` | Add a domain to Apple Pay | +| DELETE | `/v1/apple_pay/domains/{domain}` | Delete a domain from Apple Pay | +| GET | `/v1/apple_pay/domains/{domain}` | Retrieve specific Apple Pay domain |

Application Fees Operations

-| **Method** | **Endpoint** | **Description** | -|------------|-------------------------------------------|-----------------------------------| -| GET | `/v1/application_fees` | Retrieve list of application fees | -| GET | `/v1/application_fees/{id}` | Retrieve specific application fee | -| POST | `/v1/application_fees/{id}/refund` | Refund an application fee | -| GET | `/v1/application_fees/{id}/refunds` | Retrieve list of refunds | -| POST | `/v1/application_fees/{id}/refunds` | Create a refund for an application| +| **Method** | **Endpoint** | **Description** | +| ---------- | ----------------------------------- | ---------------------------------- | +| GET | `/v1/application_fees` | Retrieve list of application fees | +| GET | `/v1/application_fees/{id}` | Retrieve specific application fee | +| POST | `/v1/application_fees/{id}/refund` | Refund an application fee | +| GET | `/v1/application_fees/{id}/refunds` | Retrieve list of refunds | +| POST | `/v1/application_fees/{id}/refunds` | Create a refund for an application |

Application Fee Refunds (Specific)

-| **Method** | **Endpoint** | **Description** | -|------------|---------------------------------------------|-----------------------------------| -| GET | `/v1/application_fees/{fee}/refunds/{id}` | Retrieve specific refund details +| **Method** | **Endpoint** | **Description** | +| ---------- | ----------------------------------------- | -------------------------------- | +| GET | `/v1/application_fees/{fee}/refunds/{id}` | Retrieve specific refund details |
diff --git a/docs/versioned_docs/version-3.0.0-LTS/getting-started/quickstart-guide.md b/docs/versioned_docs/version-3.0.0-LTS/getting-started/quickstart-guide.md index 53e8d991db..ef98948380 100644 --- a/docs/versioned_docs/version-3.0.0-LTS/getting-started/quickstart-guide.md +++ b/docs/versioned_docs/version-3.0.0-LTS/getting-started/quickstart-guide.md @@ -7,8 +7,8 @@ title: Quickstart Guide This quickstart guide walks you through the process of creating an employee directory app using ToolJet. The application lets users track and update employee details while working with core features of the platform, all within a user-friendly interface. Here are the step-by-step instructions: -**[1. Create Your First Application](#1-create-your-first-application)**
-**[2. Create a Database Table](#2-create-a-database-table)**
+**[1. Create Your First Application](#1-create-your-first-application)**
+**[2. Create a Database Table](#2-create-a-database-table)**
**[3. Create a Query to Fetch Data](#3-create-a-query-to-fetch-data)**
**[4. Bind Queried Data to the UI](#4-bind-queried-data-to-the-ui)**
**[5. Create a Query to Add Data](#5-create-a-query-to-add-data)**
@@ -21,15 +21,15 @@ This quickstart guide walks you through the process of creating an employee dire ### 1. Create Your First Application -To begin, create a free **[ToolJet](https://www.tooljet.ai/signup)** account and follow the steps below. +To begin, create a free **[ToolJet](https://www.tooljet.com/signup)** account and follow the steps below.

-- Click on the **Create new app** button on the dashboard. Name your application as "Employee Directory". -- Click and drag a **[Table](/docs/widgets/table)** component on the canvas. Optionally, you can also design a header by adding more components. +- Click on the **Create new app** button on the dashboard. Name your application as "Employee Directory". +- Click and drag a **[Table](/docs/widgets/table)** component on the canvas. Optionally, you can also design a header by adding more components. ## Past Versions (Not Maintained Anymore) -| Version | Documentation | -|-------------|-------------------------------------------| -| 2.65.0 | [Documentation](https://archived-docs.tooljet.ai/docs/) | -| 2.62.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.62.0) | -| 2.61.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.61.0) | -| 2.43.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.43.0) | -| 2.39.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.39.0) | -| 2.36.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.36.0) | -| 2.35.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.35.0) | -| 2.34.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.34.0) | -| 2.33.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.33.0) | -| 2.30.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.30.0) | -| 2.29.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.29.0) | -| 2.27.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.27.0) | -| 2.25.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.25.0) | -| 2.24.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.24.0) | -| 2.23.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.23.0) | -| 2.22.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.22.0) | -| 2.19.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.19.0) | -| 2.18.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.18.0) | -| 2.17.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.17.0) | -| 2.16.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.16.0) | -| 2.15.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.15.0) | -| 2.14.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.14.0) | -| 2.13.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.13.0) | -| 2.12.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.12.0) | -| 2.11.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.11.0) | -| 2.10.0 | [Documentation](https://archived-docs.tooljet.ai/docs/2.10.0) | -| 1.x.x | [Documentation](https://archived-docs.tooljet.ai/docs/1.x.x) | +| Version | Documentation | +| ------- | -------------------------------------------------------------- | +| 2.65.0 | [Documentation](https://archived-docs.tooljet.com/docs/) | +| 2.62.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.62.0) | +| 2.61.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.61.0) | +| 2.43.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.43.0) | +| 2.39.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.39.0) | +| 2.36.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.36.0) | +| 2.35.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.35.0) | +| 2.34.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.34.0) | +| 2.33.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.33.0) | +| 2.30.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.30.0) | +| 2.29.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.29.0) | +| 2.27.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.27.0) | +| 2.25.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.25.0) | +| 2.24.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.24.0) | +| 2.23.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.23.0) | +| 2.22.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.22.0) | +| 2.19.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.19.0) | +| 2.18.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.18.0) | +| 2.17.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.17.0) | +| 2.16.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.16.0) | +| 2.15.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.15.0) | +| 2.14.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.14.0) | +| 2.13.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.13.0) | +| 2.12.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.12.0) | +| 2.11.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.11.0) | +| 2.10.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.10.0) | +| 1.x.x | [Documentation](https://archived-docs.tooljet.com/docs/1.x.x) | diff --git a/docs/versioned_docs/version-3.16.0-LTS/app-builder/custom-theme.md b/docs/versioned_docs/version-3.16.0-LTS/app-builder/custom-theme.md index 184b297894..9b13501fd3 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/app-builder/custom-theme.md +++ b/docs/versioned_docs/version-3.16.0-LTS/app-builder/custom-theme.md @@ -1,6 +1,6 @@ --- id: custom-theme -title: Custom Themes +title: App Themes ---
@@ -15,13 +15,24 @@ title: Custom Themes
-ToolJet supports Custom Themes at the workspace level, giving teams complete control over the look and feel of their applications. With this feature, you can define and manage multiple themes and apply them across your apps in a consistent and reusable way. +ToolJet supports App Themes giving teams complete control over the look and feel of their applications. With this feature, you can define and manage multiple themes and apply them across your apps in a consistent and reusable way. Each workspace can have one or more themes configured, and any application within that workspace can use any of the defined themes. This helps in maintaining visual consistency across applications, improves brand alignment, and enhances user experience. -## What is a Custom Theme? +## Why Use App Themes? -A Custom Theme allows you to customize the UI components of your ToolJet apps by configuring a set of visual styles such as: +App Themes empower your organization by: + +- **Brand consistency**: Align your internal tools with your companyโ€™s visual identity. +- **Reusability**: Define once, use across multiple apps. +- **Customization**: Update the look of all your apps in one go by editing the theme. +- **Collaboration**: Teams working on different apps can maintain a unified design system. + +This is especially useful for teams with apps across different environments (e.g., internal tools, client-facing apps, admin panels) where each might need a slightly different yet consistent visual identity. + +## How to Use App Themes + +An App Theme allows you to customize the UI components of your ToolJet apps by configuring a set of visual styles such as: - Brand Colors (Primary, Secondary, Tertiary) - Text colors - Border and surface styling @@ -33,41 +44,34 @@ You can configure these settings for both light and dark modes, and instantly pr Configure custom theme -## Why Use Custom Themes? +

-Custom Themes empower your organization by: +Using App Themes in ToolJet involves two simple steps โ€” **creating the theme** and **applying it to your applications**. -- **Brand consistency**: Align your internal tools with your companyโ€™s visual identity. -- **Reusability**: Define once, use across multiple apps. -- **Customization**: Update the look of all your apps in one go by editing the theme. -- **Collaboration**: Teams working on different apps can maintain a unified design system. +### 1. Create an App Theme -This is especially useful for teams with apps across different environments (e.g., internal tools, client-facing apps, admin panels) where each might need a slightly different yet consistent visual identity. - -## How to Use Custom Themes - -Using Custom Themes in ToolJet involves two simple steps โ€” **creating the theme** and **applying it to your applications**. - -### 1. Create a Custom Theme +Role Required: **Admin** - Go to your **Workspace Settings**. -- Click on the **Custom Theme** tab. +- Click on the **Theme** tab. - Click **Create new theme**. - Configure your theme styles: - Set your **Brand colors**: Primary, Secondary, Tertiary - Define **Text**, **Border**, **System status**, and **Surface** colors - Choose styles for both **Light** and **Dark** modes -- Click **Save** once you're done. +- Click **Save** once you're done.
You can create multiple themes as per your needs โ€” for different teams, environments, or clients. ### 2. Apply the Theme to Your Application +Role Required: **Admin/Builder** + - Open the app where you want to use the theme. - Click the **Settings icon** in the **left sidebar** to open **Global Settings**. - Scroll down to the **Theme** section. - Youโ€™ll see a dropdown showing the currently selected theme (usually the default). -- Click the dropdown to view and select from all your configured themes. +- Click the dropdown to view and select from all your configured themes.
Configure custom theme Once selected, your app will now use the chosen theme as the base style for components. @@ -88,7 +92,7 @@ Once components are styled using theme options, changing the theme from Global S ## Scenarios -Here are some scenarios where custom themes shine: +Here are some scenarios where app themes shine: - **Brand-specific apps**: Create different themes for different brands/clients your company serves. - **Dark & light mode toggle**: Provide a seamless visual switch for end-users between light and dark modes. @@ -96,17 +100,17 @@ Here are some scenarios where custom themes shine: ## Example -Hereโ€™s an example showing how an application interface looks before and after applying a custom theme. +Hereโ€™s an example showing how an application interface looks before and after applying an app theme. ### Before (Default Theme) -This is the default ToolJet UI without any custom theme applied. It uses the standard branding and neutral colors. +This is the default ToolJet UI without any app theme applied. It uses the standard branding and neutral colors. Configure custom theme -### After (Custom Theme Applied) +### After (App Theme Applied) Configure custom theme -This is the same application after applying the "Coral" custom theme. Notice the button color, primary accents, and overall visual alignment now reflect the chosen palette. +This is the same application after applying the "Coral" app theme. Notice the button color, primary accents, and overall visual alignment now reflect the chosen palette. By simply configuring a theme once at the workspace level, you can instantly apply a fresh look across all apps, improving usability, clarity, and brand identity. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.16.0-LTS/app-builder/customcss.md b/docs/versioned_docs/version-3.16.0-LTS/app-builder/customcss.md new file mode 100644 index 0000000000..73f8e1dece --- /dev/null +++ b/docs/versioned_docs/version-3.16.0-LTS/app-builder/customcss.md @@ -0,0 +1,115 @@ +--- +id: customstyles +title: Custom Styles +--- + +
+ Icon + Paid feature +
+ +The Custom Styles feature in ToolJet allows users to apply their own CSS, overriding the default app styles. This enables easy customization of app appearance, and maintains consistent themes across all ToolJet apps. By using standardized styles, users avoid the repetitive task of manually styling components for each new app, enhancing development efficiency and ensuring visual coherence for a seamless user experience + +
+ Custom CSS +
+ +## Applying Custom Styles To All Components + +Follow these steps to apply custom styles in your ToolJet apps: + +- Navigate to the **Custom Styles** page from **Workspace Settings** on the ToolJet dashboard + +
+ Custom CSS +
+
+ +- To modify the default colors of components, use their class names, which follow the format `_tooljet-`. + +
+ Component Class +
+
+ +- You'll need to identify the specific sub-class(or HTML tags) of each component to target particular attributes. The browser's inspector will allow you to easily find the sub-class(or HTML tags) of the specific +properties. + +
+ Sub-Class +
+
+ +- After locating the specific sub-class(or HTML tag), refer it in the **Custom Styles** section and add styling to it. For instance, for the Button component above, the the below CSS will change the background color: + +```css +._tooljet-Button button { + background-color: #152A65 !important; +} +``` + +
+ Button Custom CSS +
+
+ +- Similarly, the code below can be used to change the background color of the Filter button on a Table component. + +```css +._tooljet-Table .table-card-header button { + background-color: #152A65 !important; +} +``` + +
+ Filter Custom CSS +
+
+ +- The code below will change the font size and color of the Text Input and Number Input labels. + +```css +._tooljet-TextInput p { + color: #152A65 !important; + font-size: 16px !important; + font-weight: bold !important; +} + +._tooljet-NumberInput p { + color: #152A65 !important; + font-size: 16px !important; + font-weight: bold !important; +} +``` +
+ Input Field Custom CSS +
+ + +## Applying Custom Styles To Individual Components + +To modify the colors of individual components, use their class names, which follow the format `_tooljet-`. Here, the component name refers to the name of the component that is set in the application. + +
+ Individual Class Custom CSS +
+
+ +- The color of the Button component above can be changed using the code below: + +```css +._tooljet-addIncomeButton button { + background-color: blue !important; +} +``` +
+ Individual Class Custom CSS +
+
+ +In conclusion, Custom CSS feature lets you override default styles with your own CSS. By providing the flexibility to apply both global and component-specific customizations, this feature enhances the visual coherence and branding of your apps. cs \ No newline at end of file diff --git a/docs/versioned_docs/version-3.16.0-LTS/app-builder/debugging/inspector.md b/docs/versioned_docs/version-3.16.0-LTS/app-builder/debugging/inspector.md index b8fe95d558..9c55e90f9d 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/app-builder/debugging/inspector.md +++ b/docs/versioned_docs/version-3.16.0-LTS/app-builder/debugging/inspector.md @@ -52,6 +52,7 @@ Refer to the [Accessing Component State](/docs/app-builder/building-ui/component ### Globals By using the Globals properties in the Inspector, you can view various details about your application and its environment, such as: +- **App Version** - Stores the current app version name. - **Current User** - Information about the logged-in user, including email, name, avatar, groups, roles, and SSO details. Useful for building role-based UI or showing personalized content. - **Environment** - Indicates the current ToolJet environment โ€” development, staging, or production. - **Mode** - Indicates whether the app is opened in the editor or not. diff --git a/docs/versioned_docs/version-3.16.0-LTS/app-builder/embed-application.md b/docs/versioned_docs/version-3.16.0-LTS/app-builder/embed-application.md index ef8838d909..a62e316b8d 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/app-builder/embed-application.md +++ b/docs/versioned_docs/version-3.16.0-LTS/app-builder/embed-application.md @@ -18,7 +18,7 @@ When embedding applications, ToolJet ensures that only the right users can acces | **Feature** | **Public Applications** | **Private & Data-Sensitive Applications** | | ------------| ----------------------- | ------------------------------------------| -| **Access Control** | None โ€“ anyone with the embed link or iframe can view | Requires a valid Personal Access Token (PAT) to load the app. | +| **Access Control** | None โ€“ anyone with the embed link or iframe can view | Embed Application will follow the SSO of host application | | **Granularity** | Not applicable | Tokens can be scoped to individual user and application | | **Best For** | Public dashboards, demos, or open-data applications | Authenticated portals, customer-specific views, internal tools | | **Example** | Live product status page displaying uptime and incident history | Embedded customer billing dashboard showing only that customerโ€™s invoices | diff --git a/docs/versioned_docs/version-3.16.0-LTS/build-with-ai/ai-credits.md b/docs/versioned_docs/version-3.16.0-LTS/build-with-ai/ai-credits.md index 115deb6795..ca1a9f3497 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/build-with-ai/ai-credits.md +++ b/docs/versioned_docs/version-3.16.0-LTS/build-with-ai/ai-credits.md @@ -7,7 +7,7 @@ title: Understanding AI Credits This implementation of AI credits will be available from 22nd September 2025. ::: -A credit is a standardized unit of AI processing power consumed on every AI operation performed in ToolJet. Each operation, from [generating complete applications](/docs/build-with-ai/generate-applications) to creating custom code or modifying layouts, consumes a varied amount of credits based on the complexity and type of task. This approach provides transparent cost visibility while enabling you to scale your AI usage on-demand. +A credit is a standardized unit of AI processing power consumed on every AI operation performed in ToolJet. Each operation, from [generating complete applications](/docs/build-with-ai/generate-applications) to creating custom code or modifying layouts, consumes a varied amount of credits based on the complexity and type of task. This approach provides transparent cost visibility while enabling you to scale your AI usage on-demand. In this guide you will learn about types of credits, credit usage, getting more credits, and more. @@ -15,16 +15,16 @@ In this guide you will learn about types of credits, credit usage, getting more Credit usage in ToolJet varies based on the complexity of the request. Monthly credits are always consumed first. Add-on credits are utilized only after the monthly credits are exhausted. The table below provides an average range of credits utilized for different operations to help you estimate usage. -| Operation | Avg. Credits Utilised | -|:----------|:---------------------:| -| [App Generation](/docs/build-with-ai/generate-applications) | 100 | -| Adding New Feature in the Application | 100 | -| Modifying Layout/UI | 50 | -| Modifying Queries/Database | 30 | -| [Debug Components Auto Fix](/docs/build-with-ai/debug-components) | 10 | -| [AI Docs Assistant](/docs/build-with-ai/ai-docs-assistant) | 6 | -| SQL Query Generation | 5 | -| Custom Code Generation | 2 | +| Operation | Avg. Credits Utilised | +| :---------------------------------------------------------------- | :-------------------: | +| [App Generation](/docs/build-with-ai/generate-applications) | 100 | +| Adding New Feature in the Application | 100 | +| Modifying Layout/UI | 50 | +| Modifying Queries/Database | 30 | +| [Debug Components Auto Fix](/docs/build-with-ai/debug-components) | 10 | +| [AI Docs Assistant](/docs/build-with-ai/ai-docs-assistant) | 6 | +| SQL Query Generation | 5 | +| Custom Code Generation | 2 | :::warning These values are only average estimates to help plan your operations. **Actual credit consumption will vary depending on the complexity of the operation**. @@ -38,7 +38,7 @@ Monthly credits are recurring credits included with your purchased license. They ### Add-on Credits -Add-on credits can be purchased in addition to your monthly credits and are a one-time purchase that do not renew monthly. These credits can only be purchased in multiples of 100 and are valid for one year from the date of purchase. If you buy additional credits after an initial purchase, the validity of the entire pool of credits is extended based on the latest purchase date. Checkout the [pricing](https://www.tooljet.ai/pricing) page for more information. +Add-on credits can be purchased in addition to your monthly credits and are a one-time purchase that do not renew monthly. These credits can only be purchased in multiples of 100 and are valid for one year from the date of purchase. If you buy additional credits after an initial purchase, the validity of the entire pool of credits is extended based on the latest purchase date. Checkout the [pricing](https://www.tooljet.com/pricing) page for more information. ## Buy Add-on Credits @@ -49,9 +49,9 @@ Follow these steps to buy add-on credits on your self-hosted deployment of ToolJ 1. Go to the Settings > License.
(Example URL - https://app.nexuscorp.com/settings/license) 2. Click on the **Get AI credits** button in the top-right corner.
- AI Credits + AI Credits 3. A payment modal will open where you can enter details such as the number of credits you want to purchase and any promo codes. After filling out the details, click the **Get AI credits** button at the bottom.
- AI Credits + AI Credits 4. Youโ€™ll then be redirected to the payment gateway. On successful payment, the credits will be added to your instance. ### Cloud Deployment @@ -59,16 +59,17 @@ Follow these steps to buy add-on credits on your self-hosted deployment of ToolJ Follow these steps to buy add-on credits on ToolJet Cloud: 1. Go to the Settings > Subscription.
- (Example URL - https://app.tooljet.ai/nexuscorp/settings/subscription) + (Example URL - https://app.tooljet.com/nexuscorp/settings/subscription) 2. Click the **Get AI credits** button.
- AI Credits + AI Credits 3. A payment modal will open where you can enter details such as the number of credits you want to purchase and any promo codes. After filling out the details, click the Get AI credits button at the bottom.
- AI Credits + AI Credits 4. Youโ€™ll then be redirected to the payment gateway. On successful payment, the credits will be added to your workspace. ## Credit Allocation ToolJet AI credits are allocated on a per builder per month basis according to the purchased license. The total credits from all builders, along with any add-on credits purchased, are pooled together and made available collectively. + - At **Instance Level** for [Self-Hosted](/docs/tj-setup/tj-deployment#self-hosted-tooljet) deployments. - At **Workspace Level** for [Cloud](/docs/tj-setup/tj-deployment#tooljet-cloud) deployments. @@ -97,11 +98,11 @@ Starting September 22, 2025, weโ€™re updating the AI credits system to introduce ### What's Changing -| | Before | After | -|---|--------|-------| -| Denomination | Minimum credit = 0.1 | Minimum credit = 1 | +| | Before | After | +| ------------ | ---------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| Denomination | Minimum credit = 0.1 | Minimum credit = 1 | | Credit Usage | Fixed credits per operation.
Eg. Every app generation would cost 10 credits. | Variable credits based on complexity of operation.
Eg. A small app could take 70 credits, and a large app could take 120 credits. | -| Credit Types | Monthly recurring credits included in your plan. | - Monthly recurring credits included in your plan.
- Optional purchase of additional credits which are valid for 1 year. | +| Credit Types | Monthly recurring credits included in your plan. | - Monthly recurring credits included in your plan.
- Optional purchase of additional credits which are valid for 1 year. | ### Updated Credit Allocation diff --git a/docs/versioned_docs/version-3.16.0-LTS/build-with-ai/prompting101.md b/docs/versioned_docs/version-3.16.0-LTS/build-with-ai/prompting101.md new file mode 100644 index 0000000000..96ca23ef14 --- /dev/null +++ b/docs/versioned_docs/version-3.16.0-LTS/build-with-ai/prompting101.md @@ -0,0 +1,253 @@ +--- +id: prompting101 +title: Prompting 101 +--- + +Prompting is how you communicate with ToolJet's AI to build internal applications. Think of it as giving detailed instructions to a highly skilled developer who understands the platform but needs context about your specific business needs. + +The AI then translates these requirements into a fully functional application using ToolJet's low code application builder. + +## Why Good Prompting Matters + +**The Challenge**: Generic prompts produce generic applications. Simply asking for "a CRM system" or "project management tool" results in basic, template-like apps that don't reflect your actual business processes.
+**The Solution**: Contextual prompting that provides business background, user needs, and specific workflows produces applications that feel purpose-built for your organization. + +### Real Impact Example + +#### Generic Prompt + +**Prompt:** "Build a customer management system"
+**Result**: Basic contact forms and lists that could work for anyone.
+ +#### Contextual Prompt + +**Prompt**: "Our design agency needs to track 50+ concurrent client projects, manage creative approval workflows, and prevent resource conflicts between our 12-person team..."
+**Result**: Specialized project management app with approval workflows, resource calendars, and client communication tools. + +## What ToolJet Already Handles + +Don't waste your prompt describing these - they're built into the platform: + +### ToolJet Automatically Provides + +
+ +
+ +- User authentication and login systems +- Role-based access control and permissions +- Database integration and data storage + +
+ +
+ +
+ +- API integrations with external services +- Security features and data encryption + +
+ +
+ +### Don't Include in Your Prompts + +
+ +
+ +- "Build user login and authentication" +- "Add role-based permissions" + +
+ +
+ +
+ +- "Create API integrations" +- "Include security features" + +
+ +
+ +### Instead Focus On + +
+ +
+ +- Business workflows and processes +- Manual data entry and forms +- Custom business logic + +
+ +
+ +
+ +- Specific reporting needs +- User interface requirements + +
+ +
+ +## The 3-Section Formula + +Structure your prompts with these three sections for best results: + +### 1. Business Context + +Explain why you need this tool and what problems it solves. +#### Good Example +"Our sales team currently tracks leads in spreadsheets across 5 different files, causing data inconsistencies and missed follow-ups. We need centralized lead management that prevents duplicate entries and gives visibility into our sales pipeline." + +#### Avoid +"Build a CRM system." + +### 2. User Personas + +Define who will use the tool and what they need to accomplish. + +#### Good Format + +- Sales Reps - Need to log new leads, update contact information, and track deal progress +- Sales Managers - Require pipeline visibility, team performance metrics, and forecast reporting +- Marketing Team - Must see lead sources, conversion rates, and campaign effectiveness + +### 3. User Flows & Features + +Describe how users will interact with the tool through specific workflows. + +#### Good Format + +- Lead Capture Flow - Import leads from various sources, assign to sales reps, set follow-up reminders +- Pipeline Management Flow - Move deals through stages, update probabilities, log interactions +- Reporting Flow - Generate weekly pipeline reports, track conversion metrics, analyze lead sources + +## Best Practices + +### Do This +- **Be Specific**
+ Instead of "customer management," say "client project tracking for our design agency" +- **Include Real Pain Points**
+ Mention actual problems like "version control issues" or "missed deadlines" +- **Think Workflows**
+ Describe the step-by-step process users will follow +- **Focus on Manual Processes**
+ Describe forms, data entry, and user interactions + +### Avoid This + +- Generic descriptions lacking proper use cases and context +- Feature lists without context ("needs forms, tables, and reports") +- Technical jargon that doesn't match your business needs +- Overly complex requirements that try to solve everything at once +- UI layout details - let the AI handle design decisions + +## How Long Should My Prompt Be? + +### Short Prompts (2-3 sentences per section) +- Best for: Simple tools with straightforward workflows +- Risk: May lack necessary detail for complex business logic + +### Medium Prompts (1 paragraph per section) +- Best for: Most internal tools +- Sweet spot: Provides enough context without overwhelming +- This length typically produces the most usable results + +### Long Prompts (2-3 paragraphs per section) + +- Best for: Complex workflows with multiple user types +- Risk: May create overly complicated interfaces + +:::tip Pro Tip +Specific prompts use fewer AI credits. Vague prompts make the AI work harder, consuming more credits as it tries to fill in the gaps. +::: + +## Scoping Your Application + +### Start Small, Then Iterate + +Begin with a simple version (3-4 pages) covering core workflows, then build additional features. This approach: +- Makes the application easier to test and refine +- Reduces complexity and potential errors +- Allows you to validate workflows before expanding + +## Complete Example: Before & After + +### Before (Generic) +"Build a project management system with tasks, deadlines, and team collaboration features." + +### After (Contextual) + +#### Business Context +Our marketing agency juggles 15+ client campaigns simultaneously, but project details are scattered across email threads, Google Docs, and Slack conversations, causing missed deliverables and confused team members about priorities. + +#### User Personas +- Account Managers - Need to track campaign progress, client approvals, and deliverable status +- Creative Team - Require clear briefs, asset approval workflows, and deadline visibility +- Project Directors - Must see resource allocation, campaign profitability, and team workload + +#### User Flows & Features + +- Campaign Setup Flow - Create project briefs, set deliverable milestones, assign team members and deadlines +- Asset Review Flow - Upload creative assets, collect client feedback, manage revision cycles with approval tracking +- Resource Planning Flow - View team capacity, assign tasks based on availability, track time allocation across campaigns + +## Real-World Examples + +### Example 1: Vendor Management Portal + +#### Business Context: +Our company maintains strategic partnerships with major technology vendors like AWS, IBM, Microsoft, and ServiceNow that are critical for our go-to-market strategy. Currently, we're managing partnership agreements, certification requirements, and co-sell opportunities across multiple spreadsheets and email threads, making it difficult to track revenue attribution or identify new collaboration opportunities. + +#### User Personas: +- Partnership Managers - Need to manage vendor relationships, track co-sell opportunities, and ensure certification compliance +- Business Development Team - Requires visibility into partner-driven revenue and joint sales opportunities +- Sales Teams - Must access partner resources, submit deal registrations, and leverage vendor relationships +- Executive Leadership - Needs partnership performance metrics and ROI assessment + +#### User Flows & Features: + +- Partnership Onboarding Flow - Register new vendor partnerships with tier classification, upload contract terms, set certification requirements, assign partnership managers +- Opportunity Management Flow - Log co-sell opportunities and deal registrations, track joint sales activities and revenue attribution, update opportunity status through sales pipeline +- Certification Tracking Flow - Monitor team certification progress, track renewal dates, maintain compliance documentation, generate certification reports +- Performance Analysis Flow - Generate partnership ROI reports, analyze co-sell effectiveness, create executive scorecards, track milestone achievement + +### Example 2: Accounts Payable System + +#### Business Context: + +Our financial services firm processes 800+ vendor invoices monthly across multiple business units, but we're managing approvals through email chains and tracking payments in disconnected spreadsheets. This creates compliance risks for audits, delayed vendor payments, and makes month-end close extremely difficult. + +#### User Personas: + +- Accounts Payable Clerks - Need to enter invoice details, match invoices to purchase orders, and schedule payments +- Department Managers - Must review and approve invoices within budget limits and ensure compliance with spending policies +- Finance Controllers - Require visibility into cash flow obligations, aging reports, and month-end accruals +- CFO/Finance Director - Needs high-level spend analytics, vendor relationship insights, and compliance oversight + +#### User Flows & Features: + +- Invoice Processing Flow - Record invoice details, match against purchase orders, flag discrepancies, assign expense coding +- Approval Workflow Management - Route invoices through approval chains based on thresholds, track approval status, escalate overdue approvals +- Payment Scheduling Flow - Schedule payments based on vendor terms, batch payments, track confirmations, maintain payment history +- Reporting & Analytics Flow - Generate aging reports, create spend analytics by department, produce audit trail reports, analyze vendor payment patterns + +## Quick Start Checklist + +Before submitting your prompt, verify you've included: + +- [ ] Business context explaining the current problem +- [ ] Specific pain points you're experiencing +- [ ] All relevant user personas and their needs +- [ ] Clear user flows describing how people will use the app +- [ ] Industry-specific terminology your team uses +- [ ] Realistic scope (start with 3-4 core pages) + +**Remember**: You don't need to format your prompt into rigid sections. The AI will understand your requirements regardless of structure - what matters most is the content and context you provide. diff --git a/docs/versioned_docs/version-3.16.0-LTS/build-with-ai/tooljet-mcp.md b/docs/versioned_docs/version-3.16.0-LTS/build-with-ai/tooljet-mcp.md index 979530422c..f3599af0d3 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/build-with-ai/tooljet-mcp.md +++ b/docs/versioned_docs/version-3.16.0-LTS/build-with-ai/tooljet-mcp.md @@ -1,7 +1,6 @@ --- id: tooljet-mcp title: ToolJet MCP - ---
@@ -42,7 +41,7 @@ Before you begin, you'll need: ### Step 1: Get an Access Token -Get an access token from your ToolJet instance. You'll need this token to authenticate the MCP server. Refer to the [ToolJet API](https://docs.tooljet.ai/docs/tooljet-api#enabling-tooljet-api) documentation for more details on how to generate an API token. +Get an access token from your ToolJet instance. You'll need this token to authenticate the MCP server. Refer to the [ToolJet API](https://docs.tooljet.com/docs/tooljet-api#enabling-tooljet-api) documentation for more details on how to generate an API token. ### Step 2: Configure Your AI Tool @@ -59,10 +58,7 @@ Follow the instructions below to configure your preferred AI tool to connect wit "mcpServers": { "tooljet": { "command": "npx", - "args": [ - "-y", - "@tooljet/mcp", - ], + "args": ["-y", "@tooljet/mcp"], "env": { "TOOLJET_ACCESS_TOKEN": "", "TOOLJET_HOST": "https://your-tooljet-instance.com" @@ -88,10 +84,7 @@ Replace `` with your ToolJet access token and update the host "mcpServers": { "tooljet": { "command": "npx", - "args": [ - "-y", - "@tooljet/mcp", - ], + "args": ["-y", "@tooljet/mcp"], "env": { "TOOLJET_ACCESS_TOKEN": "", "TOOLJET_HOST": "https://your-tooljet-instance.com" @@ -157,10 +150,7 @@ For more info on using MCP in VS Code, see the [Copilot documentation](https://c "mcpServers": { "tooljet": { "command": "npx", - "args": [ - "-y", - "@tooljet/mcp", - ], + "args": ["-y", "@tooljet/mcp"], "env": { "TOOLJET_ACCESS_TOKEN": "", "TOOLJET_HOST": "https://your-tooljet-instance.com" @@ -186,10 +176,7 @@ Replace `` with your ToolJet access token and update the host "mcpServers": { "tooljet": { "command": "npx", - "args": [ - "-y", - "@tooljet/mcp", - ], + "args": ["-y", "@tooljet/mcp"], "env": { "TOOLJET_ACCESS_TOKEN": "", "TOOLJET_HOST": "https://your-tooljet-instance.com" @@ -214,10 +201,7 @@ Replace `` with your ToolJet access token and update the host "mcpServers": { "tooljet": { "command": "npx", - "args": [ - "-y", - "@tooljet/mcp", - ], + "args": ["-y", "@tooljet/mcp"], "env": { "TOOLJET_ACCESS_TOKEN": "", "TOOLJET_HOST": "https://your-tooljet-instance.com" @@ -243,12 +227,7 @@ If you're using Windows, prefix the command with `cmd /c`: "mcpServers": { "tooljet": { "command": "cmd", - "args": [ - "/c", - "npx", - "-y", - "@tooljet/mcp", - ], + "args": ["/c", "npx", "-y", "@tooljet/mcp"], "env": { "TOOLJET_ACCESS_TOKEN": "", "TOOLJET_HOST": "https://your-tooljet-instance.com" @@ -264,24 +243,24 @@ ToolJet MCP provides several tools that AI assistants can use to interact with y ### User Management -| Tool | Description | -| --- | --- | -| `get-all-users` | Retrieve a list of all users in your ToolJet instance | -| `get-user` | Get detailed information about a specific user | -| `create-user` | Create a new user in a specified workspace | -| `update-user` | Update a user's profile information | -| `update-user-role` | Change a user's role within a workspace | +| Tool | Description | +| ------------------ | ----------------------------------------------------- | +| `get-all-users` | Retrieve a list of all users in your ToolJet instance | +| `get-user` | Get detailed information about a specific user | +| `create-user` | Create a new user in a specified workspace | +| `update-user` | Update a user's profile information | +| `update-user-role` | Change a user's role within a workspace | ### Workspace Management -| Tool | Description | -| --- | --- | +| Tool | Description | +| -------------------- | -------------------------------------------- | | `get-all-workspaces` | List all workspaces in your ToolJet instance | ### Application Management -| Tool | Description | -| --- | --- | +| Tool | Description | +| -------------- | ------------------------------------------------- | | `get-all-apps` | List all applications within a specific workspace | ## Example Usage @@ -293,8 +272,4 @@ Once connected, your AI assistant can perform tasks like: - "List all the apps in the Development workspace" - "Update the role of user@example.com to Admin in the Sales workspace" - For a full list of tools available, see the [GitHub README](https://github.com/ToolJet/tooljet-mcp). If you experience any issues, [submit a bug report](https://github.com/ToolJet/tooljet-mcp/issues/new). - - - diff --git a/docs/versioned_docs/version-3.16.0-LTS/contributing-guide/code-of-conduct.md b/docs/versioned_docs/version-3.16.0-LTS/contributing-guide/code-of-conduct.md index 03f7184d51..69b6915c0b 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/contributing-guide/code-of-conduct.md +++ b/docs/versioned_docs/version-3.16.0-LTS/contributing-guide/code-of-conduct.md @@ -3,7 +3,7 @@ id: code-of-conduct title: Contributor Code of Conduct --- -# Contributor Covenant Code of Conduct +# Contributor Covenant Code of Conduct ## Our Pledge @@ -19,21 +19,21 @@ appearance, race, religion, or sexual identity and orientation. Examples of behavior that contributes to creating a positive environment include: -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members Examples of unacceptable behavior by participants include: -* The use of sexualized language or imagery and unwelcome sexual attention or +- The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a +- Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities @@ -60,7 +60,7 @@ a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at hello@tooljet.com . All +reported by contacting the project team at support@tooljet.com . All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. @@ -78,4 +78,4 @@ available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.ht [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq \ No newline at end of file +https://www.contributor-covenant.org/faq diff --git a/docs/versioned_docs/version-3.16.0-LTS/contributing-guide/documentation-guidelines/style-guide.md b/docs/versioned_docs/version-3.16.0-LTS/contributing-guide/documentation-guidelines/style-guide.md index 65f70547da..c32a321b33 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/contributing-guide/documentation-guidelines/style-guide.md +++ b/docs/versioned_docs/version-3.16.0-LTS/contributing-guide/documentation-guidelines/style-guide.md @@ -3,7 +3,7 @@ id: style-guide title: Style Guide --- -Welcome to the ToolJet's Style Guide for creating clear, consistent, and accessible documentation. In this guide, you will find recommendations on text formatting, proper use of headers, code snippet styling, accessibility practices, and much more. +Welcome to the ToolJet's Style Guide for creating clear, consistent, and accessible documentation. In this guide, you will find recommendations on text formatting, proper use of headers, code snippet styling, accessibility practices, and much more. ## 1. Text Formatting Guidelines @@ -12,32 +12,36 @@ Different elements in your projects should be formatted consistently for clarity a. Italics are used for names given to Queries, Database Tables, and Components. **Examples:** -- Create a new query and rename it to *getEmployees*. -- Select **ToolJetDB** as the the data source and *Employees* table as the data source. -- Pass the returned data to the *allEmployees* component. + +- Create a new query and rename it to _getEmployees_. +- Select **ToolJetDB** as the the data source and _Employees_ table as the data source. +- Pass the returned data to the _allEmployees_ component. b. Bold is applied for Workspace Constants, Clickable Buttons, fx, Data Sources, and Components. **Examples:** -- Select the **Button** component and change its label to "Save". -- Drag andn drop a **Table** component and rename it to *todosTable*. -- Expand the query panel at the bottom and click on the **Add** button to create a new **REST API** query. +- Select the **Button** component and change its label to "Save". +- Drag andn drop a **Table** component and rename it to _todosTable_. +- Expand the query panel at the bottom and click on the **Add** button to create a new **REST API** query. c. Use Single Ticks for Inline Code and Triple Ticks for Multi-Line Code. **Examples:** -- The **fx** option next to the Loading state property can be used to add a loader to the component. For instance, you can enter `{{queries.getData.isLoading === true}}` to show the loader while the *getData* query is running. + +- The **fx** option next to the Loading state property can be used to add a loader to the component. For instance, you can enter `{{queries.getData.isLoading === true}}` to show the loader while the _getData_ query is running. - Use the below code to fetch data: + ```js // this code is wrapped in triple ticks const fetchData = async () => { -const response = await api.get('/users'); -console.log(response.data); + const response = await api.get("/users"); + console.log(response.data); }; ``` **Additional Items**: + - API Endpoints: Use code ticks for API endpoints (e.g., `GET /api/v1/resources`). - Labels or User Inputs: Use double quotes to highlight labels or user inputs (e.g., "Enter your username"). @@ -66,11 +70,11 @@ Ensure all tables are left-aligned for consistency. This aids in readability and **Example**: |
Variable
|
Description
|
How To Access
| |:---------- | :---------- | :------------ | -| chartTitle | Holds the title of the chart component. | Accessible dynamically with JS (for e.g., `{{components.chart1.chartTitle}}`). | -| xAxisTitle | Contains the title for the X-axis of the chart. | Accessible dynamically with JS (for e.g., `{{components.chart1.xAxisTitle}}`). | -| yAxisTitle | Contains the title for the Y-axis of the chart. | Accessible dynamically with JS (for e.g., `{{components.chart1.yAxisTitle}}`). | -| clickedDataPoints | Stores details about the data points that were clicked.| Accessible dynamically with JS (for e.g., `{{components.chart1.clickedDataPoints}}`). Each data point includes `xAxisLabel`, `yAxisLabel`, `dataLabel`, `dataValue`, and `dataPercent`. | - +| chartTitle | Holds the title of the chart component. | Accessible dynamically with JS (for e.g., `{{components.chart1.chartTitle}}`). | +| xAxisTitle | Contains the title for the X-axis of the chart. | Accessible dynamically with JS (for e.g., `{{components.chart1.xAxisTitle}}`). | +| yAxisTitle | Contains the title for the Y-axis of the chart. | Accessible dynamically with JS (for e.g., `{{components.chart1.yAxisTitle}}`). | +| clickedDataPoints | Stores details about the data points that were clicked.| Accessible dynamically with JS (for e.g., `{{components.chart1.clickedDataPoints}}`). Each data point includes `xAxisLabel`, `yAxisLabel`, `dataLabel`, `dataValue`, and `dataPercent`. | + - Use **bold** formatting for all column headers to differentiate them from the table content. - Avoid leaving empty cells in tables. If a cell doesnโ€™t have applicable content, use a placeholder like "N/A" or "โ€”" to indicate that the cell is intentionally blank. @@ -78,11 +82,11 @@ Ensure all tables are left-aligned for consistency. This aids in readability and ## 4. Admonitions -Admonitions are blocks of content that are designed to draw attention to specific points in your documentation. Use them sparingly to avoid overwhelming the user. Reserve admonitions for critical or cautionary information only. +Admonitions are blocks of content that are designed to draw attention to specific points in your documentation. Use them sparingly to avoid overwhelming the user. Reserve admonitions for critical or cautionary information only. - **Warning Admonitions**: Use `warning` type admonitions for high-risk actions or irreversible changes. This type of admonition should alert users to potential dangers or critical issues. -**Example**: +**Example**: :::warning Ensure you back up your data before upgrading to the latest version. ::: @@ -94,20 +98,21 @@ Ensure you back up your data before upgrading to the latest version. Preview the changes before pushing them. ::: -Overuse can dilute their impact. Use *italics* instead of admonitions whenever possible to emphasize important information instead of admonitions. This is a less intrusive way to draw attention to key details. +Overuse can dilute their impact. Use _italics_ instead of admonitions whenever possible to emphasize important information instead of admonitions. This is a less intrusive way to draw attention to key details. --- ## 5. Image Guidelines + Include images that closely align with real-world use cases. This makes the documentation more practical and relatable for the user. - Name images to reflect their purpose, such as `create-get-query.jpeg`. This helps maintain an organized file structure and makes it easier to locate specific images. - Align images to the left. This is the standard alignment that works well with most content layouts. - Set the image width to 100% to ensure it scales appropriately with different screen sizes. -- Keep image sizes under 300kb to balance load speed and quality. +- Keep image sizes under 300kb to balance load speed and quality. - Alt text should be a concise description of the image, providing the same information as the image itself. This is essential for accessibility and for users who rely on screen readers. - Skip phrases like "image of" or "graphic of" as screen readers handle this automatically. Focus on describing what is important about the image. -- Use `WEBP` or `PNG` formats for web images due to their balance between quality and file size. +- Use `WEBP` or `PNG` formats for web images due to their balance between quality and file size. - Use `SVG` for logos or icons to ensure scalability without loss of quality. --- @@ -120,14 +125,13 @@ Maintaining a clear and consistent tone throughout your documentation is crucial - Always proofread content using Grammarly or a similar tool before submitting a PR. This helps catch errors that might be missed during the initial writing process. - Use the active voice wherever possible to make the content more direct and engaging. Passive voice can make sentences longer and more difficult to understand. - --- ## 7. Bullet Points Use bullet points to break down steps or lists for clarity. This makes the content easier to scan and understand. -- Avoid using bullet points for a single item. If there is only one point to make, integrate it into the main text instead. +- Avoid using bullet points for a single item. If there is only one point to make, integrate it into the main text instead. - Ensure subpoints are correctly indented in markdown. This maintains the hierarchy and relationship between the main point and subpoints. - End bullet points that are complete sentences with a period. This helps maintain proper grammar and readability. - Do not insert blank lines between bullet points. This keeps the list compact and visually connected. @@ -142,13 +146,15 @@ Use the below language guidelines to ensure clarity and consistency. ### HTTP Formatting - All HTTP headers should be capitalized like this: `First-Letter-Capitalized`. This follows the standard convention and makes the headers easier to distinguish. - **Example**: + **Example**: + ``` Content-Type: application/json Authorization: Bearer ``` - HTTP blocks should be ready to run when pasted into tools like Postman or `cURL` commands. This means including all necessary components like headers, body, and method. **Example**: + ```bash curl -X POST https://api.example.com/resource \ -H 'Content-Type: application/json' \ @@ -159,24 +165,27 @@ curl -X POST https://api.example.com/resource \ ### JavaScript Guidelines - End statements with semicolons (`;`). While JavaScript can often infer semicolons, explicitly including them prevents potential issues, especially in complex code. **Example**: + ```javascript -const name = 'John'; +const name = "John"; console.log(name); ``` - Use single quotes for strings unless double quotes are necessary (e.g., to avoid escaping single quotes inside the string). **Example**: + ```javascript -const greeting = 'Hello, world!'; +const greeting = "Hello, world!"; ``` ### JSON Formatting - Indent JSON by 2 spaces. This is a standard practice that improves readability. **Example**: + ```json { - "name": "John Doe", - "age": 30, - "city": "New York" + "name": "John Doe", + "age": 30, + "city": "New York" } ``` @@ -185,13 +194,15 @@ const greeting = 'Hello, world!'; ### Shell Scripting - Break separate commands into distinct code blocks or chain them with `&&` for readability. For multi-line commands, use `\` to break lines. **Example**: + ```bash sudo apt-get update && \ sudo apt-get install -y curl ``` - Preface comments with `#` to explain the command's purpose. -**Example**: + **Example**: + ```bash # This command installs Node.js sudo apt-get install -y nodejs @@ -200,6 +211,7 @@ sudo apt-get install -y nodejs ### SQL Queries - Format SQL queries with keywords in uppercase, and break down long queries into multiple lines for better readability. **Example**: + ```sql SELECT name, age, city FROM users @@ -212,25 +224,22 @@ ORDER BY name ASC; ## 10. Linking Guidelines - Use root-relative paths (e.g., `/schema/postgres/tables.mdx`) instead of relative links to avoid broken links during file moves. This practice ensures that links remain functional even if files are moved within the directory structure. **Example**:
-`[Postgres tables](/schema/postgres/tables.mdx)` links to the Postgres tables page. - -- When linking to a specific section within a page, use anchor links to direct the user precisely where needed. **Example**:
-`ToolJet supports [multiple environments,](https://docs.tooljet.ai/docs/#multiple-environments)` takes the user directly to the specific section. + `[Postgres tables](/schema/postgres/tables.mdx)` links to the Postgres tables page. +- When linking to a specific section within a page, use anchor links to direct the user precisely where needed. **Example**:
+ `ToolJet supports [multiple environments,](https://docs.tooljet.com/docs/#multiple-environments)` takes the user directly to the specific section. --- ## 11. Semantics and Terminology -- Write in the second person (e.g., *you*, *your*). This makes the content more engaging and directly applicable to the reader. +- Write in the second person (e.g., _you_, _your_). This makes the content more engaging and directly applicable to the reader. - Ensure that case sensitivity is consistently applied across the document, particularly for technical terms or commands. This is important for commands and variables in code that are case-sensitive. -**Example**:
"`MyVariable` and `myvariable` are not the same." + **Example**:
"`MyVariable` and `myvariable` are not the same." - Define acronyms on first use and avoid using them excessively to maintain readability. This helps readers who may not be familiar with all acronyms. -**Example**:
"The Content Delivery Network (CDN) is used to deliver content to users efficiently." + **Example**:
"The Content Delivery Network (CDN) is used to deliver content to users efficiently." - Maintain consistent terminology throughout the document. If you start with "user," don't switch to "customer" later in the same context. --- - - -By following these guidelines, you can ensure that your documentation is clear, consistent, and easy to use for a wide range of audiences. \ No newline at end of file +By following these guidelines, you can ensure that your documentation is clear, consistent, and easy to use for a wide range of audiences. diff --git a/docs/versioned_docs/version-3.16.0-LTS/contributing-guide/setup/codespaces.md b/docs/versioned_docs/version-3.16.0-LTS/contributing-guide/setup/codespaces.md index c64aacb24a..c877dfa1b2 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/contributing-guide/setup/codespaces.md +++ b/docs/versioned_docs/version-3.16.0-LTS/contributing-guide/setup/codespaces.md @@ -3,13 +3,13 @@ id: codespaces title: GitHub Codespaces --- -Follow the steps below to set up ToolJet on GitHub Codespaces. We recommend reading our guide on [architecture](https://docs.tooljet.ai/docs/contributing-guide/setup/architecture) of ToolJet before proceeding. +Follow the steps below to set up ToolJet on GitHub Codespaces. We recommend reading our guide on [architecture](https://docs.tooljet.com/docs/contributing-guide/setup/architecture) of ToolJet before proceeding. Open the terminal and run the commands below. ## Setting up -### 1. Set up the environment +### 1. Set up the environment 1. Install Node.js ( version: v18.18.2 ) and npm (version: v9.8.1) @@ -31,7 +31,7 @@ sudo apt-get update sudo apt-get install postgresql-13 postgresql-contrib-13 ``` -To start the postgresql service run the below command: +To start the postgresql service run the below command: ``` sudo service postgresql start @@ -44,14 +44,14 @@ sudo su sudo -u postgres psql -\password postgres +\password postgres \q ``` ### 2. Set up environment variables -Create a `.env` file by running the command `touch .env`. More information on the variables that can be set is given in the [environment variables reference](https://docs.tooljet.ai/docs/setup/env-vars) +Create a `.env` file by running the command `touch .env`. More information on the variables that can be set is given in the [environment variables reference](https://docs.tooljet.com/docs/setup/env-vars) **For basic set-up you add the below env variables:** @@ -81,7 +81,7 @@ SERVE_CLIENT=true > > `LOCKBOX_MASTER_KEY` requires a 32 byte key. (Run `openssl rand -hex 32` to create a 32 byte secure random key) -### 3. Install and build dependencies +### 3. Install and build dependencies Make sure node version is set to 18.18.2 before running the below command: @@ -92,7 +92,6 @@ npm install --prefix frontend npm run build:plugins ``` - ### 4. Set up database ``` diff --git a/docs/versioned_docs/version-3.16.0-LTS/contributing-guide/slackcoc.md b/docs/versioned_docs/version-3.16.0-LTS/contributing-guide/slackcoc.md index e9a3f7e4d3..b1fd755e0a 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/contributing-guide/slackcoc.md +++ b/docs/versioned_docs/version-3.16.0-LTS/contributing-guide/slackcoc.md @@ -56,7 +56,7 @@ In addition, violations of this code outside our spaces may affect a personโ€™s ## Enforcement - Understand that speech and actions have consequences, and unacceptable behavior will not be tolerated. -- If you are the subject of, or witness to any violations of this Code of Conduct, please contact us via email at hello@tooljet.com or dm @navaneeth on slack. +- If you are the subject of, or witness to any violations of this Code of Conduct, please contact us via email at support@tooljet.com or dm @navaneeth on slack. - If violations occur, organizers will take any action they deem appropriate for the infraction, up to and including expulsion. :::info @@ -87,4 +87,4 @@ ToolJet's community of volunteer is very active and helpful, generally avoid tag #### 6. Use threads for discussion -To keep the main channel area clear, we request to use threads to keep an ongoing conversation organized. \ No newline at end of file +To keep the main channel area clear, we request to use threads to keep an ongoing conversation organized. diff --git a/docs/versioned_docs/version-3.16.0-LTS/data-sources/bigquery.md b/docs/versioned_docs/version-3.16.0-LTS/data-sources/bigquery.md index 9e089a99e5..86c14825a0 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/data-sources/bigquery.md +++ b/docs/versioned_docs/version-3.16.0-LTS/data-sources/bigquery.md @@ -5,8 +5,6 @@ title: BigQuery ToolJet can connect to **BigQuery** databases to run BigQuery queries. -
- ## Connection To establish a connection with the **BigQuery** data source, you can either click on the **+ Add new Data source** button located on the query panel or navigate to the **[Data Sources](/docs/data-sources/overview)** page from the ToolJet dashboard and choose BigQuery as the data source. @@ -14,6 +12,13 @@ To establish a connection with the **BigQuery** data source, you can either clic ToolJet requires the following to connect to your BigQuery: - **Private key** +- **Scope** + +:::warning +When entering multiple scopes, separate them using spaces. Using any other character may cause errors. + +Example: `https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/drive` +::: How to get a Private key? @@ -22,7 +27,7 @@ How to get a Private key? 3. Once you have created the service account after following the steps mentioned in the Google Cloud guide, create a new **Key** and download it in a JSON file. 4. Now, copy and paste the data from the downloaded JSON file into the **Private key** field in the BigQuery data source form. -BQ create +BQ create **The JSON file should look like this:** @@ -42,10 +47,6 @@ How to get a Private key? } ``` -
- -
- ## Querying BigQuery 1. Click on **+ Add** button of the query manager at the bottom panel of the editor. @@ -53,20 +54,12 @@ How to get a Private key? 3. Select the desired operation from the dropdown and enter the required parameters. 4. Click on the **Preview** button to preview the output or Click on the **Run** button to trigger the query. -
- -BQ query - -
+BQ query :::tip Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/app-builder/custom-code/transform-data) ::: -
- -
- ## Supported Operations - **[Query](#query)** @@ -91,13 +84,13 @@ This operation returns the data based on the **Query**. - **Query options** - **Query results options** -BQ query +BQ query ### List Datasets This operation returns the list of datasets. -BQ list datasets +BQ list datasets ### List Tables @@ -107,7 +100,7 @@ This operation returns the list of tables within a dataset. - **Dataset ID** -BQ list tables +BQ list tables ### Create Table @@ -119,7 +112,7 @@ This operation is used to create a table. - **Dataset ID** - **Options** -BQ create tables +BQ create tables **NOTE:** Visit https://github.com/googleapis/nodejs-bigquery/blob/main/samples/createTable.js for more info on schema. @@ -132,7 +125,7 @@ This operation is used to delete a table. - **Table ID** - **Dataset ID** -BQ delete tables +BQ delete tables ### Create View @@ -148,7 +141,7 @@ This operation is used to create a view. - **Query options** - **Query results options** -BQ create view +BQ create view ### Insert Record @@ -160,7 +153,7 @@ This operation is used to insert a record. - **Dataset ID** - **Rows** -BQ insert +BQ insert ### Delete Record @@ -174,7 +167,7 @@ Use this operation to delete a record. - **Query options** - **Query results options** -BQ delete +BQ delete :::warning NOTE: Be careful when deleting records in a table. If you omit the WHERE clause, all records in the table will be deleted! @@ -192,6 +185,4 @@ Use this operation to update a record. - **Condition** - **Query results options** -BQ update - -
+BQ update diff --git a/docs/versioned_docs/version-3.16.0-LTS/data-sources/custom-js.md b/docs/versioned_docs/version-3.16.0-LTS/data-sources/custom-js.md index b39f9633e7..2eb94109c6 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/data-sources/custom-js.md +++ b/docs/versioned_docs/version-3.16.0-LTS/data-sources/custom-js.md @@ -149,7 +149,7 @@ This ID will be longer than the one generated earlier, and it could look like "2 :::tip Resources -- You can also write custom JavaScript code to get the data from **External APIs** and manipulate the response for graphical representation. Here's the [tutorial](https://blog.tooljet.ai/build-github-stars-history-app-in-5-minutes-using-low-code/) on how we used custom JavaScript code to build an app using GitHub API. +- You can also write custom JavaScript code to get the data from **External APIs** and manipulate the response for graphical representation. Here's the [tutorial](https://blog.tooljet.com/build-github-stars-history-app-in-5-minutes-using-low-code/) on how we used custom JavaScript code to build an app using GitHub API. - [Import external libraries](/docs/how-to/import-external-libraries-using-runjs) using RunJS. - [Intentionally Fail](/docs/how-to/intentionally-fail-js-query) a RunJS query. - [Trigger query at specified intervals](/docs/how-to/run-query-at-specified-intervals) using RunJS. diff --git a/docs/versioned_docs/version-3.16.0-LTS/data-sources/mariadb.md b/docs/versioned_docs/version-3.16.0-LTS/data-sources/mariadb.md index 4c35a886a2..371123dd0a 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/data-sources/mariadb.md +++ b/docs/versioned_docs/version-3.16.0-LTS/data-sources/mariadb.md @@ -189,6 +189,6 @@ If you are having trouble connecting a MariaDB data source to ToolJet, try the f - Check the spelling and capitalization of your credentials. - Try restarting the ToolJet server. -If you are still having trouble, please contact [ToolJet support](mailto:hello@tooljet.com) or ask on [slack](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) for assistance. +If you are still having trouble, please contact [ToolJet support](mailto:support@tooljet.com) or ask on [slack](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) for assistance.
diff --git a/docs/versioned_docs/version-3.16.0-LTS/data-sources/restapi/authentication.md b/docs/versioned_docs/version-3.16.0-LTS/data-sources/restapi/authentication.md index 987521a16f..b814508006 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/data-sources/restapi/authentication.md +++ b/docs/versioned_docs/version-3.16.0-LTS/data-sources/restapi/authentication.md @@ -14,7 +14,7 @@ ToolJetโ€™s REST API data source supports Basic Authentication as the authentica 1. Go to the **Data Sources** page from the ToolJet dashboard, select **API** category on sidebar and choose the **REST API** data source. 2. In the **Base URL** field, enter the base URL. The base URL specifies the network address of the API service. For example, `http://localhost:3001/api/basic-auth` 3. Enter the **Headers** if required. Headers are key-value pairs to include as headers with REST API requests. -4. Select **Authentication** type as *Basic* from the dropdown. +4. Select **Authentication** type as _Basic_ from the dropdown. 5. Enter the **Username** and **Password** in the respective fields. The username and password are the credentials required to authenticate the user. ToolJet - Data source - REST API @@ -28,19 +28,20 @@ ToolJetโ€™s REST API data source supports Bearer Token as the authentication typ 1. Go to the **Data Sources** page from the ToolJet dashboard, select **API** category on sidebar and choose the **REST API** data source. 2. In the **Base URL** field, enter the base URL. The base URL specifies the network address of the API service. For example, `http://localhost:3001/api/bearer-auth` 3. Enter the **Headers** if required. Headers are key-value pairs to include as headers with REST API requests. -4. Select **Authentication** type as *Bearer* from the dropdown. +4. Select **Authentication** type as _Bearer_ from the dropdown. 5. Enter the **Token** in the field. The token is a security token that is issued by the authentication server to the client. The client then uses the token to access the protected resources hosted by the resource server. - + ToolJet - Data source - REST API -6. Now you have option to select the **SSL Certificate** if required. SSL certificate is used to verify the server certificate. By default, it is set to *None*. You can provide the **CA Certificate** or **Client Certificate** from the dropdown. - 1. **CA Certificate**: Requires a CA certificate to verify the server certificate. Copy the content of `server.crt` file and paste it in the **CA Cert** field. `server.crt` file is the certificate file that is used to verify the server certificate. - - ToolJet - Data source - REST API +6. Now you have option to select the **SSL Certificate** if required. SSL certificate is used to verify the server certificate. By default, it is set to _None_. You can provide the **CA Certificate** or **Client Certificate** from the dropdown. - 2. **Client Certificate**: Requires a client certificate to authenticate with the server. **client.key**, **client.crt**, and **server.crt** files are the certificate files that are used to authenticate with the server. Copy the content of **client.key** file and paste it in the **Client Key** field. Copy the content of **client.crt** file and paste it in the **Client Cert** field. Copy the content of **server.crt** file and paste it in the **CA Cert** field. - - ToolJet - Data source - REST API + 1. **CA Certificate**: Requires a CA certificate to verify the server certificate. Copy the content of `server.crt` file and paste it in the **CA Cert** field. `server.crt` file is the certificate file that is used to verify the server certificate. + + ToolJet - Data source - REST API + + 2. **Client Certificate**: Requires a client certificate to authenticate with the server. **client.key**, **client.crt**, and **server.crt** files are the certificate files that are used to authenticate with the server. Copy the content of **client.key** file and paste it in the **Client Key** field. Copy the content of **client.crt** file and paste it in the **Client Cert** field. Copy the content of **server.crt** file and paste it in the **CA Cert** field. + + ToolJet - Data source - REST API 7. Once you have configured the REST API data source, click on the **Save** button. @@ -71,11 +72,11 @@ Google Cloud Platform provides access to more than 350 APIs and Services that ca 1. Sign in to your [Google Cloud](https://cloud.google.com/) account, and from the console create a New Project. 2. Navigate to the **APIs and Services**, and then open the **OAuth consent screen** section from the left sidebar. -3. Enter the Application details and select the appropriate scopes for your application. We will select the profile and the email scopes. +3. Enter the Application details and select the appropriate scopes for your application. We will select the profile and the email scopes. 4. Once you have created the OAuth consent screen, Create new credentials for the **OAuth client ID** from the **Credentials** section in the left sidebar. 5. Select the application type, enter the application name, and then add the following URIs under Authorized Redirect URIs(Callback URL): - 1. `https://app.tooljet.ai/oauth2/authorize` (if youโ€™re using ToolJet cloud) - 2. `http://localhost:8082/oauth2/authorize` (if youโ€™re using ToolJet locally) + 1. `https://app.tooljet.com/oauth2/authorize` (if youโ€™re using ToolJet cloud) + 2. `http://localhost:8082/oauth2/authorize` (if youโ€™re using ToolJet locally) ToolJet - How To - REST API CallBack URL in OAuth 2.0 @@ -91,16 +92,16 @@ Let's follow the steps to authorize ToolJet to access your Google profile data: 1. Go to the **Data Sources** page from the ToolJet dashboard, select API category on sidebar and choose the **REST API** data source. 2. In the **Base URL** field, enter the base URL `https://www.googleapis.com/oauth2/v1/userinfo`; the base URL specifies the network address of the API service. -3. Select **Authentication** type as *OAuth 2.0* -4. Keep the default values for **Grant Type**, **Add Access Token To**, and **Header Prefix** i.e. *Authorization Code*, *Request Header*, and *Bearer* respectively. +3. Select **Authentication** type as _OAuth 2.0_ +4. Keep the default values for **Grant Type**, **Add Access Token To**, and **Header Prefix** i.e. _Authorization Code_, _Request Header_, and _Bearer_ respectively. 5. Enter **Access Token URL**: `https://oauth2.googleapis.com/token`; this token allows users to verify their identity, and in return, receive a unique access token. 6. Enter the **Client ID** and **Client Secret** that we generated from the [Google Console](http://console.developers.google.com/). 7. In the **Scope** field, enter `https://www.googleapis.com/auth/userinfo.profile`; Scope is a mechanism in OAuth 2.0 to limit an application's access to a user's account. Check the scopes available for [Google OAuth2 API here](https://developers.google.com/identity/protocols/oauth2/scopes#oauth2). 8. Enter **Authorization URL:** `https://accounts.google.com/o/oauth2/v2/auth`; the Authorization URL requests authorization from the user and redirects to retrieve an authorization code from identity server. 9. Create three **Custom Authentication Parameters:** - 1. **response_type**: code ( `code` refers to the Authorization Code) - 2. **client_id**: Client ID - 3. **redirect_url**: `http://localhost:8082/oauth2/authorize` if using ToolJet locally or enter this `https://app.tooljet.ai/oauth2/authorize` if using ToolJet Cloud. + 1. **response_type**: code ( `code` refers to the Authorization Code) + 2. **client_id**: Client ID + 3. **redirect_url**: `http://localhost:8082/oauth2/authorize` if using ToolJet locally or enter this `https://app.tooljet.com/oauth2/authorize` if using ToolJet Cloud. 10. Keep the default selection for **Client Authentication** and **Save** the data source. ToolJet - How To - REST API authentication using OAuth 2.0 @@ -111,8 +112,8 @@ Let's follow the steps to authorize ToolJet to access your Google profile data: 1. Go to the **Data Sources** page from the ToolJet dashboard, select API category on sidebar and choose the **REST API** data source. 2. In the **Base URL** field, enter the base URL `https://www.googleapis.com/oauth2/v1/userinfo`; the base URL specifies the network address of the API service. -3. Select **Authentication** type as *OAuth 2.0* -4. Select the **Grant Type** as *Client credentials*. +3. Select **Authentication** type as _OAuth 2.0_ +4. Select the **Grant Type** as _Client credentials_. 5. Enter **Access Token URL**: `https://oauth2.googleapis.com/token`; this token allows users to verify their identity, and in return, receive a unique access token. 6. Enter the **Client ID** and **Client Secret** that we generated from the [Google Console](http://console.developers.google.com/). 7. In the **Scope** field, enter `https://www.googleapis.com/auth/userinfo.profile`; Scope is a mechanism in OAuth 2.0 to limit an application's access to a user's account. Check the scopes available for [Google OAuth2 API here](https://developers.google.com/identity/protocols/oauth2/scopes#oauth2). @@ -125,6 +126,6 @@ Let's follow the steps to authorize ToolJet to access your Google profile data: Letโ€™s create a query to make a `GET` request to the URL, it will pop a new window and ask the user to authenticate against the API. - Add a new query and select the REST API data source from the dropdown -- In the **Method** dropdown select `GET` and enable the `Run query on application load?` -- Run the query. -- A new window will pop for authentication and once auth is successful, you can run the query again to get the user data like Name and Profile Picture. \ No newline at end of file +- In the **Method** dropdown select `GET` and enable the `Run query on application load?` +- Run the query. +- A new window will pop for authentication and once auth is successful, you can run the query again to get the user data like Name and Profile Picture. diff --git a/docs/versioned_docs/version-3.16.0-LTS/data-sources/restapi/configuration.md b/docs/versioned_docs/version-3.16.0-LTS/data-sources/restapi/configuration.md index d4a1c5073c..a68d88eb51 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/data-sources/restapi/configuration.md +++ b/docs/versioned_docs/version-3.16.0-LTS/data-sources/restapi/configuration.md @@ -12,7 +12,7 @@ ToolJet can establish connections with any available REST API endpoint, allowing To establish a connection with the REST API data source, you can either click on the **+ Add new Data source** button located on the query panel or navigate to the **[Data Sources](/docs/data-sources/overview)** page through the ToolJet dashboard. -ToolJet - Data source - REST API +ToolJet - Data source - REST API ToolJet requires the following to connect to a REST API data source: @@ -30,7 +30,7 @@ ToolJet requires the following to connect to a REST API data source: - **Body**: Key-value pairs to include as the body of the request. - **Cookies**: Key-value pairs to include as cookies with REST API requests. These cookies will be sent with every query created using this data source instance. -REST API - Credentials +REST API - Credentials @@ -58,7 +58,7 @@ ToolJet supports the following authentication types for REST API data sources: - Custom authentication parameters - Client authentication method -REST API - Authentication +REST API - Authentication @@ -71,7 +71,7 @@ ToolJet supports the following authentication types for REST API data sources: - **CA Certificate**: Requires a CA certificate to verify the server certificate. - **Client Certificate**: Requires a client certificate, client key, and CA certificate to authenticate with the server. -REST API - SSL Certificate +REST API - SSL Certificate diff --git a/docs/versioned_docs/version-3.16.0-LTS/data-sources/s3.md b/docs/versioned_docs/version-3.16.0-LTS/data-sources/s3.md index 7ec27d2b11..a30cd73f7a 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/data-sources/s3.md +++ b/docs/versioned_docs/version-3.16.0-LTS/data-sources/s3.md @@ -175,7 +175,7 @@ The presigned URLs are useful if you want your user/customer to be able to uploa aws s3 signed upload :::info -We built an app to view and upload files to AWS S3 buckets. Check out the complete tutorial **[here](https://blog.tooljet.ai/build-an-aws-s3-broswer-with-tooljet/)**. +We built an app to view and upload files to AWS S3 buckets. Check out the complete tutorial **[here](https://blog.tooljet.com/build-an-aws-s3-broswer-with-tooljet/)**. ::: diff --git a/docs/versioned_docs/version-3.16.0-LTS/data-sources/snowflake.md b/docs/versioned_docs/version-3.16.0-LTS/data-sources/snowflake.md index a46b52850b..fc03c99c09 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/data-sources/snowflake.md +++ b/docs/versioned_docs/version-3.16.0-LTS/data-sources/snowflake.md @@ -31,7 +31,7 @@ You can toggle on **Authentication required for all users** in the configuration Note: After completing the OAuth flow, the query must be triggered again to load the data. -ToolJet - Snowflake connection +ToolJet - Snowflake connection @@ -44,7 +44,7 @@ Note: After completing the OAuth flow, the query must be triggered again to load 3. Select the **SQL Mode** form the dropdown and enter the query. 4. Click on the **Preview** button to preview the output or Click on the **Run** button to trigger the query. -ToolJet - Snowflake query +ToolJet - Snowflake query ```sql select * from "SNOWFLAKE_SAMPLE_DATA"."WEATHER"."DAILY_14_TOTAL" limit 10; diff --git a/docs/versioned_docs/version-3.16.0-LTS/data-sources/stripe.md b/docs/versioned_docs/version-3.16.0-LTS/data-sources/stripe.md index b76f0d4f2e..c5fa7b4e82 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/data-sources/stripe.md +++ b/docs/versioned_docs/version-3.16.0-LTS/data-sources/stripe.md @@ -6,7 +6,7 @@ title: Stripe ToolJet can connect to your Stripe account to read or write customers' and payments' data. :::info -Check out the **[Stripe Refund App tutorial](https://blog.tooljet.ai/build-a-stripe-refund-tool-using-low-code/)** +Check out the **[Stripe Refund App tutorial](https://blog.tooljet.com/build-a-stripe-refund-tool-using-low-code/)** :::
diff --git a/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/branching-pr.md b/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/branching-pr.md new file mode 100644 index 0000000000..cb466b85de --- /dev/null +++ b/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/branching-pr.md @@ -0,0 +1,298 @@ +--- +id: branching-and-pr +title: Branching and Pull Requests +--- + +:::warning BETA VERSION +**Branching and Pull Requests is currently in beta** and not recommended for production use. +::: + +Branching enables multiple developers to work on an isolated copy of the application (their own branch) where changes don't affect others or the live production application until explicitly merged. Branching helps in protecting production quality through mandatory code reviews before changes go live and provide complete change history through Git integration, making every modification traceable and reversible. + +When multiple developers need to build features or fix bugs in the same application, they need a way to work independently without disrupting each other or risking production stability. Branching solves this by: +- Protecting production quality through mandatory code reviews before changes go live +- Enabling parallel development, so teams can maintain speed without compromising on safety +- Providing complete change history through Git integration, making every modification traceable and reversible + +**When to Enable Branching?** + +Enable branching at the workspace level when: +- Multiple developers work on the same applications +- You need formal approval workflows before production changes +- Change tracking and review are organizational requirements + +## Understanding Branches and Versions + +### Master Branch and Sub-Branches + +- **Master Branch**: The main branch containing your live application and its linear development history. The master branch is lockedโ€”changes can only enter through approved pull requests, never through direct edits. +- **Sub-Branches**: Independent copies created from the master branch where developers make changes freely. Each sub-branch is isolated until merged back to master. + +### Versions as Milestones +Versions exist only on the master branch, marking stable points in your application's development: +- **Draft Version**: The current working state on master (one active draft at a time). +- **Saved Version**: A finalized milestone, automatically committed to Git. +- **Released Version**: A version released from the production environment. + +Sub-branches don't have versions, they themselves are working copies of a specific version. + +## Setting Up Branching + +To enable branching you would need to configure the git sync. Follow the [Git Sync Guide](/docs/development-lifecycle/gitsync/overview) to configure it. Once Git Sync is configure then the branching is enabled by default (only for the beta version). Specify your Default Branch Name (typically "master" or "main"). This becomes your master branch where live applications reside. + +:::warning NOTE +ToolJet supports branching **only over Git HTTPS**. SSH is not supported. +::: + +## Creating and Managing Branches + +### Create a New Branch + +1. Open your application +2. Click the branch dropdown in the top navigation +3. Select **+ Create New Branch**

+ GitSync

+4. Enter a descriptive branch name

+ GitSync

+5. Choose the version to branch from (typically the current draft) +6. Click **Create Branch**. + +Your new branch is immediately available in ToolJet and automatically synced to Git. + +### Switch Between Branches + +1. Click the branch dropdown in the top navigation and then click on **Switch Branch**

+ GitSync

+2. Select any active branch to switch +3. All your edits now apply to the selected branch + + + +## Working with Pull Requests + +Pull requests are how changes move from sub-branches to the master branch. All pull request management happens in your Git provider (GitHub, GitLab, etc.). + +### Push Changes to Git + +Available only on sub-branches (master is locked): + +1. Make your changes in ToolJet +2. Click **Commit** button in the top navigation +3. Add a commit message describing your changes
+ GitSync +4. Click **Commit Changes** + +Changes are committed to your current branch in Git. + +### Pull Changes from Git + +**On Master Branch:** + +1. Ensure you're on the master branch with a draft version active +2. Click **Pull Commit** +3. Current draft is replaced with Git content + +### Create a Pull Request + +A pull request is created in your Git provider, and the merge also happens there. All changes must be committed to Git to keep your application in sync. + +1. In ToolJet: Push your branch changes to Git + - Click **Commit** button in the top navigation + - Add a commit message describing your changes
+ GitSync + - Click **Commit Changes** +2. Create Pull Request + - After committing your changes, click the branch name in the navigation bar. + - Click the **Create pull request** button.
+ GitSync + - Youโ€™ll be redirected to your Git provider to create the pull request. To keep the flow consistent, some fields are pre-filled. You can edit them or directly create the PR. +3. Review and Approval: + - Add reviewers and description + - Submit for review + - Reviewers examine changes in Git + - Address any feedback or conflicts + - Approver merges the pull request +4. In ToolJet: Pull merged changes into master + - Switch to the master branch and create a draft version + - Click **Pull Commit** + - Changes replace the current draft version + + + + + +## Creating Your First Released Version + +**Scenario**: You've built a new application and need to release version 1. + +1. Create your application (master branch and draft v1 created automatically) +2. Create a sub-branch from draft v1: developer/initial-build +3. Develop your application on the branch +4. Push changes to Git +5. In Git: Create pull request, get approval, merge to master +6. In ToolJet: Pull from Git into master branch +7. Save draft v1 as version v1 (auto-commits to Git) +8. Promote v1 to staging for testing +9. Promote v1 to production +10. Release v1 + +### Parallel Development + +**Scenario**: Two developers need to work on different features simultaneously. + +1. Developer A creates branch `johnson/inventory` from current master +2. Developer B creates branch `taylor/search` from current master +3. Both developers work independently and push their changes +4. In Git: + - Both create pull requests to master + - Resolve any merge conflicts + - Manager approves both PRs + - Merge both branches to master +5. In ToolJet: + - Create draft v2 from v1 (if no active draft exists) + - Pull changes from Git into draft v2 + - Save v2 as a version + - Promote and release v2 + +### Patching a Released Version + +**Scenario**: Version 2 is released, version 3 is in draft, but v2 has a production bug requiring immediate fix. + +Existing versions: +- v1 (Released) +- v2 (Released, needs patch) +- v3 (Draft, ongoing work) + +Steps: +1. Save draft v3 as v3 (preserves ongoing work) +2. Create new draft v2.1 from v2 +3. Create branch `robert/patch` from v2 +4. Make fixes on the patch branch and commit to Git +5. In Git: Create PR, get approval, merge to master +6. In ToolJet: Pull changes into draft v2.1 +7. Save v2.1 as a version +8. Promote v2.1 to staging, then production +9. Release v2.1 + + + +## Creating and Saving Versions + +### Creating Draft Versions + +On Master Branch Only: +- One active draft version at a time +- Create new draft from any saved version +- Draft represents the current working state + +To create a new draft: +1. Switch to master branch +2. Click version dropdown โ†’ Create Draft +3. Select the version to draft from +4. Click Create + +### Saving Versions + +When you save a draft version: +1. Switch to master branch with active draft +2. Click Save Version +3. Enter version number (e.g., v2, v2.1) +4. Click Save +5. Version is automatically committed to Git +6. Saved versions cannot be edited (locked state) + +**Important**: Once saved, no further commits are allowed on that version. Saved versions represent completed milestones. + + + + + + + +## Branch Permissions + +| Action | Master Branch | Sub-Branch | +|--------|---------------|------------| +| Direct edits | โŒ Only via PR | โœ… Yes | +| Push to Git | โŒ Not needed | โœ… Yes | +| Pull from Git | โœ… Draft only | โœ… Open branches | +| Rename | โŒ Git only | โŒ Git only | +| Close | โŒ Never | โŒ Git only | + + + + \ No newline at end of file diff --git a/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/cicd/gitsync-api.md b/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/cicd/gitsync-api.md index fdd3c7b849..024a279802 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/cicd/gitsync-api.md +++ b/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/cicd/gitsync-api.md @@ -25,7 +25,7 @@ The following APIs are available to manage git sync within your CI/CD pipeline. ### Add GitHub HTTPS Git Configuration - **Description:** Configure GitHub HTTPS settings for an organization by associating a GitHub App and repo. - - **URL:** `/api/ext/organization/git` + - **URL:** `/api/ext/organizations/git` - **Method:** POST - **Authorization:** `Basic ` - **Content-Type:** `application/json` diff --git a/docs/versioned_docs/version-3.16.0-LTS/app-builder/import-export-apps.md b/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/import-export/import-export-apps.md similarity index 98% rename from docs/versioned_docs/version-3.16.0-LTS/app-builder/import-export-apps.md rename to docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/import-export/import-export-apps.md index cd735ac09a..565404b5f3 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/app-builder/import-export-apps.md +++ b/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/import-export/import-export-apps.md @@ -1,6 +1,6 @@ --- id: importing-exporting-applications -title: Import and Export Applications +title: Applications --- This documentation explains the process of exporting and importing applications in ToolJet. diff --git a/docs/versioned_docs/version-3.16.0-LTS/app-builder/modules/import-export.md b/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/import-export/import-export-modules.md similarity index 98% rename from docs/versioned_docs/version-3.16.0-LTS/app-builder/modules/import-export.md rename to docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/import-export/import-export-modules.md index e6f79e2d0a..5ec8efaf03 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/app-builder/modules/import-export.md +++ b/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/import-export/import-export-modules.md @@ -1,6 +1,6 @@ --- id: import-export-modules -title: Import and Export Modules +title: Modules --- ToolJet allows you to export and import modules, making it easy to share, reuse, or migrate modules across different workspaces. diff --git a/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/import-export/import-export-workflows.md b/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/import-export/import-export-workflows.md new file mode 100644 index 0000000000..27bee2492c --- /dev/null +++ b/docs/versioned_docs/version-3.16.0-LTS/development-lifecycle/import-export/import-export-workflows.md @@ -0,0 +1,36 @@ +--- +id: import-export-workflows +title: Workflows +--- + +
+ +
+ Self Hosted +
+ +
+ +ToolJet supports exporting workflows as JSON files and importing them into any ToolJet workspace. + +## Exporting Workflows + +To export a workflow from your ToolJet workspace: +1. Navigate to the **Workflows** tab from the dashboard. +2. Click on the kebab menu (three vertical dots) at the top-right corner of the workflow you want to export. +3. Select **Export Workflow** from the menu. A `.json` file containing the workflow configuration will be downloaded to your system. + Navigate to Workflow Section + +This file can later be imported into any ToolJet workspace to replicate the same workflow setup. + +## Importing Workflows + +To import a workflow from your ToolJet workspace: +1. Navigate to the **Workflows** tab from the dashboard. +2. Click on the kebab menu (three vertical dots) next to the **Create new workflow** button and select **Import from device**. + Navigate to Workflow Section +3. Choose the `.json` file of the workflow you want to import from your local system. +4. Click **Import workflow** button to complete the import process. + Navigate to Workflow Section + +Once imported, the workflow will appear in your workspace and can be edited or triggered like any other workflow. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.16.0-LTS/getting-started/quickstart-guide.md b/docs/versioned_docs/version-3.16.0-LTS/getting-started/quickstart-guide.md index c420e7005b..4df28da2b3 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/getting-started/quickstart-guide.md +++ b/docs/versioned_docs/version-3.16.0-LTS/getting-started/quickstart-guide.md @@ -3,11 +3,10 @@ id: quickstart-guide title: Quickstart Guide --- - This quickstart guide walks you through the process of creating an employee directory app using ToolJet. The application lets users track and update employee details while working with core features of the platform, all within a user-friendly interface. Here are the step-by-step instructions: -**[1. Create Your First Application](#1-create-your-first-application)**
-**[2. Create a Database Table](#2-create-a-database-table)**
+**[1. Create Your First Application](#1-create-your-first-application)**
+**[2. Create a Database Table](#2-create-a-database-table)**
**[3. Create a Query to Fetch Data](#3-create-a-query-to-fetch-data)**
**[4. Bind Queried Data to the UI](#4-bind-queried-data-to-the-ui)**
**[5. Create a Query to Add Data](#5-create-a-query-to-add-data)**
@@ -18,29 +17,30 @@ This quickstart guide walks you through the process of creating an employee dire ### 1. Create Your First Application -To begin, create a free **[ToolJet](https://www.tooljet.ai/signup)** account and follow the steps below. +To begin, create a free **[ToolJet](https://www.tooljet.com/signup)** account and follow the steps below.

-- Click on the **Create new app** button on the dashboard. Name your application as "Employee Directory". -- Click and drag a **[Table](/docs/widgets/table)** component on the canvas. Optionally, you can also design a header by adding more components. +- Click on the **Create new app** button on the dashboard. Name your application as "Employee Directory". +- Click and drag a **[Table](/docs/widgets/table)** component on the canvas. Optionally, you can also design a header by adding more components.
### 2. Create a Database Table -Now, create a new table in **[ToolJetโ€™s Database](/docs/tooljet-db/tooljet-database/)** to store employee records. + +Now, create a new table in **[ToolJetโ€™s Database](/docs/tooljet-db/tooljet-database/)** to store employee records.

-- Name the table *employees*, then add the following columns: first_name, last_name, email, phone, department, position, joining, and status. +- Name the table _employees_, then add the following columns: first_name, last_name, email, phone, department, position, joining, and status. - Add a few employee records in the database table as placeholder data.
@@ -58,10 +58,10 @@ To display employees in the application, you will first have to fetch the data f - Click on the **Add** button in the **[Query Panel](/docs/app-builder/query-panel/)** to create a new query. - Select **ToolJet Database** as the data source for the query. -- Rename the query to *getEmployees*. -- Choose *employees* as the Table name, and *List rows* as the Operation. +- Rename the query to _getEmployees_. +- Choose _employees_ as the Table name, and _List rows_ as the Operation. - Click on the **Run** button to fetch data. -- To automatically run the query when the app starts, enable the toggle for *Run this query on application load* from the query setting. +- To automatically run the query when the app starts, enable the toggle for _Run this query on application load_ from the query setting. @@ -69,7 +69,7 @@ To display employees in the application, you will first have to fetch the data f ### 4. Bind Queried Data to the UI -Now, you need to bind the data returned by the *getEmployees* query with the Table created in the first step. +Now, you need to bind the data returned by the _getEmployees_ query with the Table created in the first step.
@@ -80,10 +80,14 @@ Now, you need to bind the data returned by the *getEmployees* query with the Tab - Under the Data property, enter the below code: ```js -{{queries.getEmployees.data}} +{ + { + queries.getEmployees.data; + } +} ``` -Now the Table component is filled with the data returned by the *getEmployees* query. +Now the Table component is filled with the data returned by the _getEmployees_ query.
@@ -91,7 +95,7 @@ Now the Table component is filled with the data returned by the *getEmployees* q ### 5. Create a Query to Add Data -In the bottom-right corner of the Table component, there is a **+(Add new row)** button that opens an auto-generated form to add new data to the Table. Follow the steps below to create an *addEmployees* query and execute it when you click the **Save** button on the auto-generated form. +In the bottom-right corner of the Table component, there is a **+(Add new row)** button that opens an auto-generated form to add new data to the Table. Follow the steps below to create an _addEmployees_ query and execute it when you click the **Save** button on the auto-generated form.
@@ -99,8 +103,8 @@ In the bottom-right corner of the Table component, there is a **+(Add new row)**
- Click on the **Add** button in the query panel, and select **ToolJet Database** as the data source. -- Select *employees* as the Table name, and Create row as the Operation. -- Rename the query to *addEmployees*. +- Select _employees_ as the Table name, and Create row as the Operation. +- Rename the query to _addEmployees_. - Click on **Add Column** to add the required columns. - Enter the code below for **first_name** and **email** column keys: @@ -111,13 +115,14 @@ In the bottom-right corner of the Table component, there is a **+(Add new row)** ``` Frame all the remaining keys in the same format. +
### 6. Use Events to Trigger Queries -The *addEmployees* query should run when you click the **Save** button on the auto-generated form. The Table component should then reload and display the updated data whenever a new employee is added. Follow the steps below to set up this functionality using events. +The _addEmployees_ query should run when you click the **Save** button on the auto-generated form. The Table component should then reload and display the updated data whenever a new employee is added. Follow the steps below to set up this functionality using events.
@@ -125,9 +130,9 @@ The *addEmployees* query should run when you click the **Save** button on the au
- Click on the Table component, and click on **New event handler** in the properties panel. -- Choose Add new rows as the Event, Run Query as the Action, and *addEmployees* as the Query. -- In the *addEmployees* query's configuration, under the settings tab, click on **New event handler** to add a new event. -- Select Query Success as the Event, Run Query as the Action, and *getEmployees* as the Query. +- Choose Add new rows as the Event, Run Query as the Action, and _addEmployees_ as the Query. +- In the _addEmployees_ query's configuration, under the settings tab, click on **New event handler** to add a new event. +- Select Query Success as the Event, Run Query as the Action, and _getEmployees_ as the Query. Now, when you click the **+ (Add new row)** button on the Table component, enter the employee details, and click **Save**, the data will be added to the database and automatically reflected in the Table component on the UI. @@ -148,8 +153,6 @@ The preview, release and share buttons are at the top-right of the App-Builder. - Once the development is done and you are ready to use the application, click on the **Release** button to deploy the app. - Finally, share your application with your end users using the **Share** button. -Congratulations on completing the tutorial! You've successfully built an employee directory application and, in the process, learnt the fundamentals of ToolJet. +Congratulations on completing the tutorial! You've successfully built an employee directory application and, in the process, learnt the fundamentals of ToolJet.
- - diff --git a/docs/versioned_docs/version-3.16.0-LTS/how-to/pass-values-in-rest-api.md b/docs/versioned_docs/version-3.16.0-LTS/how-to/pass-values-in-rest-api.md index a371f9b3cd..3a20a27a86 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/how-to/pass-values-in-rest-api.md +++ b/docs/versioned_docs/version-3.16.0-LTS/how-to/pass-values-in-rest-api.md @@ -7,13 +7,14 @@ This guide gives you an overview of how you can pass values in a REST API Query
-## Raw JSON +## Raw JSON In the following JSON code, the `${}` syntax is used for JavaScript string interpolation within template literals (also called template strings). This allows dynamic values from JavaScript variables or expressions to be injected directly into the string. ```javascript -{{ - `{ +{ + { + `{ "contents": [{ "parts": [{ "text": "Generate the following content for this image in markdown format: @@ -27,8 +28,9 @@ In the following JSON code, the `${}` syntax is used for JavaScript string inter } },], },], - }` - }} + }`; + } +} ```
@@ -49,7 +51,7 @@ In this example, simple key-value pairs are entered in the provided input fields
-To see REST API queries in action, check out the following tutorials: +To see REST API queries in action, check out the following tutorials: -1. **[Gemini AI Content Generator](https://blog.tooljet.ai/build-an-ai-content-generator-using-gemini-api-and-tooljet-in-10-minutes/)** -2. **[Open AI Audio Transcriber](https://blog.tooljet.ai/building-an-audio-transcriber-and-analyzer-using-tooljet-and-openai/)** \ No newline at end of file +1. **[Gemini AI Content Generator](https://blog.tooljet.com/build-an-ai-content-generator-using-gemini-api-and-tooljet-in-10-minutes/)** +2. **[Open AI Audio Transcriber](https://blog.tooljet.com/building-an-audio-transcriber-and-analyzer-using-tooljet-and-openai/)** diff --git a/docs/versioned_docs/version-3.16.0-LTS/how-to/use-axios.md b/docs/versioned_docs/version-3.16.0-LTS/how-to/use-axios.md index 4ac9556aae..b7cab59b7b 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/how-to/use-axios.md +++ b/docs/versioned_docs/version-3.16.0-LTS/how-to/use-axios.md @@ -2,6 +2,7 @@ id: use-axios-in-runjs title: Use Axios in RunJS --- +
ToolJet supports three libraries: **Moment.js**, **Lodash**, and **Axios**. This guide focuses on using the Axios library with RunJS queries. **[Axios](https://axios-http.com/docs/intro)** is a promise-based HTTP client for making requests to your own or external servers. It supports various request types like `GET`, `POST`, `PUT/PATCH`, and `DELETE`. @@ -21,10 +22,10 @@ var url = "https://jsonplaceholder.typicode.com/users/1"; var data = (await axios.get(url)).data; -return data +return data; ``` -*This code sets up a URL variable, makes a GET request to the API, and returns the data. Preview the query to see the API's response.* +_This code sets up a URL variable, makes a GET request to the API, and returns the data. Preview the query to see the API's response._
@@ -43,18 +44,18 @@ return data ```javascript var url = "https://jsonplaceholder.typicode.com/users"; -var data = axios.post(url,{ +var data = axios.post(url, { id: 11, name: "Shubhendra", username: "camelcaseguy", - email: "shubhendra@tooljet.com",}) + email: "shubhendra@tooljet.com", +}); -return data +return data; ``` This POST request sends user details to the server. The server's response, as shown below, includes **Status: 201** indicating successful resource creation. -
Use Axios in RunJS @@ -62,7 +63,6 @@ This POST request sends user details to the server. The server's response, as sh
To see Axios in action in a project, check out this tutorial: -**[Build GitHub star history tracker](https://blog.tooljet.ai/build-github-stars-history-app-in-5-minutes-using-low-code/)**. +**[Build GitHub star history tracker](https://blog.tooljet.com/build-github-stars-history-app-in-5-minutes-using-low-code/)**. - -
\ No newline at end of file +
diff --git a/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/gemini.md b/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/gemini.md index 55866d8a1a..fc263eafbc 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/gemini.md +++ b/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/gemini.md @@ -20,9 +20,6 @@ Use this operation to generate text based on the prompt, system instructions, an **Required Parameters** - **Model**: Specifies the Gemini model to use for generating responses. - - Gemini 1.5 Flash - - Gemini 1.5 Flash-8B - - Gemini 1.5 Pro - Gemini 2.0 Flash - **Prompt**: The main user input for generating responses. @@ -75,9 +72,6 @@ Use this operation for a chat-like conversation, where the model responds based **Required Parameters** - **Model**: Specifies the Gemini model to use for generating responses in the chat. - - Gemini 1.5 Flash - - Gemini 1.5 Flash-8B - - Gemini 1.5 Pro - Gemini 2.0 Flash - **User Prompt**: The user's question or request that the model will respond to. diff --git a/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/gmail.md b/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/gmail.md index c7919f8607..dbbd9e2383 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/gmail.md +++ b/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/gmail.md @@ -17,7 +17,7 @@ You can toggle on **Authentication required for all users** in the configuration Note: After completing the OAuth flow, the query must be triggered again to load the data. -Gmail Configuration +Gmail Configuration ## Supported Operations diff --git a/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/google-calendar.md b/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/google-calendar.md index 360d7c40fa..358bbbaff1 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/google-calendar.md +++ b/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/google-calendar.md @@ -17,7 +17,7 @@ You can toggle on **Authentication required for all users** in the configuration Note: After completing the OAuth flow, the query must be triggered again to load the data. -Hugging Face Configuration +Hugging Face Configuration ### Generating Client ID and Client Secret diff --git a/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/hubspot.md b/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/hubspot.md index 4fea39d0d6..dda2f35cee 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/hubspot.md +++ b/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/hubspot.md @@ -14,7 +14,7 @@ To connect HubSpot with ToolJet, you need the following credentials: You also need to define the scope(s) for the operations you plan to perform. You can refer to the [HubSpot guide](https://developers.hubspot.com/docs/guides/apps/private-apps/overview) for detailed steps to generate these credentials. -HubSpot Configuration +HubSpot Configuration You can toggle on Authentication required for all users in the configuration. When enabled, users will be redirected to the OAuth consent screen the first time a query from this data source is triggered in the application. This ensures each user connects their own HubSpot account securely. diff --git a/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/microsoft-graph.md b/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/microsoft-graph.md index 415c22623b..26598c4886 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/microsoft-graph.md +++ b/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/microsoft-graph.md @@ -20,7 +20,7 @@ You can enable the **Authentication required for all users** toggle in the confi **Note**: After completing the OAuth flow, the query must be triggered again to fetch data from Microsoft Graph. -Microsoft Graph Configuration +Microsoft Graph Configuration ## Supported Operations diff --git a/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/prometheus.md b/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/prometheus.md new file mode 100644 index 0000000000..f8091f725b --- /dev/null +++ b/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/prometheus.md @@ -0,0 +1,66 @@ +--- +id: marketplace-plugin-prometheus +title: Prometheus +--- + +ToolJet integrates with Prometheus to help you fetch and display metrics in your app. You can use this plugin to run PromQL queries and show real-time or historical data from your Prometheus server. Itโ€™s useful for building internal dashboards to monitor systems and track performance. + +:::note +Before following this guide, it is assumed that you have already completed the process of **[Using Marketplace plugins](/docs/marketplace/marketplace-overview#using-marketplace-plugins)**. +::: + +## Connection + +Follow the steps in the [Prometheus documentation](https://prometheus.io/docs/prometheus/latest/getting_started/) to set up and run a Prometheus server. + +To connect Prometheus with ToolJet, youโ€™ll need the following details: + +- **Prometheus server URL** +- **Username** +- **Password** +- **CA certificate** + +Configuring Prometheus in ToolJet + +Once connected, you can start using instant and range queries to fetch metric data from your server. + +## Supported Operations + +- [Instant Query with PromQL](#instant-query-with-promql) +- [Range Query with PromQL](#range-query-with-promql) + +### Instant Query with PromQL + +Fetches the current value of a metric at a single point in time. + +**Required Parameters** + +- **Query**: A valid PromQL expression to fetch the metric. +- **Request method**: Defines how the request is sent (GET or POST) + +**Optional Parameter** + +- **Time**: Specific timestamp to evaluate the query against. +- **Timeout**: Maximum duration the query is allowed to run before timing out. +- **Limit**: Restricts the number of results returned. + +Instant Query with PromQL in ToolJet + +### Range Query with PromQL + +Retrieves metric data over a specified time range. + +**Required Parameters** + +- **Query**: A valid PromQL expression to fetch the metric. +- **Start**: Start timestamp of the time range. +- **End**: End timestamp of the time range. +- **Step**: Interval between data points within the time range. +- **Request method**: Defines how the request is sent (GET or POST). + +**Optional Parameter** + +- **Timeout**: Maximum duration the query is allowed to run before timing out. +- **Limit**: Restricts the number of results returned. + +Range Query with PromQL in ToolJet diff --git a/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/salesforce.md b/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/salesforce.md index f954851325..02b7f5b1b5 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/salesforce.md +++ b/docs/versioned_docs/version-3.16.0-LTS/marketplace/plugins/salesforce.md @@ -25,7 +25,7 @@ You can toggle on **Authentication required for all users** in the configuration Note: After completing the OAuth flow, the query must be triggered again to load the data. -Salesforece Install +Salesforece Install ## Querying Salesforce diff --git a/docs/versioned_docs/version-3.16.0-LTS/security/audit-logs.md b/docs/versioned_docs/version-3.16.0-LTS/security/audit-logs/audit-logs.md similarity index 99% rename from docs/versioned_docs/version-3.16.0-LTS/security/audit-logs.md rename to docs/versioned_docs/version-3.16.0-LTS/security/audit-logs/audit-logs.md index 4bf7b95368..a0c612063b 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/security/audit-logs.md +++ b/docs/versioned_docs/version-3.16.0-LTS/security/audit-logs/audit-logs.md @@ -1,6 +1,6 @@ --- id: audit-logs -title: Audit Logs +title: Overview ---
diff --git a/docs/versioned_docs/version-3.16.0-LTS/security/audit-logs/stream-rsyslog-to-datadog.md b/docs/versioned_docs/version-3.16.0-LTS/security/audit-logs/stream-rsyslog-to-datadog.md new file mode 100644 index 0000000000..a8dcd44ad6 --- /dev/null +++ b/docs/versioned_docs/version-3.16.0-LTS/security/audit-logs/stream-rsyslog-to-datadog.md @@ -0,0 +1,365 @@ +--- +id: stream-audit-to-datadog +title: Stream Audit Logs to Datadog +--- + +
+ +This guide demonstrates how to configure ToolJet to stream audit logs from Rsyslog to Datadog for **centralized log management**, **monitoring**, and **analysis**. This integration enables real-time visibility into user activities, resource changes, and system events, helping you maintain security, compliance, and operational awareness across your infrastructure. + +When to stream ToolJet audit logs to Datadog: +- **Multi-server deployments**: Centralize logs from production, staging, and development environments +- **Security monitoring**: Correlate user actions with infrastructure metrics to detect anomalies +- **Compliance requirements**: Maintain tamper-proof audit trails with long-term retention +- **Incident response**: Quickly search and analyze logs during security or operational incidents + +## Prerequisites + +Before setting up the Datadog integration, ensure you have: + +1. **ToolJet with rsyslog enabled** - Follow the **[Setup Rsyslog guide](/docs/how-to/setup-rsyslog)** to enable log file generation +2. **Datadog account** - Sign up at [https://www.datadoghq.com/](https://www.datadoghq.com/) +3. **Datadog API key** - Obtain from [Datadog Organization Settings](https://app.datadoghq.com/organization-settings/api-keys) +4. **Docker Compose setup** - This guide uses Docker Compose for deployment + +## Architecture Overview + +1. **ToolJet** writes audit logs to `/home/appuser/rsyslog/` inside the container +2. **Docker volume** shares the rsyslog directory between ToolJet and Datadog Agent containers +3. **Datadog Agent** monitors the log files and streams them to Datadog's cloud platform +4. **Datadog** parses, indexes, and displays the logs in the Logs Explorer + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ ToolJet โ”‚โ”€โ”€โ”€โ”€โ”€>โ”‚ Docker Volumeโ”‚<โ”€โ”€โ”€โ”€โ”€โ”‚ Datadog โ”‚ +โ”‚ Container โ”‚ โ”‚ (rsyslog/) โ”‚ โ”‚ Agent โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜ + โ”‚ + โ–ผ + โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” + โ”‚ Datadog โ”‚ + โ”‚ Cloud โ”‚ + โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +## Configuration Steps + +### Step 1: Configure Environment Variables + +Add the following environment variables to your `.env` file: + +```bash +# Enable rsyslog (if not already enabled) +LOG_FILE_PATH='rsyslog' + +# Datadog Configuration +DD_API_KEY=your_datadog_api_key_here +DD_SITE=datadoghq.com +``` + +:::info +Replace `your_datadog_api_key_here` with your actual Datadog API key from [https://app.datadoghq.com/organization-settings/api-keys](https://app.datadoghq.com/organization-settings/api-keys) +::: + +:::tip Datadog Site +The `DD_SITE` value depends on your Datadog region: +- US1: `datadoghq.com` (default) +- US3: `us3.datadoghq.com` +- US5: `us5.datadoghq.com` +- EU: `datadoghq.eu` +- AP1: `ap1.datadoghq.com` +::: + +### Step 2: Create Datadog Agent Configuration + +Create a file named `datadog-agent-config.yml` in your ToolJet deployment directory: + +```yaml +logs_enabled: true +logs_config: + container_collect_all: false + +# ToolJet audit log configuration +log_processing_rules: + - type: multi_line + name: json_logs + pattern: ^\{ +``` + +This configuration: +- Enables log collection in the Datadog Agent +- Disables automatic collection from all containers (we'll target specific logs) +- Sets up multiline processing for JSON-formatted logs + +### Step 3: Create ToolJet Log Collection Configuration + +Create a file named `datadog-tooljet-logs.yaml` in your ToolJet deployment directory: + +```yaml +logs: + - type: file + path: /var/log/tooljet/rsyslog/tooljet_log/*/audit.log + service: tooljet + source: tooljet-audit + sourcecategory: audit + tags: + - env:production + - application:tooljet + - log_type:audit + # Parse JSON logs + log_processing_rules: + - type: exclude_at_match + name: exclude_empty_logs + pattern: "^\\s*$" +``` + +This configuration: +- **path**: Monitors all audit.log files using a wildcard pattern to match daily rotated logs +- **service**: Tags logs with `service:tooljet` for filtering in Datadog +- **source**: Identifies logs as `tooljet-audit` for parsing pipelines +- **tags**: Adds custom tags for organization and filtering +- **log_processing_rules**: Excludes empty log lines + +**Customize Tags** + +Modify the `tags` section to match your environment: +```yaml +tags: + - env:staging # or development, production + - application:tooljet + - team:platform + - region:us-east-1 +``` + +### Step 4: Update Docker Compose Configuration + +Update your `docker-compose.yml` file to include the Datadog Agent and shared volume: + +#### Add Shared Volume to ToolJet Service + +```yaml +services: + tooljet: + # ... existing configuration ... + volumes: + - tooljet-logs:/home/appuser/rsyslog +``` + +#### Add Datadog Agent Service + +```yaml + datadog-agent: + container_name: datadog-agent + image: gcr.io/datadoghq/agent:7 + restart: always + environment: + - DD_API_KEY=${DD_API_KEY} + - DD_SITE=${DD_SITE:-datadoghq.com} + - DD_LOGS_ENABLED=true + - DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=false + - DD_PROCESS_AGENT_ENABLED=true + - DD_DOCKER_LABELS_AS_TAGS={"*":"%%label%%"} + - DD_TAGS=env:production application:tooljet + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - /proc/:/host/proc/:ro + - /sys/fs/cgroup/:/host/sys/fs/cgroup:ro + - tooljet-logs:/var/log/tooljet/rsyslog:ro + - ./datadog-agent-config.yml:/etc/datadog-agent/datadog.yaml:ro + - ./datadog-tooljet-logs.yaml:/etc/datadog-agent/conf.d/tooljet.d/conf.yaml:ro +``` + +#### Define the Shared Volume + +```yaml +volumes: + tooljet-logs: + # ... other volumes ... +``` + + +Complete docker-compose.yml Example + +```bash +name: ToolJet + +services: + tooljet: + container_name: Tooljet-app + image: tooljet/tooljet:latest + restart: always + env_file: .env + ports: + - 80:80 + environment: + SERVE_CLIENT: "true" + PORT: "80" + command: npm run start:prod + volumes: + - tooljet-logs:/home/appuser/rsyslog + + datadog-agent: + container_name: datadog-agent + image: gcr.io/datadoghq/agent:7 + restart: always + environment: + - DD_API_KEY=${DD_API_KEY} + - DD_SITE=${DD_SITE:-datadoghq.com} + - DD_LOGS_ENABLED=true + - DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=false + - DD_PROCESS_AGENT_ENABLED=true + - DD_DOCKER_LABELS_AS_TAGS={"*":"%%label%%"} + - DD_TAGS=env:production application:tooljet + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - /proc/:/host/proc/:ro + - /sys/fs/cgroup/:/host/sys/fs/cgroup:ro + - tooljet-logs:/var/log/tooljet/rsyslog:ro + - ./datadog-agent-config.yml:/etc/datadog-agent/datadog.yaml:ro + - ./datadog-tooljet-logs.yaml:/etc/datadog-agent/conf.d/tooljet.d/conf.yaml:ro + + postgres: + container_name: postgres + image: postgres:13 + restart: always + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + ports: + - 5432:5432 + +volumes: + tooljet-logs: +``` + +### Step 5: Deploy the Configuration + +1. **Stop existing containers**: + ```bash + docker-compose down + ``` +2. **Start the updated stack**: + ```bash + docker-compose up -d + ``` +3. **Verify containers are running**: + ```bash + docker ps + ``` + You should see both `Tooljet-app` and `datadog-agent` containers running. + +### Step 6: Verify the Integration + +#### Check Datadog Agent Status + +Run the following command to verify the agent is collecting logs: + +```bash +docker exec datadog-agent agent status +``` + +Look for the **Logs Agent** section in the output: + +``` +Logs Agent +========== + ... + Integrations + ============ + + tooljet + ------- + - Type: file + Path: /var/log/tooljet/rsyslog/tooljet_log/*/audit.log + Service: tooljet + Source: tooljet-audit + Status: OK + 1 files tailed out of 1 files matching +``` + +:::info +If the status shows "OK" and files are being tailed, the integration is working correctly. +::: + +#### Check Datadog Agent Logs + +View the Datadog Agent logs to troubleshoot any issues: + +```bash +docker logs datadog-agent --tail 50 +``` + +#### Generate Test Audit Logs + +Perform actions in ToolJet to generate audit logs: +- Create or delete an application +- Modify data sources +- Update user permissions +- Change organization settings + +### Step 7: View Logs in Datadog + +1. Navigate to the **[Datadog Logs Explorer](https://app.datadoghq.com/logs)** + +2. Use the following filters to find your ToolJet logs: + - `service:tooljet` + - `source:tooljet-audit` + - `env:production` + +## Log Structure and Fields + +ToolJet audit logs contain the following structured fields: + +| Field | Description | Example | +|-------|-------------|---------| +| `level` | Log severity level | `info`, `warn`, `error` | +| `message` | Human-readable log message | `PERFORM APP_CREATE OF MyApp` | +| `timestamp` | When the event occurred | `2025-10-21 11:27:44` | +| `auditLog.userId` | User who performed the action | `a59e1ec7-d015-47b9-8ef8-e5d3f4e5f8d4` | +| `auditLog.resourceId` | ID of the affected resource | `95031c39-9d19-425d-b70c-3436c2805773` | +| `auditLog.resourceType` | Type of resource | `APP`, `DATA_SOURCE`, `USER` | +| `auditLog.actionType` | Action performed | `APP_CREATE`, `APP_DELETE`, `APP_UPDATE` | +| `auditLog.resourceName` | Name of the resource | `MyApplication` | +| `auditLog.ipAddress` | Client IP address | `::ffff:192.168.65.1` | +| `auditLog.organizationId` | Organization ID | `e9de636b-e611-4b90-95f0-0fe20b540924` | +| `auditLog.metadata.userAgent` | Browser/client information | `Mozilla/5.0...` | +| `auditLog.metadata.tooljetVersion` | ToolJet version | `3.16.33-ee-lts` | +| `auditLog.metadata.transactionId` | Unique transaction identifier | `732440597788045` | +| `auditLog.metadata.route` | API endpoint called | `[POST] /api/apps` | + +**Example Audit Log Entry** + +```json +{ + "level": "info", + "message": "PERFORM APP_CREATE OF MyApp APP FOR ORGANIZATION e9de636b-e611-4b90-95f0-0fe20b540924", + "timestamp": "2025-10-21 11:27:44", + "auditLog": { + "userId": "a59e1ec7-d015-47b9-8ef8-e5d3f4e5f8d4", + "resourceId": "95031c39-9d19-425d-b70c-3436c2805773", + "resourceType": "APP", + "actionType": "APP_CREATE", + "resourceName": "MyApp", + "ipAddress": "::ffff:192.168.65.1", + "metadata": { + "instance_level": false, + "workspace_level": true, + "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:144.0) Gecko/20100101 Firefox/144.0", + "tooljetVersion": "3.16.33-ee-lts", + "transactionId": "732440597788045", + "totalDuration": 150, + "route": "[POST] /api/apps" + }, + "resourceData": {}, + "organizationId": "e9de636b-e611-4b90-95f0-0fe20b540924" + }, + "label": "APP" +} +``` + +## Related Resources + +- **[Setup Rsyslog](/docs/how-to/setup-rsyslog)** - Configure audit log generation +- **[Datadog Documentation](https://docs.datadoghq.com/)** - Official Datadog guides +- **[Datadog Agent Configuration](https://docs.datadoghq.com/agent/guide/agent-configuration-files/)** - Detailed Agent setup +- **[Log Collection](https://docs.datadoghq.com/logs/log_collection/)** - Datadog log collection guide diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/ami.md b/docs/versioned_docs/version-3.16.0-LTS/setup/ami.md index 94df492b77..c38568636a 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/ami.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/ami.md @@ -8,11 +8,13 @@ title: AWS AMI You can effortlessly deploy Amazon Elastic Compute Cloud Service (EC2) by utilizing a **CloudFormation template**. This template will deploy all the services required to run ToolJet on AWS AMI instances. :::warning -To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings. +To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings. ::: :::info You should setup a PostgreSQL database manually to be used by ToolJet. We recommend using an **RDS PostgreSQL database**. You can find the system requirements [here](/docs/setup/system-requirements). + +ToolJet runs with **built-in Redis** for multiplayer editing and background jobs. When running **separate worker containers** or **multi-pod setup**, an **external Redis instance** is **required** for job queue coordination. ::: ## Deploy using CloudFormation @@ -72,6 +74,7 @@ Follow the steps below to deploy ToolJet on AWS AMI instances. ::: For AWS RDS PostgreSQL connections, first download the certificate bundle: + ```bash # Create directory and download certificate sudo mkdir -p /home/ubuntu/certs/ @@ -81,6 +84,7 @@ Follow the steps below to deploy ToolJet on AWS AMI instances. ``` Then add these variables to your `.env` file: + ```bash PG_HOST=your-rds-endpoint.region.rds.amazonaws.com PGSSLMODE=require @@ -124,30 +128,41 @@ You can learn more about this feature [here](/docs/tooljet-db/tooljet-database). ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes. +:::info +For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration). +::: + ### Enabling Workflow Scheduling -To activate workflows scheduling, set the following environment variables: +To activate workflow scheduling, set the following environment variables: ```bash -WORKFLOW_WORKER=true -ENABLE_WORKFLOW_SCHEDULING=true -TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default -TEMPORAL_SERVER_ADDRESS= +# Worker Mode (required) +# Set to 'true' to enable job processing +# Set to 'false' or unset for HTTP-only mode (scaled deployments) +WORKER=true + +# Workflow Processor Concurrency (optional) +# Number of workflow jobs processed concurrently per worker +# Default: 5 +TOOLJET_WORKFLOW_CONCURRENCY=5 ``` -**Note**: Workflows scheduling requires a Temporal server to be deployed. Restarting the server using `./setup_app`. +**Environment Variable Details:** +- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling +- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified -### Deploying Temporal with Docker Compose +:::warning +**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment). Configure the Redis connection using the following environment variables: +- `REDIS_HOST=localhost` - Default: localhost +- `REDIS_PORT=6379` - Default: 6379 +- `REDIS_USERNAME=` - Optional: Redis username (ACL) +- `REDIS_PASSWORD=` - Optional: Redis password +- `REDIS_DB=0` - Optional: Redis database number (default: 0) +- `REDIS_TLS=false` - Optional: Enable TLS/SSL (set to 'true') +::: -Below is a `docker-compose` template to set up Temporal. - -``` -curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/ec2-temporal/docker-compose.yml -``` - -This setup can be deployed on a different EC2 instance. To enable seamless communication, ensure that both the application server and the Temporal server are in the same VPC. - -**Note**: Ensure that port 7233 is configured for gRPC in the security group. +**Note**: After updating the `.env` file, restart the server using `./setup_app`. ## Upgrading to the Latest LTS Version @@ -183,4 +198,4 @@ Since ToolJet is deployed using an AMI (Amazon Machine Image), upgrading to a ne 7. **Terminate the Old EC2 Instance**
After verifying that ToolJet is running correctly on the new instance, terminate the old EC2 instance to avoid unnecessary costs. -_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._ +_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._ diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/azure-container.md b/docs/versioned_docs/version-3.16.0-LTS/setup/azure-container.md index 623aed092d..f11627db89 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/azure-container.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/azure-container.md @@ -6,13 +6,13 @@ title: Azure Container Apps # Deploying ToolJet on Azure Container Apps :::warning -To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings. +To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings. ::: :::info Please note that you need to set up a **PostgreSQL database** manually to be used by ToolJet. -ToolJet comes with a **built-in Redis setup**, which is used for multiplayer editing and background jobs. However, for **multi-pod setup**, it's recommended to use an **external Redis instance**. +ToolJet runs with **built-in Redis** for multiplayer editing and background jobs. When running **separate worker containers** or **multi-pod setup**, an **external Redis instance** is **required** for job queue coordination. ::: ## Deploying ToolJet Application @@ -29,9 +29,10 @@ ToolJet comes with a **built-in Redis setup**, which is used for multiplayer edi ::: Deploying ToolJet on Azure container apps 5. Click on the **Create** button at the bottom of the page. -6. Then you will be redirected to the Create Container App tab, uncheck the **Use quickstart image** option to select the image source manually. Make sure to provide the image tag, and then enter `server/entrypoint.sh, npm, run, start:prod` in the "Arguments override" field. +6. Then you will be redirected to the Create Container App tab, uncheck the **Use quickstart image** option to select the image source manually. Make sure to provide the image tag, and then enter `server/ee-entrypoint.sh, npm, run, start:prod` in the "Arguments override" field. Deploying ToolJet on Azure container apps 7. Under "Environmental variables", please add the below ToolJet application variables: + ```env TOOLJET_HOST= LOCKBOX_MASTER_KEY= @@ -83,6 +84,7 @@ ToolJet comes with a **built-in Redis setup**, which is used for multiplayer edi **Note:** These environment variables are in general and might change in the future. You can also refer env variable [**here**](/docs/setup/env-vars). Deploying ToolJet on Azure container apps + 8. In the Ingress tab, configure Ingress and Authentication settings as shown below. You can customize the security configurations as per your requirements. Make sure the port is set to 3000. Deploying ToolJet on Azure container apps 9. Move to Review + create tab and wait for the template to be verified and passed, as shown in the screenshot below. @@ -129,6 +131,44 @@ Deploying ToolJet Database is mandatory from ToolJet 3.0 or else the migration m - [ToolJet 3.0 Migration Guide for Self-Hosted Versions](./upgrade-to-v3.md) +## Workflows + +ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes. + +:::info +For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration). +::: + +### Enabling Workflow Scheduling + +To activate workflow scheduling, set the following environment variables: + +```bash +# Worker Mode (required) +# Set to 'true' to enable job processing +# Set to 'false' or unset for HTTP-only mode (scaled deployments) +WORKER=true + +# Workflow Processor Concurrency (optional) +# Number of workflow jobs processed concurrently per worker +# Default: 5 +TOOLJET_WORKFLOW_CONCURRENCY=5 +``` + +**Environment Variable Details:** +- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling +- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified + +:::warning +**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment). Configure the Redis connection using the following environment variables: +- `REDIS_HOST=localhost` - Default: localhost +- `REDIS_PORT=6379` - Default: 6379 +- `REDIS_USERNAME=` - Optional: Redis username (ACL) +- `REDIS_PASSWORD=` - Optional: Redis password +- `REDIS_DB=0` - Optional: Redis database number (default: 0) +- `REDIS_TLS=false` - Optional: Enable TLS/SSL (set to 'true') +::: + ## Upgrading to the Latest LTS Version New LTS versions are released every 3-5 months with an end-of-life of atleast 18 months. To check the latest LTS version, visit the [ToolJet Docker Hub](https://hub.docker.com/r/tooljet/tooljet/tags) page. The LTS tags follow a naming convention with the prefix `LTS-` followed by the version number, for example `tooljet/tooljet:ee-lts-latest`. @@ -140,4 +180,4 @@ If this is a new installation of the application, you may start directly with th - It is crucial to perform a **comprehensive backup of your database** before starting the upgrade process to prevent data loss. - Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version. -_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._ +_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._ diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/choose-your-tooljet.md b/docs/versioned_docs/version-3.16.0-LTS/setup/choose-your-tooljet.md index d819a3a331..282d6b7945 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/choose-your-tooljet.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/choose-your-tooljet.md @@ -13,14 +13,14 @@ Please find the latest LTS version here:
[Docker Hub - LTS Versions](https://hub.docker.com/r/tooljet/tooljet/tags?page_size=&ordering=&name=ee-lts) :::info -To use the ToolJet AI feature, you will have to upgrade to **`v3.20.00-ee-lts`** or higher. Checkout the **[Build with AI](/docs/build-with-ai/overview)** section for more information. If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or email us at hello@tooljet.com. +To use the ToolJet AI feature, you will have to upgrade to **`v3.20.00-ee-lts`** or higher. Checkout the **[Build with AI](/docs/build-with-ai/overview)** section for more information. If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or email us at support@tooljet.com. ::: -| Version | Release Date | Docker Pull Command | -| ---------| ------------- | ----------------------| -| Latest EE-LTS | N/A | `docker pull tooljet/tooljet:ee-lts-latest` | -| [v3.16.0-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.16.0-lts/images/sha256-626a6463504f74659e1468a69edbdacc264eded5867ae159a18358fc43d47b48) | August 4, 2025 | `docker pull tooljet/tooljet:v3.16.0-lts` | -| [v3.5.0-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.5.0-ee-lts/images/sha256-9580d2377d17ce0c26fca0535eca51bce899015f26bfc81769d032b4b15a5da5) | February 12, 2025 | `docker pull tooljet/tooljet:v3.5.0-ee-lts` | +| Version | Release Date | Docker Pull Command | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | -------------------------------------------- | +| Latest EE-LTS | N/A | `docker pull tooljet/tooljet:ee-lts-latest` | +| [v3.16.0-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.16.0-lts/images/sha256-626a6463504f74659e1468a69edbdacc264eded5867ae159a18358fc43d47b48) | August 4, 2025 | `docker pull tooljet/tooljet:v3.16.0-lts` | +| [v3.5.0-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.5.0-ee-lts/images/sha256-9580d2377d17ce0c26fca0535eca51bce899015f26bfc81769d032b4b15a5da5) | February 12, 2025 | `docker pull tooljet/tooljet:v3.5.0-ee-lts` | | [v3.0.24-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.24-ee-lts/images/sha256-33494c8ee72c440ce0ded925cdeb15507cd87f2b7c3fe172dd1cbee790e3b96f?context=explore) | January 3, 2025 | `docker pull tooljet/tooljet:v3.0.24-ee-lts` | | [v3.0.23-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.23-ee-lts/images/sha256-1ca2bcb5dac66b1d3d089bd8300b7077c0dcd27bb2cfe6665bf388b680294467?context=explore) | January 2, 2025 | `docker pull tooljet/tooljet:v3.0.23-ee-lts` | | [v3.0.22-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.22-ee-lts/images/sha256-fc2bca053802e06a09858b65c2a5f47f1cb0ece2d156ca9b0dd1c37c60d5d2b8?context=explore) | December 30, 2024 | `docker pull tooljet/tooljet:v3.0.22-ee-lts` | diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/cloud-v3-migration.md b/docs/versioned_docs/version-3.16.0-LTS/setup/cloud-v3-migration.md index ec7fc7a68a..242c4b7242 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/cloud-v3-migration.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/cloud-v3-migration.md @@ -256,5 +256,5 @@ The `metadata` object will contain detailed information about the request and re ## Help and Support -- Feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or you can also e-mail us at hello@tooljet.com. +- Feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or you can also e-mail us at support@tooljet.com. - If you have found a bug, please create a [GitHub issue](https://github.com/ToolJet/ToolJet/issues) for the same. diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/digitalocean.md b/docs/versioned_docs/version-3.16.0-LTS/setup/digitalocean.md index b984ef770d..3b8be7768d 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/digitalocean.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/digitalocean.md @@ -5,6 +5,10 @@ title: DigitalOcean Follow the steps below to deploy ToolJet on a DigitalOcean Droplet. +:::warning +To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings. +::: + **1. Navigate to the Droplets section in DigitalOcean.**
@@ -21,7 +25,7 @@ Follow the steps below to deploy ToolJet on a DigitalOcean Droplet.
use a droplet plan
- + - **Auth**: For authentication, use password or ssh - Click **Create Droplet** and note the assigned public IP @@ -82,4 +86,4 @@ If this is a new installation of the application, you may start directly with th - Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version. -If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com. +If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com. diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/docker.md b/docs/versioned_docs/version-3.16.0-LTS/setup/docker.md index dccc4d2d32..71de3101f7 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/docker.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/docker.md @@ -14,7 +14,7 @@ Follow the steps below to deploy ToolJet on a server using Docker Compose. ToolJ If you rather want to try out ToolJet on your local machine with Docker, you can follow the steps [here](/docs/setup/try-tooljet/). :::warning -To enable ToolJet AI features in your ToolJet deployment, whitelist https://api-gateway.tooljet.ai. +To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings. ::: :::: @@ -167,6 +167,119 @@ iv. Setup docker to run without root privileges by following the instructions wr +## Workflows + +ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes. + +:::info +For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration). +::: + +### Enabling Workflow Scheduling + +To activate workflow scheduling, set the following environment variables: + +```bash +# Worker Mode (required) +WORKER=true + +# Workflow Processor Concurrency (optional) +TOOLJET_WORKFLOW_CONCURRENCY=5 +``` + +**Environment Variable Details:** +- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling +- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified + +:::warning +**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment). +::: + +### Running Multiple Workers with External Redis + +
+ +Docker Compose Example with Multiple Workers and External Redis + +This example shows how to run ToolJet with multiple workers and external Redis for scalable workflow processing: + +```yaml +services: + tooljet: + tty: true + stdin_open: true + container_name: Tooljet-app + image: tooljet/tooljet:ee-lts-latest + platform: linux/amd64 + restart: always + env_file: .env + ports: + - 80:80 + environment: + SERVE_CLIENT: "true" + PORT: "80" + command: npm run start:prod + + tooljet-worker-1: + container_name: tooljet-worker-1 + image: tooljet/tooljet:ee-lts-latest + env_file: .env + environment: + WORKER: "true" + TOOLJET_WORKFLOW_CONCURRENCY: 10 + command: npm run start:prod + depends_on: + - redis + + tooljet-worker-2: + container_name: tooljet-worker-2 + image: tooljet/tooljet:ee-lts-latest + env_file: .env + environment: + WORKER: "true" + TOOLJET_WORKFLOW_CONCURRENCY: 10 + command: npm run start:prod + depends_on: + - redis + + redis: + image: redis:7 + container_name: redis + ports: + - 6379:6379 + volumes: + - redis-data:/data + command: redis-server --appendonly yes --maxmemory-policy noeviction + +volumes: + redis-data: +``` + +**Architecture:** +- **tooljet**: Web server that handles HTTP requests and processes jobs (WORKER=true, Port 80) +- **tooljet-worker-1 & tooljet-worker-2**: Dedicated workers that only process workflow jobs (WORKER=true, no ports) +- **redis**: External stateful Redis with persistence for the job queue + +**Redis Environment Variables:** + +Add these to your **.env** file to connect to the external Redis: + +```bash +# Redis - Note: Only REDIS_HOST and REDIS_PORT are required. Authentication and TLS are optional. +REDIS_HOST=redis +REDIS_PORT=6379 +REDIS_USER=default +REDIS_PASSWORD= +# REDIS_DB=0 # Optional: Redis database number (default: 0) +# REDIS_TLS=false # Optional: Enable TLS/SSL (set to 'true') +``` + +**Critical Redis Configuration:** +- **--appendonly yes**: Enables AOF (Append Only File) persistence +- **--maxmemory-policy noeviction**: Required by BullMQ to prevent job loss + +
+ ## Upgrading to the Latest LTS Version New LTS versions are released every 3-5 months with an end-of-life of atleast 18 months. To check the latest LTS version, visit the [ToolJet Docker Hub](https://hub.docker.com/r/tooljet/tooljet/tags) page. The LTS tags follow a naming convention with the prefix `LTS-` followed by the version number, for example `tooljet/tooljet:ee-lts-latest`. @@ -179,4 +292,4 @@ If this is a new installation of the application, you may start directly with th - Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version. -_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._ +_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._ diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/ecs.md b/docs/versioned_docs/version-3.16.0-LTS/setup/ecs.md index 072c6d9dc0..aeb9bd6e4d 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/ecs.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/ecs.md @@ -6,13 +6,13 @@ title: AWS ECS # Deploying ToolJet on Amazon ECS :::warning -To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings. +To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings. ::: :::info You should setup a PostgreSQL database manually to be used by ToolJet. We recommend using an **RDS PostgreSQL database**. You can find the system requirements [here](/docs/3.5.0-LTS/setup/system-requirements#postgresql). -ToolJet comes with a **built-in Redis setup**, which is used for multiplayer editing and background jobs. However, for **multi-service setup**, it's recommended to use an **external Redis instance**. +ToolJet runs with **built-in Redis** for multiplayer editing and background jobs. When running **separate worker containers** or **multi-pod setup**, an **external Redis instance** is **required** for job queue coordination. ::: ### โš™๏ธ Deploy using CloudFormation @@ -37,7 +37,6 @@ If you prefer **(IaC)** with Terraform, ToolJet also provides **ECS deployment s ๐Ÿ“‚ Repository: [ToolJet Terraform for ECS](https://github.com/ToolJet/ToolJet/tree/develop/terraform/ECS) - ## ToolJet Follow the steps below to deploy ToolJet on a ECS cluster. @@ -45,18 +44,20 @@ Follow the steps below to deploy ToolJet on a ECS cluster. 1. Setup a PostgreSQL database, ToolJet uses a postgres database as the persistent storage for storing data related to users and apps. 2. Create a target group and an application load balancer to route traffic onto ToolJet containers. You can [reference](https://docs.aws.amazon.com/AmazonECS/latest/userguide/create-application-load-balancer.html) AWS docs to set it up. Please note that ToolJet server exposes `/api/health`, which you can configure for health checks. 3. Create task definition for deploying ToolJet app as a service on your preconfigured cluster. + 1. Select Fargate as launch type compatibility 2. Configure IAM roles and set operating system family as Linux. 3. Select task size to have 3GB of memory and 1vCpu - ECS Setup + ECS Setup 4. Add container details that is shown:
Specify your container name ex: `ToolJet`
Set the image you intend to deploy. ex: `tooljet/tooljet:ee-lts-latest`
Update port mappings at container port `3000` for tcp protocol. - ECS Setup + ECS Setup Specify environmental values for the container. You'd want to make use of secrets to store sensitive information or credentials, kindly refer the AWS [docs](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data-secrets.html) to set it up. You can also store the env in S3 bucket, kindly refer the AWS [docs](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/taskdef-envfiles.html) . - ECS Setup + ECS Setup For the setup, ToolJet requires: + ``` TOOLJET_HOST= LOCKBOX_MASTER_KEY= @@ -67,18 +68,23 @@ Follow the steps below to deploy ToolJet on a ECS cluster. PG_PASS= PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments) ``` + Also, for setting up additional environment variables in the .env file, please check our documentation on environment variables [here](/docs/setup/env-vars). #### SSL Configuration for AWS RDS PostgreSQL + :::warning **Important**: When connecting to PostgreSQL 16.9 on AWS RDS with SSL enabled, you need to configure SSL certificates. The `NODE_EXTRA_CA_CERTS` environment variable is critical for resolving SSL certificate chain issues and for connecting to self-signed HTTPS endpoints. ::: For AWS RDS PostgreSQL connections, add these environment variables to your container: + ``` PGSSLMODE=require NODE_EXTRA_CA_CERTS=/certs/global-bundle.pem ``` + You'll also need to: + 1. **Download the AWS RDS global certificate bundle** on your ECS container instances: ```bash mkdir -p /opt/ssl-certs @@ -89,20 +95,22 @@ Follow the steps below to deploy ToolJet on a ECS cluster. - **Source path**: `/opt/ssl-certs` (on host) - **Container path**: `/certs` (in container) - **Read only**: Yes + 5. Make sure `Use log collection checked` and `Docker configuration` with the command `npm run start:prod` ECS Setup + 4. Create a service to run your task definition within your cluster. - - Select the cluster which you have created - - Select launch type as Fargate - ECS Setup - - Select the cluster and set the service name - - You can set the number of tasks to start with as two - - Rest of the values can be kept as default - ECS Setup - - Click on next step to configure networking options - - Select your designated VPC, Subnets and Security groups. Kindly ensure that the security group allows for inbound traffic to http port 3000 for the task. - ECS Setup - - Since migrations are run as a part of container boot, please specify health check grace period for 900 seconds. Select the application loadbalancer option and set the target group name to the one we had created earlier. This will auto populate the health check endpoints. + - Select the cluster which you have created + - Select launch type as Fargate + ECS Setup + - Select the cluster and set the service name + - You can set the number of tasks to start with as two + - Rest of the values can be kept as default + ECS Setup + - Click on next step to configure networking options + - Select your designated VPC, Subnets and Security groups. Kindly ensure that the security group allows for inbound traffic to http port 3000 for the task. + ECS Setup + - Since migrations are run as a part of container boot, please specify health check grace period for 900 seconds. Select the application loadbalancer option and set the target group name to the one we had created earlier. This will auto populate the health check endpoints. :::info The setup above is just a template. Feel free to update the task definition and configure parameters for resources and environment variables according to your needs. @@ -165,6 +173,70 @@ PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOO - [ToolJet Environment Variables Documentation](https://docs.tooljet.com/docs/setup/env-vars/) - [Node.js TLS Configuration](https://nodejs.org/api/tls.html) +## Workflows + +ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes. + +:::info +For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration). +::: + +### Enabling Workflow Scheduling + +To activate workflow scheduling, set the following environment variables in your ECS task definition: + +```bash +# Worker Mode (required) +# Set to 'true' to enable job processing +# Set to 'false' or unset for HTTP-only mode (scaled deployments) +WORKER=true + +# Workflow Processor Concurrency (optional) +# Number of workflow jobs processed concurrently per worker +# Default: 5 +TOOLJET_WORKFLOW_CONCURRENCY=5 +``` + +**Environment Variable Details:** +- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling +- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified + +:::warning +**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment). +::: + +#### Setting Up Redis for Workflows + +We recommend using **Amazon ElastiCache for Redis** with the following configuration: + +1. **Create an ElastiCache Redis cluster** with these settings: + - Engine version: Redis 7.x + - Node type: cache.t3.medium or higher + - Number of replicas: At least 1 (for high availability) + - Automatic failover: Enabled + +2. **Configure Redis settings**: + - **maxmemory-policy**: Must be set to `noeviction` (critical for BullMQ) + - **appendonly**: Set to `yes` for AOF persistence + - **appendfsync**: Set to `everysec` + +3. **Add Redis environment variables** to your ECS task definition: + +```bash +REDIS_HOST= +REDIS_PORT=6379 +REDIS_PASSWORD= # If auth is enabled +``` + +**Optional Redis Configuration:** +- `REDIS_USERNAME=` - Redis username (ACL) +- `REDIS_DB=0` - Redis database number (default: 0) +- `REDIS_TLS=true` - Enable TLS/SSL for secure connections + +:::info +For production deployments, ensure your ElastiCache Redis cluster is in the same VPC as your ECS tasks and configure security groups to allow traffic on port 6379. +::: + ## Upgrading to the Latest LTS Version New LTS versions are released every 3-5 months with an end-of-life of atleast 18 months. To check the latest LTS version, visit the [ToolJet Docker Hub](https://hub.docker.com/r/tooljet/tooljet/tags) page. The LTS tags follow a naming convention with the prefix `LTS-` followed by the version number, for example `tooljet/tooljet:ee-lts-latest`. @@ -177,4 +249,4 @@ If this is a new installation of the application, you may start directly with th - Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version. -_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._ +_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._ diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/env-vars.md b/docs/versioned_docs/version-3.16.0-LTS/setup/env-vars.md index bb6b188075..35fed55d8d 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/env-vars.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/env-vars.md @@ -11,23 +11,26 @@ ToolJet requires several environment variables to function properly. Below is a #### ToolJet Host -- `TOOLJET_HOST`: Public URL of ToolJet (e.g., `https://app.tooljet.ai`) +- `TOOLJET_HOST`: Public URL of ToolJet (e.g., `https://app.tooljet.com`) #### Lockbox Configuration + - `LOCKBOX_MASTER_KEY`: 32-byte hex string for encrypting datasource credentials - Generate using: `openssl rand -hex 32` #### Application Secret + - `SECRET_KEY_BASE`: 64-byte hex string for encrypting session cookies - Generate using: `openssl rand -hex 64` #### Database Configuration + - `PG_HOST`: PostgreSQL database host - `PG_DB`: Database name - `PG_USER`: Username - `PG_PASS`: Password - `PG_PORT`: Port - + **Docker Compose Setup:** If you are using a Docker Compose setup with an in-built PostgreSQL instance, set `PG_HOST` to `postgres`. This ensures that Docker's internal DNS resolves the hostname correctly, allowing the ToolJet server to connect to the database seamlessly. **Database Connection URL:** If you intend to use the database connection URL and your database does not support SSL, use the following format when setting the `DATABASE_URL` variable: @@ -39,9 +42,11 @@ DATABASE_URL=postgres://PG_USER:PG_PASS@PG_HOST:5432/PG_DB?sslmode=disable Replace `username`, `password`, `hostname`, `port`, and `database_name` with your actual database details. #### Disabling Automatic Database & Extension Creation (Optional) + - `PG_DB_OWNER=false`: ToolJet by default tries to create database based on `PG_DB` variable set and additionally my try to create postgres extensions. This requires the postgres user to have `CREATEDB` permission. If this cannot be granted you can disable this behaviour by setting `PG_DB_OWNER` as `false` and will have to manually run them. #### ToolJet Database + - `TOOLJET_DB`: Default database name (`tooljet_db`) - `TOOLJET_DB_HOST`: Database host - `TOOLJET_DB_USER`: Database username @@ -52,10 +57,10 @@ Replace `username`, `password`, `hostname`, `port`, and `database_name` with you ToolJet requires two separate databases for optimal functionality. **TOOLJET_DB** is used to store the platform's internal metadata, including tables created within ToolJet. On the other hand, **PG_DB** acts as the primary database for application data, handling end-user data managed by the apps built on ToolJet. - **Automatic Database Creation:** The database name specified in `TOOLJET_DB` will be automatically created during the server boot process in all production deployment setups. #### PostgREST + ToolJet uses **PostgREST (v12.2.0)** for API access. The following environment variables are required for PostgREST: - `PGRST_JWT_SECRET`: JWT secret (Generate using `openssl rand -hex 32`). If this parameter is not specified, PostgREST will refuse authentication requests. @@ -84,15 +89,46 @@ Ensure that: #### Redis Configuration -Include the following Redis environment variables within the ToolJet deployment only if you are connecting to an external **Redis instance (v6.2)** for a multi-service or multi-pod setup and have followed the necessary steps to create Redis. +Include the following Redis environment variables within the ToolJet deployment only if you are connecting to an external **Redis instance (v6.x or higher, v7.x recommended)** for a multi-service or multi-pod setup, or when running workflows with separate worker containers. + +**Required Variables:** ``` REDIS_HOST= REDIS_PORT= +``` + +**Optional Variables:** + +``` REDIS_USER= REDIS_PASSWORD= +REDIS_DB=0 # Redis database number (default: 0) +REDIS_TLS=false # Enable TLS/SSL connection (set to 'true') ``` +:::info +**For Workflows:** When running separate worker containers or multiple instances for workflow scheduling, an external Redis instance is **required** for job queue coordination. The built-in Redis only works for single instance deployments. +::: + +#### Workflow Scheduling + +ToolJet Workflows allows you to design and execute complex, data-centric automations using a visual, node-based interface. Configure the following environment variables to enable workflow scheduling: + +**Required Variables:** + +- `WORKER`: Set to `true` to enable job processing for workflow scheduling. Set to `false` or leave unset for HTTP-only mode (default: `false`) + +**Optional Variables:** + +- `TOOLJET_WORKFLOW_CONCURRENCY`: Number of workflow jobs processed concurrently per worker instance (default: `5`) + +:::warning +**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment). +::: + +For detailed workflow configuration and deployment examples, refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration). + ### Optional Configurations #### Comments Feature @@ -100,25 +136,29 @@ REDIS_PASSWORD= - `COMMENT_FEATURE_ENABLE=true/false`: Use this environment variable to enable/disable the feature that allows you to add comments on the canvas. To configure this environment variable, ensure that multiplayer editing is enabled in the Settings. #### User Session Expiry + - `USER_SESSION_EXPIRY`: Controls session expiry time (in minutes). Default: **10 days**. Note: The variable expects the value in minutes. ex: USER_SESSION_EXPIRY = 120 which is 2 hours #### Password Retry Limit -By default, an account is locked after 5 failed login attempts. You can control this with: -- `DISABLE_PASSWORD_RETRY_LIMIT=true`: Disables the retry limit. +By default, an account is locked after 5 failed login attempts. You can control this with: + +- `DISABLE_PASSWORD_RETRY_LIMIT=true`: Disables the retry limit. - `PASSWORD_RETRY_LIMIT=`: Sets a custom retry limit (default is 5). #### Hide Account Setup Link - `HIDE_ACCOUNT_SETUP_LINK`: Set to `true` to hide the account setup link from the admin in the manage user page. Ensure SMTP is configured to send welcome emails. -#### Restrict Signups +#### Restrict Signups + Set `DISABLE_SIGNUPS=true` to allow only invited users to sign up. The signup page will still be visible but unusable. #### SMTP Configuration -ToolJet sends emails via SMTP. + +ToolJet sends emails via SMTP. :::info If you have upgraded from a version prior to v2.62.0, the SMTP variables in your .env file will automatically be mapped to the UI. For versions v2.62.0 and later, SMTP configuration will no longer be picked up from the .env file for Enterprise Edition. You must configure SMTP through the UI. You can safely remove these variables from your .env file after ensuring that the configuration is properly set up in the UI. @@ -135,13 +175,14 @@ For **Community Edition**, use these environment variables: - `SMTP_PORT`: SMTP port #### Custom CA Certificate + If ToolJet needs to connect to self-signed HTTPS endpoints, ensure the `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path of the CA certificate file. - `NODE_EXTRA_CA_CERTS=/path/to/cert.pem`: Absolute path to the PEM file (can contain multiple certificates). #### ToolJet API Import Application -By default, server accepts maximum JSON size as 50 MB. To increase this limit, use the following environment variable: +By default, server accepts maximum JSON size as 50 MB. To increase this limit, use the following environment variable: - `MAX_JSON_SIZE = "150mb"` @@ -158,53 +199,65 @@ You can control workflow execution behavior using the following environment vari ### Third-Party Integrations #### Slack + To use Slack as a data source in ToolJet, create a Slack app and set: - `SLACK_CLIENT_ID`: Slack app client ID - `SLACK_CLIENT_SECRET`: Slack app client secret #### Google OAuth + To connect ToolJet with Google services like Google Sheets, create OAuth credentials in Google Cloud Console. - `GOOGLE_CLIENT_ID`: Google OAuth client ID - `GOOGLE_CLIENT_SECRET`: Google OAuth client secret #### Google Maps API + To use the Maps widget in ToolJet, create a Google Maps API key and set: - `GOOGLE_MAPS_API_KEY`: Google Maps API key #### Application Monitoring (APM) + - `APM_VENDOR=sentry`: Set APM vendor. - `SENTRY_DNS`: Sentry project DSN. - `SENTRY_DEBUG=true/false`: Enable/disable Sentry debugging. #### Security & Authentication + By default, ToolJet sends user count updates every 24 hours. To disable this, use: - `DISABLE_TOOLJET_TELEMETRY=true`: Disables telemetry.(Enabled by default) #### Single Sign-On (SSO) + Enable Google or GitHub SSO with these environment variables: **Google SSO:** + - `SSO_GOOGLE_OAUTH2_CLIENT_ID`: Google OAuth client ID **GitHub SSO:** + - `SSO_GIT_OAUTH2_CLIENT_ID`: GitHub OAuth client ID - `SSO_GIT_OAUTH2_CLIENT_SECRET`: GitHub OAuth client secret - `SSO_GIT_OAUTH2_HOST`: GitHub host if self-hosted **General SSO Settings:** + - `SSO_ACCEPTED_DOMAINS`: Comma-separated list of allowed email domains - `SSO_DISABLE_SIGNUPS=true`: Restricts signups to existing users #### Group Synchronization + If any of the following environment variables are set to true, group synchronization will be skipped during the login process for the respective SSO provider: + - `DISABLE_LDAP_GROUP_SYNC=true` โ€“ Disables group sync for LDAP during login. - `DISABLE_SAML_GROUP_SYNC=true` โ€“ Disables group sync for SAML during login. #### REST API Cookie Forwarding + By default, ToolJet does not forward cookies with REST API requests. To enable this (self-hosted only), set: - `FORWARD_RESTAPI_COOKIES=true`: Allows forwarding cookies with REST API requests. @@ -213,14 +266,16 @@ By default, ToolJet does not forward cookies with REST API requests. To enable t This is required when the assets for the client are to be loaded from elsewhere (eg: CDN). This can be an absolute path, or relative to main HTML file. -- `ASSET_PATH`: Path for loading frontend assets (e.g., `https://app.tooljet.ai/`) +- `ASSET_PATH`: Path for loading frontend assets (e.g., `https://app.tooljet.com/`) ## Additional Configurations #### Log File Path + - `LOG_FILE_PATH`: Path to store audit logs (e.g., `tooljet/log/tooljet-audit.log`) #### Embedding Private Apps + By default, only public apps can be embedded. To allow embedding of private ToolJet apps, set: - `ENABLE_PRIVATE_APP_EMBED=true/false`: Allows embedding of private ToolJet apps. @@ -228,19 +283,19 @@ By default, only public apps can be embedded. To allow embedding of private Tool **Note: Available in ToolJet Enterprise 2.8.0+ and Community/Cloud 2.10.0+.** #### Default Language -Set the default language using the `LANGUAGE` variable. Supported options: +Set the default language using the `LANGUAGE` variable. Supported options:
-| Language | Code | Native Name | -|-------------|------|-------------------| -| English | en | English | -| French | fr | Franรงais | -| Spanish | es | Espaรฑol | -| Italian | it | Italiano | +| Language | Code | Native Name | +| -------- | ---- | ----------- | +| English | en | English | +| French | fr | Franรงais | +| Spanish | es | Espaรฑol | +| Italian | it | Italiano |
@@ -248,12 +303,12 @@ Set the default language using the `LANGUAGE` variable. Supported options:
-| Language | Code | Native Name | -|-------------|------|-------------------| -| Indonesian | id | Bahasa Indonesia | -| Ukrainian | uk | ะฃะบั€ะฐั—ะฝััŒะบะฐ | -| Russian | ru | ะ ัƒััะบะธะน | -| German | de | Deutsch | +| Language | Code | Native Name | +| ---------- | ---- | ---------------- | +| Indonesian | id | Bahasa Indonesia | +| Ukrainian | uk | ะฃะบั€ะฐั—ะฝััŒะบะฐ | +| Russian | ru | ะ ัƒััะบะธะน | +| German | de | Deutsch |
@@ -261,4 +316,29 @@ Set the default language using the `LANGUAGE` variable. Supported options: Example: `LANGUAGE=fr` (for French). -**Note:** This setting is not available in ToolJet Cloud. \ No newline at end of file +**Note:** This setting is not available in ToolJet Cloud. + +#### Observability + +ToolJet supports OpenTelemetry (OTEL) for comprehensive observability and monitoring. Enable metrics collection to monitor application performance, query executions, and system health. + +**Basic Configuration:** + +- `ENABLE_OTEL`: Set to `true` to enable OpenTelemetry metrics collection (default: `false`) +- `OTEL_EXPORTER_OTLP_TRACES`: OTLP traces endpoint URL (default: `http://localhost:4318/v1/traces`) +- `OTEL_EXPORTER_OTLP_METRICS`: OTLP metrics endpoint URL (default: `http://localhost:4318/v1/metrics`) +- `OTEL_SERVICE_NAME`: Service identifier for metrics (default: `tooljet`) +- `OTEL_EXPORTER_OTLP_HEADERS`: Authentication headers for OTLP endpoint (optional, format: `key1=value1,key2=value2`) + +**Advanced Configuration:** + +- `OTEL_LOG_LEVEL`: Debug logging level for OTEL (use `debug` for detailed logs) +- `OTEL_ACTIVE_USER_WINDOW_MINUTES`: Activity window for concurrent user tracking in minutes (default: `5`) +- `OTEL_MAX_TRACKED_USERS`: Maximum number of tracked users/sessions (default: `10000`) +- `OTEL_INCLUDE_QUERY_TEXT`: Include actual query text in metrics - **WARNING:** Creates high cardinality (default: `false`) + +:::warning High Cardinality +Only enable `OTEL_INCLUDE_QUERY_TEXT=true` for debugging. This creates high cardinality metrics that can impact Prometheus performance. Use an OTEL Collector to filter this label in production. +::: + +For comprehensive setup instructions, metrics details, and Grafana dashboard integration, see the [OpenTelemetry Observability](/docs/setup/observability-otel) documentation. diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/google-cloud-run.md b/docs/versioned_docs/version-3.16.0-LTS/setup/google-cloud-run.md index 39d9b5de02..7225d30174 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/google-cloud-run.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/google-cloud-run.md @@ -6,13 +6,13 @@ title: Google Cloud Run # Deploying ToolJet on Google Cloud Run :::warning -To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings. +To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings. ::: :::info You should manually set up a **PostgreSQL database** to be used by ToolJet. We recommend using **Cloud SQL** for this purpose. -ToolJet comes with a **built-in Redis setup**, which is used for multiplayer editing and background jobs. However, for **multi-service setup**, it's recommended to use an **external Redis instance**. +ToolJet runs with **built-in Redis** for multiplayer editing and background jobs. When running **separate worker containers** or **multi-pod setup**, an **external Redis instance** is **required** for job queue coordination. ::: @@ -28,28 +28,30 @@ ToolJet comes with a **built-in Redis setup**, which is used for multiplayer edi | **Cloud SQL** | `PG_DB` | Database used to store application data | 1. **Create a new Google Cloud Run Service:** - Google Cloud Run New Setup + Google Cloud Run New Setup 2. **Ingress and Authentication can be set as shown below, to begin with. Feel free to change the security configurations as per your requirements.** - ingress-auth + ingress-auth 3. **Under the containers tab, please make sure the port is set to 3000 and command `npm, run, start:prod` is entered in container argument field with CPU capacity set to 2GiB:** - port-and-capacity-tooljet - - If the above command is not compatible, please use the following command structure instead:
- port-and-capacity-tooljet-alternative-command - - If you encounter any migration issues, please execute the following command. Be aware that executing this command may cause the revision to break. However, modifying the command back to `npm, run, start:prod` will successfully reboot the instance: - port-and-capacity-tooljet-migration-fix-command + port-and-capacity-tooljet + - If the above command is not compatible, please use the following command structure instead:
+ port-and-capacity-tooljet-alternative-command + - If you encounter any migration issues, please execute the following command. Be aware that executing this command may cause the revision to break. However, modifying the command back to `npm, run, start:prod` will successfully reboot the instance: + port-and-capacity-tooljet-migration-fix-command 4. **Under environmental variables, please add the below ToolJet application variables:**
- You can use these variables for: tooljet-app: - ```env - TOOLJET_HOST= - LOCKBOX_MASTER_KEY= - SECRET_KEY_BASE= + You can use these variables for: tooljet-app: - PG_USER= - PG_HOST= - PG_PASS= - PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments) - ``` - Update `TOOLJET_HOST` environment variable if you want to use the default url assigned with Cloud run after the initial deploy. + ```env + TOOLJET_HOST= + LOCKBOX_MASTER_KEY= + SECRET_KEY_BASE= + + PG_USER= + PG_HOST= + PG_PASS= + PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments) + ``` + + Update `TOOLJET_HOST` environment variable if you want to use the default url assigned with Cloud run after the initial deploy. ## ToolJet Database @@ -109,42 +111,49 @@ If you are using [Public IP](https://cloud.google.com/sql/docs/postgres/connect- ::: 5. **Please go to the connection tab. Under the Cloud SQL instance please select the PostgreSQL database which you have set-up.** - cloud-SQL-tooljet
- Click on deploy once the above parameters are set. - :::info - Once the Service is created and live, to make the Cloud Service URL public. Please follow the steps [**here**](https://cloud.google.com/run/docs/securing/managing-access) to make the service public. - ::: + cloud-SQL-tooljet
+ Click on deploy once the above parameters are set. + :::info + Once the Service is created and live, to make the Cloud Service URL public. Please follow the steps [**here**](https://cloud.google.com/run/docs/securing/managing-access) to make the service public. + ::: ## Workflows ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes. +:::info +For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration). +::: + ### Enabling Workflow Scheduling -Please deploy the below containers to enable workflows scheduling. - -#### Worker container: - -You can use the same `tooljet/tooljet:ee-lts-latest` image tag and ensure it has env variables from the tooljet-app container. - To activate workflow scheduling, set the following environment variables: ```bash -WORKFLOW_WORKER=true -ENABLE_WORKFLOW_SCHEDULING=true -TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default -TEMPORAL_SERVER_ADDRESS= +# Worker Mode (required) +# Set to 'true' to enable job processing +# Set to 'false' or unset for HTTP-only mode (scaled deployments) +WORKER=true + +# Workflow Processor Concurrency (optional) +# Number of workflow jobs processed concurrently per worker +# Default: 5 +TOOLJET_WORKFLOW_CONCURRENCY=5 ``` -Under the containers tab, please make sure the command `npm, run, worker:prod` is set. -ToolJet Worker Settings +**Environment Variable Details:** +- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling +- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified -#### Temporal server container: - -1. Set the image tag as `temporalio/auto-setup:1.25.1` - Temporal Settings -2. Add the below env variables to the temporal container: - Temporal Variables and Secrets +:::warning +**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment). Configure the Redis connection using the following environment variables: +- `REDIS_HOST=localhost` - Default: localhost +- `REDIS_PORT=6379` - Default: 6379 +- `REDIS_USERNAME=` - Optional: Redis username (ACL) +- `REDIS_PASSWORD=` - Optional: Redis password +- `REDIS_DB=0` - Optional: Redis database number (default: 0) +- `REDIS_TLS=false` - Optional: Enable TLS/SSL (set to 'true') +::: ## Upgrading to the Latest LTS Version @@ -158,4 +167,4 @@ If this is a new installation of the application, you may start directly with th - Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version. -_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._ +_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._ diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/helm.md b/docs/versioned_docs/version-3.16.0-LTS/setup/helm.md index 7b6ebf6af5..fcdb073e7a 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/helm.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/helm.md @@ -26,7 +26,7 @@ helm install tooljet tooljet/tooljet Remember to replace the variables with your specific configuration values. :::warning -To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings. +To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings. ::: ## ToolJet Database @@ -74,6 +74,135 @@ redis: REDIS_PASSWORD= ``` +## Workflows + +ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes. + +:::info +For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](/docs/setup/workflow-temporal-to-bullmq-migration). +::: + +### Enabling Workflow Scheduling + +To enable workflow scheduling in your Helm deployment, you need to configure the following environment variables: + +| Variable | Description | Default | +|----------|-------------|---------| +| **WORKER** | Enable job processing for workflows. Set to `true` to process workflow jobs | `true` | +| **TOOLJET_WORKFLOW_CONCURRENCY** | Maximum number of concurrent workflows that can be executed | `10` | + +:::warning +**External Redis for Multiple Workflow Workers**: When running multiple workers for workflows, an external stateful Redis instance is recommended for better performance and reliability. The built-in Redis is suitable for single-worker workflow setups. +::: + +### Configuring Multiple Workers with External Redis + +
+ +Helm values.yaml Configuration for Multiple Workers + +The ToolJet Helm chart includes a dedicated worker deployment template (**worker.yml**) that can be used to run multiple workflow workers. Here's how to configure it: + +**Step 1: Enable Redis in values.yaml** + +```yaml +redis: + enabled: true # Enable Redis for multiple workers + architecture: standalone + fullnameOverride: redis + auth: + enabled: true + password: "your-secure-password" + master: + service: + port: 6379 + persistence: + enabled: true + size: 8Gi +``` + +**Step 2: Configure Redis Connection** + +```yaml +redis_pod: + REDIS_HOST: "redis-master" # Redis service name + REDIS_PORT: "6379" + REDIS_USER: "default" +``` + +**Step 3: Add Workflow Environment Variables** + +Add these to the `env:` section in values.yaml: + +```yaml +env: + TOOLJET_HOST: "https://your-tooljet-domain.com" + DEPLOYMENT_PLATFORM: "k8s:helm" + TOOLJET_WORKFLOW_CONCURRENCY: "10" + # ... other environment variables +``` + +**Step 4: Configure Worker Settings** + +```yaml +workflow_env: + WORKER: "true" # Already set by default + +apps: + tooljet: + replicaCount: 1 # Main application server +``` + +**Step 5: Install or Upgrade with Helm** + +```bash +helm upgrade --install tooljet tooljet/tooljet -f values.yaml +``` + +### Architecture + +The Helm chart deploys: +- **Main ToolJet deployment** (`deployment.yaml`): Web server with `WORKER=true`, handles HTTP requests and processes workflow jobs +- **Worker deployment** (`worker.yml`): Additional dedicated workers with `WORKER=true`, scale independently for more processing capacity +- **External Redis**: Stateful service for job queue and persistence + +### Redis Configuration Requirements + +**Critical**: Redis must be configured with: +- **AOF (Append Only File)** persistence enabled +- **maxmemory-policy** set to `noeviction` + +To configure these settings, you can use Redis configuration: + +```yaml +redis: + enabled: true + master: + persistence: + enabled: true + extraFlags: + - --appendonly yes + - --maxmemory-policy noeviction +``` + +### Redis Environment Variables (Optional) + +If you need to configure additional Redis settings, you can add these to the `env:` section: + +```yaml +env: + REDIS_HOST: "redis-master" # Default: redis-master + REDIS_PORT: "6379" # Default: 6379 + REDIS_USERNAME: "" # Optional: Redis username (ACL) + REDIS_PASSWORD: "" # Optional: Set via secret + REDIS_DB: "0" # Optional: Redis database number + REDIS_TLS: "false" # Optional: Enable TLS/SSL +``` + +**Note:** Only `REDIS_HOST` and `REDIS_PORT` are required. Authentication and TLS are optional based on your Redis setup. + +
+ ## Upgrading to the Latest LTS Version New LTS versions are released every 3-5 months with an end-of-life of atleast 18 months. To check the latest LTS version, visit the [ToolJet Docker Hub](https://hub.docker.com/r/tooljet/tooljet/tags) page. The LTS tags follow a naming convention with the prefix `LTS-` followed by the version number, for example `tooljet/tooljet:ee-lts-latest`. @@ -86,4 +215,4 @@ If this is a new installation of the application, you may start directly with th - Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version. -_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._ +_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._ diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/http-proxy.md b/docs/versioned_docs/version-3.16.0-LTS/setup/http-proxy.md index acc5ce51e4..b73926a5a6 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/http-proxy.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/http-proxy.md @@ -9,7 +9,7 @@ The server will connect to the internet via the configured HTTP proxy when the b | :----------------- | :------------------------------------ | | TOOLJET_HTTP_PROXY | Used for both HTTP and HTTPS requests | -_If you have any questions, feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._ +_If you have any questions, feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._
diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/kubernetes-aks.md b/docs/versioned_docs/version-3.16.0-LTS/setup/kubernetes-aks.md index 3e0200b25b..7b125b25d2 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/kubernetes-aks.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/kubernetes-aks.md @@ -6,23 +6,26 @@ title: Kubernetes (AKS) # Deploying ToolJet on Kubernetes (AKS) :::warning -To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings. +To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings. ::: :::info You should setup a PostgreSQL database manually to be used by ToolJet. We recommend using **Azure Database for PostgreSQL** since this guide is for deploying using AKS. You can find the system requirements [here](/docs/3.5.0-LTS/setup/system-requirements#postgresql). -ToolJet comes with a **built-in Redis setup**, which is used for multiplayer editing and background jobs. However, for **multi-pod setup**, it's recommended to use an **external Redis instance**. +ToolJet runs with **built-in Redis** for multiplayer editing and background jobs. When running **separate worker containers** or **multi-pod setup**, an **external Redis instance** is **required** for job queue coordination. ::: Follow the steps below to deploy ToolJet on a AKS Kubernetes cluster. 1. Create an AKS cluster and connect to it to start with the deployment. You can follow the steps as mentioned on the [Azure's documentation](https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough-portal). 2. Create k8s deployment + ```bash curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/AKS/deployment.yaml ``` + For the setup, ToolJet requires: + ``` TOOLJET_HOST= LOCKBOX_MASTER_KEY= @@ -33,10 +36,12 @@ Follow the steps below to deploy ToolJet on a AKS Kubernetes cluster. PG_PASS= PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments) ``` + Make sure to edit the environment variables in the `deployment.yaml`. You can check out the available options [here](/docs/setup/env-vars). :::info If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers. ::: + 3. Create k8s service and reserve a static IP and expose it via a service load balancer as mentioned in the [doc](https://docs.microsoft.com/en-us/azure/aks/static-ip). You can refer `service.yaml`. ```bash curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/AKS/service.yaml @@ -103,19 +108,85 @@ PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOO ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes. +:::info +For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration). +::: + ### Enabling Workflow Scheduling -Create workflow deployment: +To activate workflow scheduling, set the following environment variables in your ToolJet deployment: ```bash -kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/workflow-deployment.yaml +# Worker Mode (required) +# Set to 'true' to enable job processing +# Set to 'false' or unset for HTTP-only mode (scaled deployments) +WORKER=true + +# Workflow Processor Concurrency (optional) +# Number of workflow jobs processed concurrently per worker +# Default: 5 +TOOLJET_WORKFLOW_CONCURRENCY=5 ``` -**Note:** Ensure that the worker deployment uses the same image as the ToolJet application deployment to maintain compatibility. Additionally, the variables below need to be a part of tooljet-deployment. +**Environment Variable Details:** +- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling +- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified -`ENABLE_WORKFLOW_SCHEDULING=true` -`TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default` -`TEMPORAL_SERVER_ADDRESS=` +:::warning +**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment). +::: + +#### Deploying Redis for Workflows + +Deploy a stateful Redis instance using the following example configuration: + +```bash +kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/redis-stateful.yaml +``` + +
+ +Built-in Redis vs External Redis + +ToolJet images include a built-in Redis instance for development. When deploying workflows in production, you must update your deployment configuration to use the external stateful Redis: + +Change **REDIS_HOST** from **localhost** to **redis-service** in your deployment YAML: + +```yaml +- name: REDIS_HOST + value: redis-service # Changed from localhost +- name: REDIS_PORT + value: "6379" +``` + +
+ +This example deployment creates: +- A StatefulSet with persistent storage for Redis +- A headless Service for stable network identity +- ConfigMap with production-ready Redis configuration +- A Secret for optional password authentication + +:::info +This is an example configuration that you can customize to your needs. However, **AOF (Append Only File) persistence** and **`maxmemory-policy noeviction`** are critical settings that must be maintained for BullMQ job queue reliability. +::: + +After deploying Redis, configure ToolJet to connect to it using these environment variables in your deployment: + +```bash +REDIS_HOST=redis-service.default.svc.cluster.local +REDIS_PORT=6379 +REDIS_PASSWORD=your-secure-redis-password-here # Match the password in redis-secret +``` + +**Optional Redis Configuration:** +- `REDIS_USERNAME=` - Redis username (ACL) +- `REDIS_DB=0` - Redis database number (default: 0) +- `REDIS_TLS=false` - Enable TLS/SSL (set to 'true') + +**Note:** Update the `redis-secret` in the Redis deployment YAML with a secure password before deploying to production. + +**Note:** Ensure that these environment variables are added to your Kubernetes deployment configuration (e.g., in your deployment.yaml file or Kubernetes secret). ## Upgrading to the Latest LTS Version @@ -129,4 +200,4 @@ If this is a new installation of the application, you may start directly with th - Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version. -_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._ +_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._ diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/kubernetes-eks.md b/docs/versioned_docs/version-3.16.0-LTS/setup/kubernetes-eks.md index ae7f41c631..2a6c741bbf 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/kubernetes-eks.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/kubernetes-eks.md @@ -6,72 +6,78 @@ title: Kubernetes (EKS) Follow the steps below to deploy ToolJet on an EKS Kubernetes cluster. :::warning -To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings. +To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings. ::: :::info You should set up a PostgreSQL database manually to be used by ToolJet. We recommend using an **RDS PostgreSQL database**. You can find the system requirements [here](/docs/3.5.0-LTS/setup/system-requirements#postgresql). -ToolJet comes with a **built-in Redis setup**, which is used for multiplayer editing and background jobs. However, for **multi-pod setup**, it's recommended to use an **external Redis instance**. +ToolJet runs with **built-in Redis** for multiplayer editing and background jobs. When running **separate worker containers** or **multi-pod setup**, an **external Redis instance** is **required** for job queue coordination. ::: 1. Create an EKS cluster and connect to it to start with the deployment. You can follow the steps as mentioned in the [AWS documentation](https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html). 2. Create a k8s Deployment:
- The file below is just a template and might not suit production environments. You should download the file and configure parameters such as the replica count and environment variables according to your needs. - ``` - kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/deployment.yaml - ``` - Make sure to edit the environment variables in the `deployment.yaml`. We advise using secrets to set up sensitive information. You can check out the available options [here](/docs/setup/env-vars).
- For the setup, ToolJet requires: - ``` - TOOLJET_HOST= - LOCKBOX_MASTER_KEY= - SECRET_KEY_BASE= + The file below is just a template and might not suit production environments. You should download the file and configure parameters such as the replica count and environment variables according to your needs. - PG_USER= - PG_HOST= - PG_PASS= - PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments) - ``` - Make sure to edit the environment variables in the `deployment.yaml`. You can check out the available options [here](/docs/setup/env-vars). + ``` + kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/deployment.yaml + ``` - #### SSL Configuration for AWS RDS PostgreSQL + Make sure to edit the environment variables in the `deployment.yaml`. We advise using secrets to set up sensitive information. You can check out the available options [here](/docs/setup/env-vars).
+ For the setup, ToolJet requires: - :::warning - **Important**: When connecting to PostgreSQL 16.9 on AWS RDS with SSL enabled, you need to configure SSL certificates. The `NODE_EXTRA_CA_CERTS` environment variable is critical for resolving SSL certificate chain issues and for connecting to self-signed HTTPS endpoints. - ::: + ``` + TOOLJET_HOST= + LOCKBOX_MASTER_KEY= + SECRET_KEY_BASE= - For AWS RDS PostgreSQL connections, create a ConfigMap with the certificate: - ```bash - # Download the AWS RDS global certificate bundle - curl -O https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem + PG_USER= + PG_HOST= + PG_PASS= + PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments) + ``` - # Create a ConfigMap with the certificate - kubectl create configmap aws-rds-certs --from-file=global-bundle.pem - ``` + Make sure to edit the environment variables in the `deployment.yaml`. You can check out the available options [here](/docs/setup/env-vars). - Then update your deployment YAML to include: - ```yaml - # Add these environment variables - env: - - name: PGSSLMODE - value: "require" - - name: NODE_EXTRA_CA_CERTS - value: "/certs/global-bundle.pem" + #### SSL Configuration for AWS RDS PostgreSQL - # Add volume mount - volumeMounts: - - name: ssl-certs - mountPath: /certs - readOnly: true + :::warning + **Important**: When connecting to PostgreSQL 16.9 on AWS RDS with SSL enabled, you need to configure SSL certificates. The `NODE_EXTRA_CA_CERTS` environment variable is critical for resolving SSL certificate chain issues and for connecting to self-signed HTTPS endpoints. + ::: - # Add volume - volumes: - - name: ssl-certs - configMap: - name: aws-rds-certs - ``` + For AWS RDS PostgreSQL connections, create a ConfigMap with the certificate: + + ```bash + # Download the AWS RDS global certificate bundle + curl -O https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem + + # Create a ConfigMap with the certificate + kubectl create configmap aws-rds-certs --from-file=global-bundle.pem + ``` + + Then update your deployment YAML to include: + + ```yaml + # Add these environment variables + env: + - name: PGSSLMODE + value: "require" + - name: NODE_EXTRA_CA_CERTS + value: "/certs/global-bundle.pem" + + # Add volume mount + volumeMounts: + - name: ssl-certs + mountPath: /certs + readOnly: true + + # Add volume + volumes: + - name: ssl-certs + configMap: + name: aws-rds-certs + ``` 3. Create a Kubernetes service to publish the Kubernetes deployment that you have created. We have a [template](https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/service.yaml) for exposing the ToolJet server as a service using an AWS Load Balancer. @@ -140,19 +146,85 @@ PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOO ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes. +:::info +For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration). +::: + ### Enabling Workflow Scheduling -Create workflow deployment: +To activate workflow scheduling, set the following environment variables in your ToolJet deployment: ```bash -kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/workflow-deployment.yaml +# Worker Mode (required) +# Set to 'true' to enable job processing +# Set to 'false' or unset for HTTP-only mode (scaled deployments) +WORKER=true + +# Workflow Processor Concurrency (optional) +# Number of workflow jobs processed concurrently per worker +# Default: 5 +TOOLJET_WORKFLOW_CONCURRENCY=5 ``` -**Note:** Ensure that the worker deployment uses the same image as the ToolJet application deployment to maintain compatibility. Additionally, the variables below need to be a part of tooljet-deployment. +**Environment Variable Details:** +- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling +- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified -`ENABLE_WORKFLOW_SCHEDULING=true` -`TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default` -`TEMPORAL_SERVER_ADDRESS=` +:::warning +**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment). +::: + +#### Deploying Redis for Workflows + +Deploy a stateful Redis instance using the following example configuration: + +```bash +kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/redis-stateful.yaml +``` + +
+ +Built-in Redis vs External Redis + +ToolJet images include a built-in Redis instance for development. When deploying workflows in production, you must update your deployment configuration to use the external stateful Redis: + +Change **REDIS_HOST** from **localhost** to **redis-service** in your deployment YAML: + +```yaml +- name: REDIS_HOST + value: redis-service # Changed from localhost +- name: REDIS_PORT + value: "6379" +``` + +
+ +This example deployment creates: +- A StatefulSet with persistent storage for Redis +- A headless Service for stable network identity +- ConfigMap with production-ready Redis configuration +- A Secret for optional password authentication + +:::info +This is an example configuration that you can customize to your needs. However, **AOF (Append Only File) persistence** and **`maxmemory-policy noeviction`** are critical settings that must be maintained for BullMQ job queue reliability. +::: + +After deploying Redis, configure ToolJet to connect to it using these environment variables in your deployment: + +```bash +REDIS_HOST=redis-service.default.svc.cluster.local +REDIS_PORT=6379 +REDIS_PASSWORD=your-secure-redis-password-here # Match the password in redis-secret +``` + +**Optional Redis Configuration:** +- `REDIS_USERNAME=` - Redis username (ACL) +- `REDIS_DB=0` - Redis database number (default: 0) +- `REDIS_TLS=false` - Enable TLS/SSL (set to 'true') + +**Note:** Update the `redis-secret` in the Redis deployment YAML with a secure password before deploying to production. + +**Note:** Ensure that these environment variables are added to your Kubernetes deployment configuration (e.g., in your deployment.yaml file or Kubernetes secret). ## Upgrading to the Latest LTS Version @@ -166,4 +238,4 @@ If this is a new installation of the application, you may start directly with th - Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version. -_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._ +_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._ diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/kubernetes-gke.md b/docs/versioned_docs/version-3.16.0-LTS/setup/kubernetes-gke.md index 83a8cdd491..a11de36bf4 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/kubernetes-gke.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/kubernetes-gke.md @@ -6,58 +6,63 @@ title: Kubernetes (GKE) # Deploying ToolJet on Kubernetes (GKE) :::warning -To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings. +To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings. ::: :::info You should setup a **PostgreSQL database** manually to be used by ToolJet. You can find the system requirements [here](/docs/3.5.0-LTS/setup/system-requirements#postgresql). -ToolJet comes with a **built-in Redis setup**, which is used for multiplayer editing and background jobs. However, for **multi-pod setup**, it's recommended to use an **external Redis instance**. +ToolJet runs with **built-in Redis** for multiplayer editing and background jobs. When running **separate worker containers** or **multi-pod setup**, an **external Redis instance** is **required** for job queue coordination. ::: Follow the steps below to deploy ToolJet on a GKE Kubernetes cluster. 1. Create an SSL certificate. - ```bash - curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/certificate.yaml - ``` - Change the domain name to the domain/subdomain that you wish to use for ToolJet installation. + ```bash + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/certificate.yaml + ``` + Change the domain name to the domain/subdomain that you wish to use for ToolJet installation. 2. Reserve a static IP address using `gcloud` cli - ```bash - gcloud compute addresses create tj-static-ip --global - ``` + ```bash + gcloud compute addresses create tj-static-ip --global + ``` 3. Create k8s deployment - ```bash - curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/deployment.yaml - ``` - For the setup, ToolJet requires: - ``` - TOOLJET_HOST= - LOCKBOX_MASTER_KEY= - SECRET_KEY_BASE= - PG_USER= - PG_HOST= - PG_PASS= - PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments) - ``` - Make sure to edit the environment variables in the `deployment.yaml`. You can check out the available options [here](/docs/setup/env-vars). - :::info - If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers. - ::: + ```bash + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/deployment.yaml + ``` + + For the setup, ToolJet requires: + + ``` + TOOLJET_HOST= + LOCKBOX_MASTER_KEY= + SECRET_KEY_BASE= + + PG_USER= + PG_HOST= + PG_PASS= + PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments) + ``` + + Make sure to edit the environment variables in the `deployment.yaml`. You can check out the available options [here](/docs/setup/env-vars). + :::info + If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers. + ::: + 4. Create k8s service - ```bash - curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/service.yaml - ``` + ```bash + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/service.yaml + ``` 5. Create k8s ingress - ```bash - curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/ingress.yaml - ``` - Change the domain name to the domain/subdomain that you wish to use for ToolJet installation. + ```bash + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/ingress.yaml + ``` + Change the domain name to the domain/subdomain that you wish to use for ToolJet installation. 6. Apply YAML configs - ```bash - kubectl apply -f certificate.yaml, deployment.yaml, service.yaml, ingress.yaml - ``` + ```bash + kubectl apply -f certificate.yaml, deployment.yaml, service.yaml, ingress.yaml + ``` :::info It might take a few minutes to provision the managed certificates. [Managed certificates documentation](https://cloud.google.com/kubernetes-engine/docs/how-to/managed-certs). @@ -120,19 +125,85 @@ PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOO ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes. +:::info +For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration). +::: + ### Enabling Workflow Scheduling -Create workflow deployment: +To activate workflow scheduling, set the following environment variables in your ToolJet deployment: ```bash -kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/workflow-deployment.yaml +# Worker Mode (required) +# Set to 'true' to enable job processing +# Set to 'false' or unset for HTTP-only mode (scaled deployments) +WORKER=true + +# Workflow Processor Concurrency (optional) +# Number of workflow jobs processed concurrently per worker +# Default: 5 +TOOLJET_WORKFLOW_CONCURRENCY=5 ``` -**Note:** Ensure that the worker deployment uses the same image as the ToolJet application deployment to maintain compatibility. Additionally, the variables below need to be a part of tooljet-deployment. +**Environment Variable Details:** +- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling +- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified -`ENABLE_WORKFLOW_SCHEDULING=true` -`TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default` -`TEMPORAL_SERVER_ADDRESS=` +:::warning +**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment). +::: + +#### Deploying Redis for Workflows + +Deploy a stateful Redis instance using the following example configuration: + +```bash +kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/redis-stateful.yaml +``` + +
+ +Built-in Redis vs External Redis + +ToolJet images include a built-in Redis instance for development. When deploying workflows in production, you must update your deployment configuration to use the external stateful Redis: + +Change **REDIS_HOST** from **localhost** to **redis-service** in your deployment YAML: + +```yaml +- name: REDIS_HOST + value: redis-service # Changed from localhost +- name: REDIS_PORT + value: "6379" +``` + +
+ +This example deployment creates: +- A StatefulSet with persistent storage for Redis +- A headless Service for stable network identity +- ConfigMap with production-ready Redis configuration +- A Secret for optional password authentication + +:::info +This is an example configuration that you can customize to your needs. However, **AOF (Append Only File) persistence** and **`maxmemory-policy noeviction`** are critical settings that must be maintained for BullMQ job queue reliability. +::: + +After deploying Redis, configure ToolJet to connect to it using these environment variables in your deployment: + +```bash +REDIS_HOST=redis-service.default.svc.cluster.local +REDIS_PORT=6379 +REDIS_PASSWORD=your-secure-redis-password-here # Match the password in redis-secret +``` + +**Optional Redis Configuration:** +- `REDIS_USERNAME=` - Redis username (ACL) +- `REDIS_DB=0` - Redis database number (default: 0) +- `REDIS_TLS=false` - Enable TLS/SSL (set to 'true') + +**Note:** Update the `redis-secret` in the Redis deployment YAML with a secure password before deploying to production. + +**Note:** Ensure that these environment variables are added to your Kubernetes deployment configuration (e.g., in your deployment.yaml file or Kubernetes secret). ## Upgrading to the Latest LTS Version @@ -146,4 +217,4 @@ If this is a new installation of the application, you may start directly with th - Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version. -_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._ +_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._ diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/kubernetes.md b/docs/versioned_docs/version-3.16.0-LTS/setup/kubernetes.md index bbc5ea14d0..80e98450c8 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/kubernetes.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/kubernetes.md @@ -6,13 +6,13 @@ title: Kubernetes # Deploying ToolJet on Kubernetes :::warning -To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings. +To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings. ::: :::info You should setup a **PostgreSQL database** manually to be used by ToolJet. You can find the system requirements [here](/docs/3.5.0-LTS/setup/system-requirements#postgresql). -ToolJet comes with a **built-in Redis setup**, which is used for multiplayer editing and background jobs. However, for **multi-pod setup**, it's recommended to use an **external Redis instance**. +ToolJet runs with **built-in Redis** for multiplayer editing and background jobs. When running **separate worker containers** or **multi-pod setup**, an **external Redis instance** is **required** for job queue coordination. ::: Follow the steps below to deploy ToolJet on a Kubernetes cluster. @@ -21,6 +21,7 @@ Follow the steps below to deploy ToolJet on a Kubernetes cluster. ToolJet uses a postgres database as the persistent storage for storing data related to users and apps. We do not have plans to support other databases such as MySQL. 2. **Create a Kubernetes secret with name `server`.** For the setup, ToolJet requires: + ``` TOOLJET_HOST= LOCKBOX_MASTER_KEY= @@ -31,7 +32,9 @@ Follow the steps below to deploy ToolJet on a Kubernetes cluster. PG_PASS= PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments) ``` + Also, for setting up additional environment variables in the .env file, please check our documentation on environment variables [here](/docs/setup/env-vars). + 3. Create a Kubernetes deployment ```bash kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/deployment.yaml @@ -39,7 +42,7 @@ Follow the steps below to deploy ToolJet on a Kubernetes cluster. :::info 1. The file given above is just a template and might not suit production environments. You should download the file and configure parameters such as the replica count and environment variables according to your needs. 2. If there are self signed HTTPS endpoints that ToolJet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers. - ::: + ::: 4. Verify if ToolJet is running ```bash kubectl get pods @@ -108,19 +111,85 @@ PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOO ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes. +:::info +For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration). +::: + ### Enabling Workflow Scheduling -Create workflow deployment: +To activate workflow scheduling, set the following environment variables in your ToolJet deployment: ```bash -kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/workflow-deployment.yaml +# Worker Mode (required) +# Set to 'true' to enable job processing +# Set to 'false' or unset for HTTP-only mode (scaled deployments) +WORKER=true + +# Workflow Processor Concurrency (optional) +# Number of workflow jobs processed concurrently per worker +# Default: 5 +TOOLJET_WORKFLOW_CONCURRENCY=5 ``` -**Note:** Ensure that the worker deployment uses the same image as the ToolJet application deployment to maintain compatibility. Additionally, the variables below need to be a part of tooljet-deployment. +**Environment Variable Details:** +- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling +- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified -`ENABLE_WORKFLOW_SCHEDULING=true` -`TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default` -`TEMPORAL_SERVER_ADDRESS=` +:::warning +**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment). +::: + +#### Deploying Redis for Workflows + +Deploy a stateful Redis instance using the following example configuration: + +```bash +kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/redis-stateful.yaml +``` + +
+ +Built-in Redis vs External Redis + +ToolJet images include a built-in Redis instance for development. When deploying workflows in production, you must update your deployment configuration to use the external stateful Redis: + +Change **REDIS_HOST** from **localhost** to **redis-service** in your deployment YAML: + +```yaml +- name: REDIS_HOST + value: redis-service # Changed from localhost +- name: REDIS_PORT + value: "6379" +``` + +
+ +This example deployment creates: +- A StatefulSet with persistent storage for Redis +- A headless Service for stable network identity +- ConfigMap with production-ready Redis configuration +- A Secret for optional password authentication + +:::info +This is an example configuration that you can customize to your needs. However, **AOF (Append Only File) persistence** and **`maxmemory-policy noeviction`** are critical settings that must be maintained for BullMQ job queue reliability. +::: + +After deploying Redis, configure ToolJet to connect to it using these environment variables in your deployment: + +```bash +REDIS_HOST=redis-service.default.svc.cluster.local +REDIS_PORT=6379 +REDIS_PASSWORD=your-secure-redis-password-here # Match the password in redis-secret +``` + +**Optional Redis Configuration:** +- `REDIS_USERNAME=` - Redis username (ACL) +- `REDIS_DB=0` - Redis database number (default: 0) +- `REDIS_TLS=false` - Enable TLS/SSL (set to 'true') + +**Note:** Update the `redis-secret` in the Redis deployment YAML with a secure password before deploying to production. + +**Note:** Ensure that these environment variables are added to your Kubernetes deployment configuration (e.g., in your deployment.yaml file or Kubernetes secret). ## Upgrading to the Latest LTS Version @@ -134,4 +203,4 @@ If this is a new installation of the application, you may start directly with th - Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version. -_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._ +_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._ diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/openshift.md b/docs/versioned_docs/version-3.16.0-LTS/setup/openshift.md index 118b4a6b62..5e1ee19672 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/openshift.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/openshift.md @@ -6,48 +6,51 @@ title: Openshift # Deploying ToolJet on Openshift :::warning -To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` in your network settings. +To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings. ::: :::info You should setup a **PostgreSQL database** manually to be used by ToolJet. You can find the system requirements [here](/docs/3.5.0-LTS/setup/system-requirements#postgresql). -ToolJet comes with a **built-in Redis setup**, which is used for multiplayer editing and background jobs. However, for **multi-pod setup**, it's recommended to use an **external Redis instance**. +ToolJet runs with **built-in Redis** for multiplayer editing and background jobs. When running **separate worker containers** or **multi-pod setup**, an **external Redis instance** is **required** for job queue coordination. ::: Follow the steps below to deploy ToolJet on Openshift. 1. Setup a PostgreSQL database ToolJet uses a postgres database as the persistent storage for storing data related to users and apps. - ``` - TOOLJET_HOST= - LOCKBOX_MASTER_KEY= - SECRET_KEY_BASE= - PG_USER= - PG_HOST= - PG_PASS= - PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments) - ``` - Also, for setting up additional environment variables in the .env file, please check our documentation on environment variables [here](/docs/setup/env-vars). + ``` + TOOLJET_HOST= + LOCKBOX_MASTER_KEY= + SECRET_KEY_BASE= + + PG_USER= + PG_HOST= + PG_PASS= + PG_DB=tooljet_production # Must be a unique database name (do not reuse across deployments) + ``` + + Also, for setting up additional environment variables in the .env file, please check our documentation on environment variables [here](/docs/setup/env-vars). + 2. Once you have logged into the Openshift developer dashboard click on `+Add` tab. Select import YAML from the local machine. - :::note - When entering one or more files and use --- to separate each definition - ::: - Copy paste deployment.yaml to the online editor - ``` - curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/openshift/deployment.yaml - ``` - Copy paste the service.yaml to the online editor - ``` - curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/openshift/service.yaml - ``` - online yaml editor - Once you have added the files click on create. - :::info - If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers. - ::: -4. Navigate to topology tab and use the visual connector to establish the connect between tooljet-deployment and postgresql as shown in the screenshot below. - topology + :::note + When entering one or more files and use --- to separate each definition + ::: + Copy paste deployment.yaml to the online editor + ``` + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/openshift/deployment.yaml + ``` + Copy paste the service.yaml to the online editor + ``` + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/openshift/service.yaml + ``` + online yaml editor + Once you have added the files click on create. + :::info + If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers. + ::: +3. Navigate to topology tab and use the visual connector to establish the connect between tooljet-deployment and postgresql as shown in the screenshot below. + topology ## ToolJet Database @@ -104,19 +107,85 @@ PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOO ToolJet Workflows allows users to design and execute complex, data-centric automations using a visual, node-based interface. This feature enhances ToolJet's functionality beyond building secure internal tools, enabling developers to automate complex business processes. +:::info +For users migrating from Temporal-based workflows, please refer to the [Workflow Migration Guide](./workflow-temporal-to-bullmq-migration). +::: + ### Enabling Workflow Scheduling -Create workflow deployment: +To activate workflow scheduling, set the following environment variables in your ToolJet deployment: ```bash -kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/workflow-deployment.yaml +# Worker Mode (required) +# Set to 'true' to enable job processing +# Set to 'false' or unset for HTTP-only mode (scaled deployments) +WORKER=true + +# Workflow Processor Concurrency (optional) +# Number of workflow jobs processed concurrently per worker +# Default: 5 +TOOLJET_WORKFLOW_CONCURRENCY=5 ``` -**Note:** Ensure that the worker deployment uses the same image as the ToolJet application deployment to maintain compatibility. Additionally, the variables below need to be a part of tooljet-deployment. +**Environment Variable Details:** +- **WORKER** (required): Enables job processing. Set to `true` to activate workflow scheduling +- **TOOLJET_WORKFLOW_CONCURRENCY** (optional): Controls the number of workflow jobs processed concurrently per worker instance. Default is 5 if not specified -`ENABLE_WORKFLOW_SCHEDULING=true` -`TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default` -`TEMPORAL_SERVER_ADDRESS=` +:::warning +**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment). +::: + +#### Deploying Redis for Workflows + +Deploy a stateful Redis instance using the following example configuration: + +```bash +kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/redis-stateful.yaml +``` + +
+ +Built-in Redis vs External Redis + +ToolJet images include a built-in Redis instance for development. When deploying workflows in production, you must update your deployment configuration to use the external stateful Redis: + +Change **REDIS_HOST** from **localhost** to **redis-service** in your deployment YAML: + +```yaml +- name: REDIS_HOST + value: redis-service # Changed from localhost +- name: REDIS_PORT + value: "6379" +``` + +
+ +This example deployment creates: +- A StatefulSet with persistent storage for Redis +- A headless Service for stable network identity +- ConfigMap with production-ready Redis configuration +- A Secret for optional password authentication + +:::info +This is an example configuration that you can customize to your needs. However, **AOF (Append Only File) persistence** and **`maxmemory-policy noeviction`** are critical settings that must be maintained for BullMQ job queue reliability. +::: + +After deploying Redis, configure ToolJet to connect to it using these environment variables in your deployment: + +```bash +REDIS_HOST=redis-service.default.svc.cluster.local +REDIS_PORT=6379 +REDIS_PASSWORD=your-secure-redis-password-here # Match the password in redis-secret +``` + +**Optional Redis Configuration:** +- `REDIS_USERNAME=` - Redis username (ACL) +- `REDIS_DB=0` - Redis database number (default: 0) +- `REDIS_TLS=false` - Enable TLS/SSL (set to 'true') + +**Note:** Update the `redis-secret` in the Redis deployment YAML with a secure password before deploying to production. + +**Note:** Ensure that these environment variables are added to your OpenShift deployment configuration (e.g., in your deployment.yaml file). ## Upgrading to the Latest LTS Version @@ -130,4 +199,4 @@ If this is a new installation of the application, you may start directly with th - Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the LTS version. -_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._ +_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._ diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/aws/deployment/ami.md b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/aws/deployment/ami.md index 7e4370866b..4986fe7aa9 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/aws/deployment/ami.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/aws/deployment/ami.md @@ -46,4 +46,4 @@ cd /app/tooljet sudo ./setup_app ``` -**Reference**: [ToolJet AMI Setup Documentation](https://docs.tooljet.ai/docs/setup/ami) +**Reference**: [ToolJet AMI Setup Documentation](https://docs.tooljet.com/docs/setup/ami) diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/aws/deployment/docker.md b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/aws/deployment/docker.md index 8777a1ba48..4b243a34c9 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/aws/deployment/docker.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/aws/deployment/docker.md @@ -10,8 +10,8 @@ Add volume mount only ```yaml services: tooljet: - # ... other configuration - volumes: + # ... other configuration + volumes: - /path/to/global-bundle.pem:/certs/global-bundle.pem ``` @@ -43,4 +43,4 @@ docker-compose up -d docker-compose logs tooljet | grep "TOOLJET APPLICATION STARTED SUCCESSFULLY" ``` -**Reference**: [ToolJet Docker Setup Documentation](https://docs.tooljet.ai/docs/setup/docker) +**Reference**: [ToolJet Docker Setup Documentation](https://docs.tooljet.com/docs/setup/docker) diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/aws/deployment/ecs.md b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/aws/deployment/ecs.md index a803608b5d..b45c5827c2 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/aws/deployment/ecs.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/aws/deployment/ecs.md @@ -38,6 +38,7 @@ aws ssm send-command \ #### Using AWS CLI Create a new task definition file `tooljet-task-updated.json`: + ```json { "family": "tooljet-task", @@ -81,6 +82,7 @@ Create a new task definition file `tooljet-task-updated.json`: ``` Register the updated task definition: + ```bash aws ecs register-task-definition --cli-input-json file://tooljet-task-updated.json ``` @@ -112,6 +114,7 @@ aws ecs register-task-definition --cli-input-json file://tooljet-task-updated.js #### Using AWS CLI Update your task definition to use EFS: + ```json { "volumes": [ @@ -177,6 +180,7 @@ aws ecs describe-services --cluster your-cluster-name --services tooljet-service ``` **Verify SSL certificate mount:** + ```bash # Connect to running container and verify certificate aws ecs execute-command \ @@ -186,4 +190,4 @@ aws ecs execute-command \ --command "ls -la /certs/" ``` -**Reference**: [ToolJet ECS Setup Documentation](https://docs.tooljet.ai/docs/setup/ecs) \ No newline at end of file +**Reference**: [ToolJet ECS Setup Documentation](https://docs.tooljet.com/docs/setup/ecs) diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/aws/deployment/eks.md b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/aws/deployment/eks.md index 73acd38560..444d28e79d 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/aws/deployment/eks.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/aws/deployment/eks.md @@ -37,22 +37,22 @@ spec: template: spec: containers: - - name: tooljet - env: - - name: PG_HOST - value: "your-rds-endpoint.region.rds.amazonaws.com" - - name: PGSSLMODE - value: "require" - - name: NODE_EXTRA_CA_CERTS - value: "/certs/global-bundle.pem" - volumeMounts: - - name: ssl-certs - mountPath: /certs - readOnly: true + - name: tooljet + env: + - name: PG_HOST + value: "your-rds-endpoint.region.rds.amazonaws.com" + - name: PGSSLMODE + value: "require" + - name: NODE_EXTRA_CA_CERTS + value: "/certs/global-bundle.pem" + volumeMounts: + - name: ssl-certs + mountPath: /certs + readOnly: true volumes: - - name: ssl-certs - configMap: - name: rds-ssl-cert + - name: ssl-certs + configMap: + name: rds-ssl-cert ``` ### 3. Alternative: Using Kubernetes Secret @@ -67,9 +67,9 @@ kubectl create secret generic rds-ssl-cert \ ```yaml # In deployment.yaml volumes: -- name: ssl-certs - secret: - secretName: rds-ssl-cert + - name: ssl-certs + secret: + secretName: rds-ssl-cert ``` ### 4. Apply Configuration @@ -99,4 +99,4 @@ extraVolumeMounts: readOnly: true ``` -**Reference**: [ToolJet Kubernetes EKS Setup Documentation](https://docs.tooljet.ai/docs/setup/kubernetes-eks) +**Reference**: [ToolJet Kubernetes EKS Setup Documentation](https://docs.tooljet.com/docs/setup/kubernetes-eks) diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/azure/best-practices.md b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/azure/best-practices.md index 84ea3c02fe..fa1b511471 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/azure/best-practices.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/azure/best-practices.md @@ -36,9 +36,9 @@ title: Best Practices and Additional Resources - [ToolJet Environment Variables Documentation](https://docs.tooljet.com/docs/setup/env-vars/) - [Azure Kubernetes Service Documentation](https://docs.microsoft.com/en-us/azure/aks/) - [Azure Container Instances Documentation](https://docs.microsoft.com/en-us/azure/container-instances/) -- [ToolJet Kubernetes AKS Setup](https://docs.tooljet.ai/docs/setup/kubernetes-aks) -- [ToolJet Azure Container Setup](https://docs.tooljet.ai/docs/setup/azure-container) +- [ToolJet Kubernetes AKS Setup](https://docs.tooljet.com/docs/setup/kubernetes-aks) +- [ToolJet Azure Container Setup](https://docs.tooljet.com/docs/setup/azure-container) :::note **Important Note**: The `PGSSLMODE=require` environment variable is mandatory for connecting to Azure Database for PostgreSQL Flexible Server. This ensures secure SSL/TLS encrypted connections are established and is a requirement for all Azure PostgreSQL databases. -::: \ No newline at end of file +::: diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/azure/deployment/aks.md b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/azure/deployment/aks.md index a5677b7d8d..fafcc58125 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/azure/deployment/aks.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/azure/deployment/aks.md @@ -1,6 +1,6 @@ --- id: aks -title: Azure Kubernetes Service (AKS) +title: Azure Kubernetes Service (AKS) --- For Azure Kubernetes Service (AKS) deployment, follow the comprehensive setup guide in the ToolJet documentation which includes detailed Kubernetes manifests, Helm charts, and configuration options. @@ -13,7 +13,7 @@ When configuring your AKS deployment, ensure you include these critical environm # Required environment variables for Azure PostgreSQL connection PG_HOST=your-server.postgres.database.azure.com PG_PORT=5432 -PG_DB=your-database-name +PG_DB=your-database-name PG_USER=your-username PGSSLMODE=require # MANDATORY for Azure PostgreSQL ``` @@ -40,4 +40,4 @@ kubectl exec -it deployment/tooljet -n tooljet -- \ psql "postgresql://username:password@your-server.postgres.database.azure.com:5432/database?sslmode=require" ``` -**Reference**: [ToolJet Kubernetes AKS Setup Documentation](https://docs.tooljet.ai/docs/setup/kubernetes-aks) +**Reference**: [ToolJet Kubernetes AKS Setup Documentation](https://docs.tooljet.com/docs/setup/kubernetes-aks) diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/azure/deployment/container.md b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/azure/deployment/container.md index c02e697bdd..5fd3872082 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/azure/deployment/container.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/azure/deployment/container.md @@ -39,4 +39,4 @@ az container logs --resource-group your-rg --name tooljet-container | grep "TOOL curl http://your-container-fqdn:3000/api/health ``` -**Reference**: [ToolJet Azure Container Setup Documentation](https://docs.tooljet.ai/docs/setup/azure-container) +**Reference**: [ToolJet Azure Container Setup Documentation](https://docs.tooljet.com/docs/setup/azure-container) diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/gcp/deployment/cloud-run.md b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/gcp/deployment/cloud-run.md index b53fe6b13b..81be83e5a2 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/gcp/deployment/cloud-run.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/gcp/deployment/cloud-run.md @@ -10,6 +10,7 @@ SSL certificates are not required for Cloud Run with Cloud SQL as SSL connection ::: **Method A: Using gcloud CLI** + ```bash # Deploy to Cloud Run with direct database connection gcloud run deploy tooljet \ @@ -27,6 +28,7 @@ gcloud run deploy tooljet \ **Method B: Using YAML configuration** Create `service.yaml`: + ```yaml apiVersion: serving.knative.dev/v1 kind: Service @@ -41,39 +43,39 @@ spec: containerConcurrency: 80 timeoutSeconds: 300 containers: - - image: tooljet/tooljet:latest - resources: - limits: - memory: 2Gi - cpu: 2000m - env: - - name: PG_HOST - value: "your-cloud-sql-ip" - - name: PG_PORT - value: "5432" - - name: PG_DB - value: "your-database-name" - - name: PG_USER - value: "postgres" - - name: PG_PASS - valueFrom: - secretKeyRef: - name: db-password - key: password - ports: - - containerPort: 3000 - livenessProbe: - httpGet: - path: /api/health - port: 3000 - initialDelaySeconds: 30 - periodSeconds: 10 - readinessProbe: - httpGet: - path: /api/health - port: 3000 - initialDelaySeconds: 10 - periodSeconds: 5 + - image: tooljet/tooljet:latest + resources: + limits: + memory: 2Gi + cpu: 2000m + env: + - name: PG_HOST + value: "your-cloud-sql-ip" + - name: PG_PORT + value: "5432" + - name: PG_DB + value: "your-database-name" + - name: PG_USER + value: "postgres" + - name: PG_PASS + valueFrom: + secretKeyRef: + name: db-password + key: password + ports: + - containerPort: 3000 + livenessProbe: + httpGet: + path: /api/health + port: 3000 + initialDelaySeconds: 30 + periodSeconds: 10 + readinessProbe: + httpGet: + path: /api/health + port: 3000 + initialDelaySeconds: 10 + periodSeconds: 5 ``` ```bash @@ -81,4 +83,4 @@ spec: gcloud run services replace service.yaml --region=your-region ``` -**Reference**: [ToolJet Google Cloud Run Setup Documentation](https://docs.tooljet.ai/docs/setup/google-cloud-run) +**Reference**: [ToolJet Google Cloud Run Setup Documentation](https://docs.tooljet.com/docs/setup/google-cloud-run) diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/gcp/deployment/docker.md b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/gcp/deployment/docker.md index cbd17d4e84..18918b8a76 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/gcp/deployment/docker.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/gcp/deployment/docker.md @@ -37,4 +37,4 @@ sudo docker-compose up -d sudo docker-compose logs tooljet | grep "TOOLJET APPLICATION STARTED SUCCESSFULLY" ``` -**Reference**: [ToolJet Docker Setup Documentation](https://docs.tooljet.ai/docs/setup/docker) +**Reference**: [ToolJet Docker Setup Documentation](https://docs.tooljet.com/docs/setup/docker) diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/gcp/deployment/gke.md b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/gcp/deployment/gke.md index 41d210b27d..4a05bbbbd7 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/gcp/deployment/gke.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/postgresql-13-16/gcp/deployment/gke.md @@ -5,7 +5,7 @@ title: Google Kubernetes Engine ### Step 1: Create ConfigMap for Database Configuration -:::note +:::note SSL certificate secrets are not required for standard GCP Cloud SQL connections as SSL is handled automatically. ::: @@ -41,34 +41,34 @@ spec: template: spec: containers: - - name: tooljet - image: tooljet/tooljet:latest - envFrom: - - configMapRef: - name: tooljet-db-config - - secretRef: - name: tooljet-secrets # Your existing secrets - env: - - name: PG_PASS - valueFrom: - secretKeyRef: - name: tooljet-db-secrets - key: postgres-password - ports: - - containerPort: 3000 - name: http - livenessProbe: - httpGet: - path: /api/health - port: 3000 - initialDelaySeconds: 30 - periodSeconds: 10 - readinessProbe: - httpGet: - path: /api/health - port: 3000 - initialDelaySeconds: 10 - periodSeconds: 5 + - name: tooljet + image: tooljet/tooljet:latest + envFrom: + - configMapRef: + name: tooljet-db-config + - secretRef: + name: tooljet-secrets # Your existing secrets + env: + - name: PG_PASS + valueFrom: + secretKeyRef: + name: tooljet-db-secrets + key: postgres-password + ports: + - containerPort: 3000 + name: http + livenessProbe: + httpGet: + path: /api/health + port: 3000 + initialDelaySeconds: 30 + periodSeconds: 10 + readinessProbe: + httpGet: + path: /api/health + port: 3000 + initialDelaySeconds: 10 + periodSeconds: 5 ``` -**Reference**: [ToolJet Kubernetes GKE Setup Documentation](https://docs.tooljet.ai/docs/setup/kubernetes-gke) +**Reference**: [ToolJet Kubernetes GKE Setup Documentation](https://docs.tooljet.com/docs/setup/kubernetes-gke) diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/tooljet-domain-change.md b/docs/versioned_docs/version-3.16.0-LTS/setup/tooljet-domain-change.md new file mode 100644 index 0000000000..98a42aa364 --- /dev/null +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/tooljet-domain-change.md @@ -0,0 +1,46 @@ +--- +id: tooljet-domain-change +title: ToolJet Domain Change +--- + +We're updating our domain from `tooljet.ai` to `tooljet.com`. + +## When is This Happening? + +The change will take place at the following times: + +- **ET (Eastern Time):** Sunday, November 23, 2025 โ€“ 11:00 PM +- **PT (Pacific Time):** Sunday, November 23, 2025 โ€“ 8:00 PM +- **GMT (Greenwich Mean Time):** Monday, November 24, 2025 โ€“ 4:00 AM +- **IST (Indian Standard Time):** Monday, November 24, 2025 โ€“ 9:30 AM + +## What This Means For You + +If your organization uses **Single Sign-On (SSO)** to access ToolJet, youโ€™ll need to update your SSO redirect URLs to continue signing in after the domain change. + +- This change is **only applicable to ToolJet Cloud** users. +- If you do **not** update your SSO configuration, **SSO login will stop working** after the domain change. + +## How to Fix it + +Youโ€™ll need to regenerate and update the redirect URL for **each SSO provider** you have configured. + +### Steps + +1. Log in to ToolJet at **`https://app.tooljet.com`**. +2. Go to: **Workspace settings โ†’ Workspace login**. +3. Under SSO providers (Google, OIDC, SAML, etc.): + - Click on each configured provider. + - Copy the new redirect URL (it will now contain `tooljet.com` instead of `tooljet.ai`). +4. Go to your SSO providerโ€™s admin console (e.g., Google, Okta, Azure AD). +5. Update the redirect/callback URL with the new **`tooljet.com`** URL. +6. Save the changes. +7. Test SSO login to ensure everything is working correctly. + +For provider-specific configuration details, refer to your usual **[SSO](/docs/user-management/sso/overview)** setup guides. + +## When to Update + +To ensure uninterrupted access for your team, **please complete this update by Sunday, November 23, 2025, at 8:00 PM** (aligned with your relevant timezone in the schedule above). + +If the redirect URLs are not updated before the domain change window, users relying on SSO will not be able to sign in until the configuration is updated. diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/tooljet-subpath.md b/docs/versioned_docs/version-3.16.0-LTS/setup/tooljet-subpath.md index 7c2ded326f..37a6705a1c 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/tooljet-subpath.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/tooljet-subpath.md @@ -30,4 +30,4 @@ If this is a new installation of the application, you may start directly with th - Users on versions earlier than v2.23.0-ee2.10.2 must first upgrade to this version before proceeding to the latest version. -_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._ +_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._ diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/try-tooljet.md b/docs/versioned_docs/version-3.16.0-LTS/setup/try-tooljet.md index 9784e17c36..8a9230e58b 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/try-tooljet.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/try-tooljet.md @@ -5,6 +5,10 @@ title: Try ToolJet # Try ToolJet +:::warning +To use ToolJet AI features in your deployment, make sure to whitelist `https://api-gateway.tooljet.ai` and `https://python-server.tooljet.ai` in your network settings. +::: + ## On local with Docker You can run the command below to have ToolJet up and running right away. @@ -46,4 +50,4 @@ docker run \ By following these instructions, you can easily run the ToolJet server on the port of your choice, ensuring flexibility in your setup. -_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at hello@tooljet.com._ +_If you have any questions feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at support@tooljet.com._ diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/upgrade-to-v3.16.md b/docs/versioned_docs/version-3.16.0-LTS/setup/upgrade-to-v3.16.md index 7318707a70..2324d3078a 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/upgrade-to-v3.16.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/upgrade-to-v3.16.md @@ -15,44 +15,44 @@ We recommend reviewing this guide and testing in a staging environment to evalua These are layout or usability improvements that may require tweaks depending on your app setup. -| Area |Change | -|:-----------|:----------| -| App Header | The **Hide app header** option has been deprecated and is now included under the Page & Navigation features. If you previously had the app header hidden, it will now be displayed. Ensure your layout accounts for this change. | -| Dark Mode & Header | **Toggle App Mode icon** disappears if the page menu is hidden. **Workaround**: Use a Button with the `Toggle App Mode` action. | -| Page Menu (Text and icon) | For page menus using the **Text and icon** style, icons will now stay visible when the menu is collapsed. This was not the case before and may slightly affect your layout. | -| Page Menu (Text only and Icon only) | Page menus using **Text only** or **Icon only** styles can no longer be collapsed. If your layout depended on collapsing these, adjustments may be needed. | -| Branding | The app logo and title now appear side-by-side in the top-left corner of the page menu. The separate top bar that previously held the title and logo has been removed. This change may affect layout balance and branding visibility. | +| Area | Change | +| :---------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| App Header | The **Hide app header** option has been deprecated and is now included under the Page & Navigation features. If you previously had the app header hidden, it will now be displayed. Ensure your layout accounts for this change. | +| Dark Mode & Header | **Toggle App Mode icon** disappears if the page menu is hidden. **Workaround**: Use a Button with the `Toggle App Mode` action. | +| Page Menu (Text and icon) | For page menus using the **Text and icon** style, icons will now stay visible when the menu is collapsed. This was not the case before and may slightly affect your layout. | +| Page Menu (Text only and Icon only) | Page menus using **Text only** or **Icon only** styles can no longer be collapsed. If your layout depended on collapsing these, adjustments may be needed. | +| Branding | The app logo and title now appear side-by-side in the top-left corner of the page menu. The separate top bar that previously held the title and logo has been removed. This change may affect layout balance and branding visibility. | ### Platform Changes Audit logs are the reports of all the activities done in your ToolJet account. Below are the default retention periods that determine how long these logs are stored, depending on your deployment type. -| Deployment | Notes | -|:--------------|:----------| -| Cloud | No change. Audit logs remain fixed to 90 days. | -| Self-Hosted | Audit logs now default to 90 days. Override via `.env`: `AUDIT_LOG_RETENTION_PERIOD=90` | +| Deployment | Notes | +| :---------- | :-------------------------------------------------------------------------------------- | +| Cloud | No change. Audit logs remain fixed to 90 days. | +| Self-Hosted | Audit logs now default to 90 days. Override via `.env`: `AUDIT_LOG_RETENTION_PERIOD=90` | ## Minor Component Changes (Low Severity) These changes may cause **minor visual shifts** but require no action unless affecting your layout. -| Component | Change Description | -|:------------------|:----------------------| -| Container | Padding updates applied. This may slightly affect alignment of tightly placed child components like headers or cards. | -| File Picker | Enhanced UI with added file size range selection, list titles, and improved visual feedback. | -| Tab | Tab headers have undergone minor visual polish, including alignment and spacing improvements. | -| List View | Padding on individual records has been slightly adjusted for consistency with other layout components. | -| Form | Internal padding revised to align with updated container spacing logic. | -| Table | A horizontal scrollbar has been added for overflow content. Scrollbar is now also wider for better accessibility. | -| Daterange Picker | Calendar popup design modernised with better visual grouping and clarity of date selection. | -| Steps | Step indicators have updated padding and width, improving alignment and usability in multi-step forms. | -| Image | Fallback UI for broken images has been improvedโ€”display is cleaner and more informative. | -| Dividers | Side padding removed on both horizontal and vertical dividers, making them appear slightly larger or more prominent. | -| Canvas | When the page menu expands, the canvas now shrinks more predictably to avoid layout clipping. | -| Page Menu (Icon) | The pin icon has been replaced with a hamburger menu icon to better reflect toggle behaviour in collapsed mode. | +| Component | Change Description | +| :--------------- | :-------------------------------------------------------------------------------------------------------------------- | +| Container | Padding updates applied. This may slightly affect alignment of tightly placed child components like headers or cards. | +| File Picker | Enhanced UI with added file size range selection, list titles, and improved visual feedback. | +| Tab | Tab headers have undergone minor visual polish, including alignment and spacing improvements. | +| List View | Padding on individual records has been slightly adjusted for consistency with other layout components. | +| Form | Internal padding revised to align with updated container spacing logic. | +| Table | A horizontal scrollbar has been added for overflow content. Scrollbar is now also wider for better accessibility. | +| Daterange Picker | Calendar popup design modernised with better visual grouping and clarity of date selection. | +| Steps | Step indicators have updated padding and width, improving alignment and usability in multi-step forms. | +| Image | Fallback UI for broken images has been improvedโ€”display is cleaner and more informative. | +| Dividers | Side padding removed on both horizontal and vertical dividers, making them appear slightly larger or more prominent. | +| Canvas | When the page menu expands, the canvas now shrinks more predictably to avoid layout clipping. | +| Page Menu (Icon) | The pin icon has been replaced with a hamburger menu icon to better reflect toggle behaviour in collapsed mode. | ## Need Help? - Reach out via our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) -- Or email us at [hello@tooljet.com](mailto:hello@tooljet.com) -- Found a bug? Please report it via [GitHub Issues](https://github.com/ToolJet/ToolJet/issues) \ No newline at end of file +- Or email us at [support@tooljet.com](mailto:support@tooljet.com) +- Found a bug? Please report it via [GitHub Issues](https://github.com/ToolJet/ToolJet/issues) diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/upgrade-to-v3.md b/docs/versioned_docs/version-3.16.0-LTS/setup/upgrade-to-v3.md index baa92cc9bd..6ad018940f 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/upgrade-to-v3.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/upgrade-to-v3.md @@ -280,5 +280,5 @@ Please check the environment variables that you need to configure to set up: ## Help and Support -- Feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or you can also e-mail us at hello@tooljet.com. +- Feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or you can also e-mail us at support@tooljet.com. - If you have found a bug, please create a [GitHub issue](https://github.com/ToolJet/ToolJet/issues) for the same. diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/v2-migration.md b/docs/versioned_docs/version-3.16.0-LTS/setup/v2-migration.md index 4e0b2314b4..482ccf29c2 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/setup/v2-migration.md +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/v2-migration.md @@ -33,5 +33,5 @@ Server may take some time to be ready to handle the HTTP request as v2 changes r ## Help and Support -- Feel free to join our highly active **[Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA)** or you can also e-mail us at **hello@tooljet.com**. +- Feel free to join our highly active **[Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA)** or you can also e-mail us at **support@tooljet.com**. - If you have found a bug, please create a **[GitHub issue](https://github.com/ToolJet/ToolJet/issues)** for the same. diff --git a/docs/versioned_docs/version-3.16.0-LTS/setup/workflow-temporal-to-bullmq-migration.md b/docs/versioned_docs/version-3.16.0-LTS/setup/workflow-temporal-to-bullmq-migration.md new file mode 100644 index 0000000000..f1ba244cf8 --- /dev/null +++ b/docs/versioned_docs/version-3.16.0-LTS/setup/workflow-temporal-to-bullmq-migration.md @@ -0,0 +1,796 @@ +--- +id: workflow-temporal-to-bullmq-migration +title: Workflow Migration - Temporal to BullMQ +--- + +# Migrating Workflows from Temporal to BullMQ + +This guide helps you migrate your ToolJet workflow scheduling system from the legacy Temporal-based architecture to the new BullMQ-based system. + +:::note +This migration guide is for ToolJet version **v3.20.37-LTS and later**. Versions prior to v3.20.37-LTS used a Temporal-based workflow system. +::: + +## Overview + +ToolJet has replaced Temporal with BullMQ for workflow scheduling, significantly simplifying deployment while maintaining all existing functionality. This change eliminates the need for separate Temporal server infrastructure and provides built-in monitoring capabilities. + +## Why Migrate? + +### Benefits of BullMQ-based Workflows + +- **Simplified Architecture**: No need for separate Temporal server deployment +- **Existing Infrastructure**: Leverages your existing Redis instance +- **Better Resource Management**: Flexible worker modes for optimized scaling +- **Improved Visibility**: Real-time job status tracking and retry capabilities + +### Architecture Comparison + +| Feature | Temporal (Old) | BullMQ (New) | +|---------|---------------|--------------| +| External Services | Temporal Server + Redis | Redis only | +| Deployment Complexity | High (multi-service) | Low (single-service) | +| Infrastructure Cost | Higher | Lower | + +## How It Works + +The new BullMQ-based workflow system operates as follows: + +1. **Workflow Scheduling**: When you schedule a workflow, it's stored in PostgreSQL and a corresponding job is created in Redis using BullMQ +2. **Job Queues**: Two BullMQ queues manage workflows: + - `workflow-schedule-queue`: Handles scheduled workflow triggers + - `workflow-execution-queue`: Manages workflow execution +3. **Worker Processing**: ToolJet instances with `WORKER=true` pick up jobs from these queues and execute them +4. **Schedule Recovery**: On startup, the Schedule Bootstrap Service automatically loads all active schedules from PostgreSQL and recreates them in Redis, ensuring no workflows are lost during deployments +5. **State Updates**: The frontend polls workflow execution states every 3 seconds via batch API calls + +## Migration Steps + +### 1. Review Current Setup + +Check your current deployment for Temporal-related configurations: + +**Environment Variables to Remove:** +```bash +# Old Temporal variables - REMOVE THESE +ENABLE_WORKFLOW_SCHEDULING=true +WORKFLOW_WORKER=true +TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default +TEMPORAL_SERVER_ADDRESS=temporal:7233 +``` + +**Services to Remove:** +- Temporal server containers/pods +- Temporal worker containers/pods + +### 2. Set Up Redis + +:::warning +**External Redis Requirement**: When running separate worker containers or multiple instances, an external stateful Redis instance is **required** for job queue coordination. The built-in Redis only works when the server and worker are in the same container instance (single instance deployment). +::: + +**Redis Requirements:** +- **Persistence**: AOF (Append Only File) must be enabled +- **Memory Policy**: `maxmemory-policy` must be set to `noeviction` (required by BullMQ) +- **Version**: Redis 6.x or higher (Redis 7.x recommended) + +**Example Redis Configuration:** +```conf +# Persistence +appendonly yes +appendfilename "appendonly.aof" +appendfsync everysec + +# Memory Management +maxmemory-policy noeviction + +# RDB Snapshots +save 900 1 +save 300 10 +save 60 10000 +``` + +**Redis Setup by Platform:** + +
+ +Kubernetes (EKS, AKS, GKE, OpenShift) + +Deploy stateful Redis: + +```bash +kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/redis-stateful.yaml +``` + +This creates: +- StatefulSet with persistent storage +- Headless Service +- ConfigMap with production-ready configuration +- Secret for password authentication + +Configure environment variables: + +```bash +REDIS_HOST=redis-service.default.svc.cluster.local +REDIS_PORT=6379 +REDIS_PASSWORD=your-secure-password +``` + +
+ +
+ +AWS ECS + +Use Amazon ElastiCache for Redis: +1. Create Redis cluster with: + - Engine version: Redis 7.x + - Node type: cache.t3.medium or higher + - Automatic failover enabled + +2. Configure parameter group: + - Set **maxmemory-policy** to **noeviction** + - Set **appendonly** to **yes** + +3. Add environment variables: + +```bash +REDIS_HOST=your-elasticache-endpoint.cache.amazonaws.com +REDIS_PORT=6379 +REDIS_PASSWORD=your-redis-password +``` + +
+ +
+ +Azure Container Apps + +Use Azure Cache for Redis: +1. Create Redis instance (Standard or Premium tier) +2. Configure Redis settings for AOF and noeviction policy +3. Add environment variables: + +```bash +REDIS_HOST=your-redis.redis.cache.windows.net +REDIS_PORT=6379 +REDIS_PASSWORD=your-redis-password +REDIS_TLS=true +``` + +
+ +
+ +Google Cloud Run + +Use Google Cloud Memorystore for Redis: +1. Create Redis instance with: + - Redis version 7.x + - High availability enabled +2. Configure Redis settings via **gcloud** CLI +3. Add environment variables: + +```bash +REDIS_HOST=your-memorystore-ip +REDIS_PORT=6379 +REDIS_PASSWORD=your-redis-password +``` + +
+ +### 3. Update Environment Variables + +Add the new BullMQ workflow environment variables: + +**Required Variables:** +```bash +# Worker Mode (required) +# Set to 'true' to enable job processing +WORKER=true + +# Redis connection settings +REDIS_HOST=localhost # Default: localhost +REDIS_PORT=6379 # Default: 6379 +REDIS_USERNAME= # Optional: Redis username (ACL) +REDIS_PASSWORD= # Optional: Redis password +REDIS_DB=0 # Optional: Redis database number (default: 0) +REDIS_TLS=false # Optional: Enable TLS/SSL (set to 'true') +``` + +**Note:** Only `REDIS_HOST` and `REDIS_PORT` are required. Authentication and TLS are optional. + +**Optional Variables:** +```bash +# Workflow Processor Concurrency (optional) +# Number of workflow jobs processed concurrently per worker +# Default: 5 +TOOLJET_WORKFLOW_CONCURRENCY=5 + +# Workflow Timeout (optional) +# Maximum execution time for a workflow in seconds +# Default: 60 +WORKFLOW_TIMEOUT_SECONDS=60 + +# Redis Configuration (optional) +REDIS_USERNAME= # Redis username (ACL) +REDIS_DB=0 # Redis database number (default: 0) +REDIS_TLS=false # Enable TLS/SSL (set to 'true') +``` + +### 4. Deploy Updated Configuration + +Update your ToolJet deployment with the new configuration: + +**For Kubernetes:** +```bash +# Update your deployment.yaml with new environment variables +kubectl apply -f deployment.yaml + +# Restart pods to apply changes +kubectl rollout restart deployment/tooljet +``` + +**For Docker/Docker Compose:** +```bash +# Update your .env file or docker-compose.yml +docker-compose down +docker-compose up -d +``` + +**For AWS ECS:** +- Update task definition with new environment variables +- Create new revision and update service + +**For Azure Container Apps:** +- Update environment variables in container app settings +- Save and restart + +### 5. Remove Temporal Infrastructure + +After confirming the new setup works: + +**For Kubernetes:** +```bash +# Remove Temporal deployments +kubectl delete deployment temporal-server +kubectl delete deployment temporal-worker +kubectl delete service temporal-service +``` + +**For Docker Compose:** +```yaml +# Remove Temporal services from docker-compose.yml +# - temporal-server +# - temporal-worker +``` + +**For ECS:** +- Stop and delete Temporal task definitions +- Remove Temporal services + +### 6. Verify Migration + +1. **Check Workflow Scheduling**: Create a new scheduled workflow in ToolJet +2. **Verify Execution**: Trigger a workflow and confirm it executes successfully +3. **Check Logs**: Review application logs for any errors + +## Scaling Workflows with Dedicated Workers + +For production deployments with extensive workflow usage, it's recommended to deploy dedicated worker instances that only process jobs without serving HTTP traffic. + +### Why Dedicated Workers? + +- **Better Resource Allocation**: Separate compute resources for API and job processing +- **Independent Scaling**: Scale workers based on job queue depth +- **Improved Reliability**: HTTP server issues don't affect job processing +- **Cost Optimization**: Use different instance sizes for API vs workers + +### Architecture + +``` + โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” + โ”‚ ToolJet Deployment โ”‚ + โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค + โ”‚ โ”‚ + โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ + โ”‚ โ”‚ Web Server โ”‚ โ”‚ Worker 1 โ”‚ โ”‚ Worker 2 โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ + โ”‚ โ”‚ WORKER=true โ”‚ โ”‚ WORKER=true โ”‚ โ”‚ WORKER=true โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ + โ”‚ โ”‚ HTTP Requestsโ”‚ โ”‚ Process Jobs โ”‚ โ”‚ Process Jobs โ”‚ โ”‚ + โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ + โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ + โ”‚ โ”‚ โ”‚ + โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ + โ”‚ + โ–ผ + โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” + โ”‚ External Redis โ”‚ + โ”‚ (Stateful) โ”‚ + โ”‚ โ”‚ + โ”‚ - Job Queue โ”‚ + โ”‚ - Persistence โ”‚ + โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +### Deployment Configuration + +#### Kubernetes Example + +
+ +ToolJet App Deployment (tooljet-deployment.yaml) +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: tooljet-deployment +spec: + replicas: 1 + strategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 1 + maxSurge: 1 + selector: + matchLabels: + component: tooljet + template: + metadata: + labels: + component: tooljet + spec: + imagePullSecrets: + - name: docker-secret + containers: + - name: tooljet + image: tooljet/tooljet:ee-lts-latest + imagePullPolicy: Always + args: ["npm", "run", "start:prod"] + resources: + limits: + memory: "2000Mi" + cpu: "2000m" + requests: + memory: "1000Mi" + cpu: "1000m" + ports: + - containerPort: 3000 + readinessProbe: + httpGet: + port: 3000 + path: /api/health + successThreshold: 1 + initialDelaySeconds: 10 + periodSeconds: 5 + failureThreshold: 6 + env: + - name: PG_HOST + valueFrom: + secretKeyRef: + name: server + key: pg_host + - name: PG_USER + valueFrom: + secretKeyRef: + name: server + key: pg_user + - name: PG_PASS + valueFrom: + secretKeyRef: + name: server + key: pg_password + - name: PG_DB + valueFrom: + secretKeyRef: + name: server + key: pg_db + - name: LOCKBOX_MASTER_KEY + valueFrom: + secretKeyRef: + name: server + key: lockbox_key + - name: SECRET_KEY_BASE + valueFrom: + secretKeyRef: + name: server + key: secret_key_base + - name: TOOLJET_HOST + valueFrom: + secretKeyRef: + name: server + key: tj_host + - name: REDIS_HOST + value: redis-service.default.svc.cluster.local + - name: REDIS_PORT + value: "6379" + - name: TOOLJET_DB + value: "tooljet_db" + - name: TOOLJET_DB_USER + value: "replace_with_postgres_database_user" + - name: TOOLJET_DB_HOST + value: "replace_with_postgres_database_host" + - name: TOOLJET_DB_PASS + value: "replace_with_postgres_database_password" + - name: PGRST_HOST + value: localhost:3002 + - name: PGRST_SERVER_PORT + value: "3002" + - name: PGRST_JWT_SECRET + value: "replace_jwt_secret_here" + - name: PGRST_DB_PRE_CONFIG + value: postgrest.pre_config + - name: PGRST_DB_URI + value: postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:port/tooljet_db + - name: PGRST_LOG_LEVEL + value: "info" + - name: DEPLOYMENT_PLATFORM + value: "k8s" +--- +apiVersion: v1 +kind: Service +metadata: + name: tooljet-service +spec: + type: LoadBalancer + ports: + - port: 80 + targetPort: 3000 + selector: + component: tooljet +``` + +
+ +
+ +Worker Deployment (tooljet-worker.yaml) +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: tooljet-worker +spec: + replicas: 2 # Scale based on job queue depth + strategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 1 + maxSurge: 1 + selector: + matchLabels: + component: tooljet-worker + template: + metadata: + labels: + component: tooljet-worker + spec: + imagePullSecrets: + - name: docker-secret + containers: + - name: tooljet-worker + image: tooljet/tooljet:ee-lts-latest + imagePullPolicy: Always + args: ["npm", "run", "start:prod"] + resources: + limits: + memory: "2000Mi" + cpu: "2000m" + requests: + memory: "1000Mi" + cpu: "1000m" + # No ports - workers don't serve HTTP + env: + # Worker-specific environment variables + - name: WORKER + value: "true" + - name: TOOLJET_WORKFLOW_CONCURRENCY + value: "10" + - name: REDIS_HOST + value: redis-service.default.svc.cluster.local + - name: REDIS_PORT + value: "6379" + # All other environment variables same as ToolJet app + - name: PG_HOST + valueFrom: + secretKeyRef: + name: server + key: pg_host + - name: PG_USER + valueFrom: + secretKeyRef: + name: server + key: pg_user + - name: PG_PASS + valueFrom: + secretKeyRef: + name: server + key: pg_password + - name: PG_DB + valueFrom: + secretKeyRef: + name: server + key: pg_db + - name: LOCKBOX_MASTER_KEY + valueFrom: + secretKeyRef: + name: server + key: lockbox_key + - name: SECRET_KEY_BASE + valueFrom: + secretKeyRef: + name: server + key: secret_key_base + - name: TOOLJET_HOST + valueFrom: + secretKeyRef: + name: server + key: tj_host + - name: TOOLJET_DB + value: "tooljet_db" + - name: TOOLJET_DB_USER + value: "replace_with_postgres_database_user" + - name: TOOLJET_DB_HOST + value: "replace_with_postgres_database_host" + - name: TOOLJET_DB_PASS + value: "replace_with_postgres_database_password" + - name: PGRST_HOST + value: localhost:3002 + - name: PGRST_SERVER_PORT + value: "3002" + - name: PGRST_JWT_SECRET + value: "replace_jwt_secret_here" + - name: PGRST_DB_PRE_CONFIG + value: postgrest.pre_config + - name: PGRST_DB_URI + value: postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:port/tooljet_db + - name: PGRST_LOG_LEVEL + value: "info" + - name: DEPLOYMENT_PLATFORM + value: "k8s" +``` + +
+ +**Key Points:** +- **ToolJet App**: Serves HTTP traffic on port 3000, `WORKER` is unset (defaults to false) +- **Worker**: Only processes jobs with `WORKER=true`, no ports exposed +- Both deployments use the same secrets and database configuration +- Worker has additional workflow-specific env var: `TOOLJET_WORKFLOW_CONCURRENCY` +- Update `REDIS_HOST` to point to your deployed Redis service + +#### Docker Compose Example + +
+ +Docker Compose Configuration + +```yaml +version: '3.8' + +services: + tooljet: + tty: true + stdin_open: true + container_name: Tooljet-app + image: tooljet/tooljet:ee-lts-latest + platform: linux/amd64 + restart: always + env_file: .env + ports: + - 80:80 + depends_on: + - postgres + - redis + environment: + SERVE_CLIENT: "true" + PORT: "80" + command: npm run start:prod + + tooljet-worker-1: + tty: true + stdin_open: true + platform: linux/amd64 + container_name: tooljet-worker-1 + image: tooljet/tooljet:ee-lts-latest + restart: always + env_file: .env + depends_on: + - postgres + - redis + environment: + WORKER: "true" + TOOLJET_WORKFLOW_CONCURRENCY: 10 + REDIS_HOST: redis + REDIS_PORT: 6379 + command: npm run start:prod + + redis: + image: redis:7 + volumes: + - redis-data:/data + command: redis-server --appendonly yes --maxmemory-policy noeviction + +volumes: + redis-data: +``` + +
+ +**Key Points:** +- `tooljet` service: Web server with `WORKER` unset (defaults to false), serves HTTP on port 80 +- `tooljet-worker-1` service: Dedicated worker with `WORKER=true`, no ports exposed +- Both services use the same `.env` file for shared configuration +- `env_file: .env` loads common environment variables (database credentials, secrets, etc.) +- Environment-specific variables are set directly in the `environment` section +- Redis configured with AOF persistence and `noeviction` policy + +#### AWS ECS Example + +
+ +ECS Task Definitions + +**Web Service Task Definition:** +```json +{ + "family": "tooljet-web", + "containerDefinitions": [ + { + "name": "tooljet", + "image": "tooljet/tooljet:ee-lts-latest", + "portMappings": [ + { + "containerPort": 3000, + "protocol": "tcp" + } + ], + "environment": [ + {"name": "WORKER", "value": "false"}, + {"name": "REDIS_HOST", "value": "your-elasticache-endpoint"} + ] + } + ] +} +``` + +**Worker Service Task Definition:** +```json +{ + "family": "tooljet-worker", + "containerDefinitions": [ + { + "name": "tooljet-worker", + "image": "tooljet/tooljet:ee-lts-latest", + "portMappings": [], // No ports needed + "environment": [ + {"name": "WORKER", "value": "true"}, + {"name": "TOOLJET_WORKFLOW_CONCURRENCY", "value": "10"}, + {"name": "REDIS_HOST", "value": "your-elasticache-endpoint"} + ] + } + ] +} +``` + +
+ +### Worker Scaling Considerations + +**When to scale workers:** +- Queue depth consistently > 100 jobs +- Job processing latency increases +- Workflows timing out + +**Scaling strategies:** +- **Horizontal**: Add more worker replicas +- **Vertical**: Increase `TOOLJET_WORKFLOW_CONCURRENCY` +- **Hybrid**: Combine both approaches + +**Monitoring metrics:** +- Job completion time +- Failed job count +- Redis memory usage +- Application logs + +## Monitoring and Troubleshooting + +### Common Issues + +#### Workflows Not Executing + +**Symptoms:** Workflows scheduled but not running + +**Solutions:** +1. Check `WORKER=true` is set in at least one instance +2. Verify Redis connection: + ```bash + # From ToolJet container + redis-cli -h $REDIS_HOST -p $REDIS_PORT ping + ``` +3. Check worker logs for errors +4. Verify `maxmemory-policy noeviction` in Redis + +#### Jobs Failing Repeatedly + +**Symptoms:** Workflow jobs fail repeatedly + +**Solutions:** +1. Check application logs for error messages +2. Verify workflow node configurations +3. Check Redis memory usage (may be full) +4. Review `WORKFLOW_TIMEOUT_SECONDS` setting + +#### Schedules Lost After Restart + +**Symptoms:** Scheduled workflows don't trigger after restart + +**Solutions:** +1. Check Schedule Bootstrap Service logs +2. Verify Redis persistence (AOF) is working +3. Confirm PostgreSQL connection is stable +4. Check Redis has sufficient memory + +## FAQ + +
+ +Do I need to recreate my workflows? + +No. All existing workflow definitions and schedules are stored in PostgreSQL and will continue to work with the new BullMQ system. The Schedule Bootstrap Service automatically loads them on startup. + +
+ +
+ +Can I use the built-in Redis for workflows? + +Yes, but only for **single instance deployments** where the server and worker are in the same container. When running separate worker containers or multiple instances, an external Redis instance with proper persistence (AOF) and **maxmemory-policy noeviction** is **required** for job queue coordination. + +
+ +
+ +What happens to in-flight workflows during migration? + +In-flight workflows in the old Temporal system will not be migrated. Complete or cancel them before migration. New schedules will trigger normally in the BullMQ system. + +
+ +
+ +Can I run both Temporal and BullMQ simultaneously? + +No. ToolJet only supports one workflow engine at a time. Choose either Temporal (legacy) or BullMQ (recommended). + +
+ +
+ +How do I monitor workflow performance? + +Monitor workflow performance using: +- Application logs for job execution details +- Redis metrics for queue depth and processing rate +- Workflow execution history in the ToolJet UI +- Database queries for job success/failure rates + +
+ +
+ +What Redis version is required? + +Redis 6.x or higher is required. Redis 7.x is recommended for best performance and features. + +
+ +## Support + +If you encounter issues during migration: + +- **Community**: Join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) +- **Email**: hello@tooljet.com +- **GitHub Issues**: [Report bugs](https://github.com/ToolJet/ToolJet/issues) diff --git a/docs/versioned_docs/version-3.16.0-LTS/tj-setup/instances.md b/docs/versioned_docs/version-3.16.0-LTS/tj-setup/instances.md index 01ad1dd147..6ccb968d12 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/tj-setup/instances.md +++ b/docs/versioned_docs/version-3.16.0-LTS/tj-setup/instances.md @@ -1,40 +1,34 @@ --- id: instances -title: Instances +title: Instances --- Instances in ToolJet refer to self-hosted deployments of the ToolJet platform. Each instance operates independently and can have its own configurations, data, and user base. You can create multiple [workspaces](/docs/tj-setup/workspaces) inside of an instance. Workspaces are collaborative environments that enable teams to build, customize, and deploy applications, as well as manage data, workflows, and permissions. When it comes to roles, ToolJet offers a [Super Admin](/docs/user-management/role-based-access/super-admin) role, who can manage the instances and has full access to all the Workspaces, Users, and Groups of an instance. Within each workspace, users can be assigned one of the predefined roles (Admin, Builder, or End User) or we can add the user to a create custom group with custom permissions . For more details on managing users and roles within workspaces, refer to the [Workspace Users and Groups](/docs/user-management/role-based-access/user-roles) documentation. - - Marketplace Plugin: Amazon Redshift - - - ## Why Use Instances? Instances help with: -- **Data Isolation**: Keeping data separate for teams, departments, or clients. -- **Compliance**: Hosting data to meet your org regulations. -- **Data Privacy**: Ensures that your data remains private. ToolJet does not have access to your data. +- **Data Isolation**: Keeping data separate for teams, departments, or clients. +- **Compliance**: Hosting data to meet your org regulations. +- **Data Privacy**: Ensures that your data remains private. ToolJet does not have access to your data. Check out the [setup guide](/docs/setup/) to explore the different options available for deploying ToolJet on your infrastructure. ## Choosing your Instance Setup -- **Single Instance:** Ideal for teams looking for quick setup with data compliance, privacy and minimal overhead. -- **Multiple Instances:** Suitable If your organization wants to: - - Manage applications across different departments with isolated setups. - - Host data in multiple regions to meet the compliance requirements. - - Set-up separate environments (e.g., development, staging, production) for stricter SDLC workflows. +- **Single Instance:** Ideal for teams looking for quick setup with data compliance, privacy and minimal overhead. +- **Multiple Instances:** Suitable If your organization wants to: + - Manage applications across different departments with isolated setups. + - Host data in multiple regions to meet the compliance requirements. + - Set-up separate environments (e.g., development, staging, production) for stricter SDLC workflows. The diagram below illustrates the multi-instance setup. - Marketplace Plugin: Amazon Redshift -If youโ€™d like to discuss your use case or need assistance, reach out via [support](mailto:hello@tooljet.com). \ No newline at end of file +If youโ€™d like to discuss your use case or need assistance, reach out via [support](mailto:support@tooljet.com). diff --git a/docs/versioned_docs/version-3.16.0-LTS/tj-setup/licensing/cloud.md b/docs/versioned_docs/version-3.16.0-LTS/tj-setup/licensing/cloud.md index 0d88c921c1..33274ff5ba 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/tj-setup/licensing/cloud.md +++ b/docs/versioned_docs/version-3.16.0-LTS/tj-setup/licensing/cloud.md @@ -3,11 +3,11 @@ id: cloud title: ToolJet Cloud --- -This guide explains the different types of subscriptions present and provides instructions on upgrading your subscription for ToolJet Cloud. For assistance in selecting an appropriate plan, visit the **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page or **[contact the ToolJet team](mailto:hello@tooljet.com)**. +This guide explains the different types of subscriptions present and provides instructions on upgrading your subscription for ToolJet Cloud. For assistance in selecting an appropriate plan, visit the **[ToolJet Pricing](https://www.tooljet.com/pricing)** page or **[contact the ToolJet team](mailto:support@tooljet.com)**. ## Types of Subscriptions -ToolJet provides three types of subscriptions - **Basic**, **Trial**, and **Paid**. These can be further categorized in different plans based on the services and features. Visit **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page for more details on different plans. +ToolJet provides three types of subscriptions - **Basic**, **Trial**, and **Paid**. These can be further categorized in different plans based on the services and features. Visit **[ToolJet Pricing](https://www.tooljet.com/pricing)** page for more details on different plans. ### Basic Subscription @@ -19,7 +19,7 @@ ToolJet offers a trial subscription which is valid for 14 days, where users can ### Paid Subscription -ToolJet offers various plans for paid subscription. Visit the **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page for more details on different plans. Once you have decided a suitable plan for your needs then you can upgrade to a paid subscription by simply clicking on the upgrade button. +ToolJet offers various plans for paid subscription. Visit the **[ToolJet Pricing](https://www.tooljet.com/pricing)** page for more details on different plans. Once you have decided a suitable plan for your needs then you can upgrade to a paid subscription by simply clicking on the upgrade button. ## AI Credit System @@ -53,7 +53,7 @@ Role Required: **Admin** 6. Upon successful payment, you'll return to the ToolJet subscription tab. A success message will display, and your subscription overview card will update shortly to reflect your new plan. Dashboard -If you've decided to move forward with Pro or customized Enterprise plan, please schedule a call with **[ToolJet team](mailto:hello@tooljet.com)** and expect a response from the team within 24-48 hours for onboarding. +If you've decided to move forward with Pro or customized Enterprise plan, please schedule a call with **[ToolJet team](mailto:support@tooljet.com)** and expect a response from the team within 24-48 hours for onboarding. ## Updated Limits in New Pricing Plan @@ -69,7 +69,7 @@ Starting from version `v3.5.34-cloud-lts`, which was released on May 27th, 2025, If a user is automatically archived due to the new pricing plan, the Admin can [archive](/docs/user-management/onboard-users/archive-user#instance-level) an active Builder or End User to free up a slot and then [unarchive](/docs/user-management/onboard-users/archive-user#instance-level-1) the desired user. -If you have any questions, feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at [hello@tooljet.com](mailto:hello@tooljet.com). +If you have any questions, feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at [support@tooljet.com](mailto:support@tooljet.com). ## FAQs diff --git a/docs/versioned_docs/version-3.16.0-LTS/tj-setup/licensing/self-hosted.md b/docs/versioned_docs/version-3.16.0-LTS/tj-setup/licensing/self-hosted.md index 07bb5114b4..b2fa691659 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/tj-setup/licensing/self-hosted.md +++ b/docs/versioned_docs/version-3.16.0-LTS/tj-setup/licensing/self-hosted.md @@ -3,13 +3,13 @@ id: self-hosted title: Self-Hosted --- -This guide explains the different types of licenses present and provides instructions on upgrading your license for Self-Hosted ToolJet. Self-Hosted ToolJet works on a license model and you can reach out to the **[ToolJet Team](mailto:hello@tooljet.com)** to generate the key. For assistance in selecting an appropriate plan visit the **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page or contact the **[ToolJet team](mailto:hello@tooljet.com)**. +This guide explains the different types of licenses present and provides instructions on upgrading your license for Self-Hosted ToolJet. Self-Hosted ToolJet works on a license model and you can reach out to the **[ToolJet Team](mailto:support@tooljet.com)** to generate the key. For assistance in selecting an appropriate plan visit the **[ToolJet Pricing](https://www.tooljet.com/pricing)** page or contact the **[ToolJet team](mailto:support@tooljet.com)**.
## Types of Licenses -ToolJet provides three types of licenses - **Basic**, **Trial**, and **Paid**. These can be further categorized into different subscription plans. Visit **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page for more details on different subscription plans. +ToolJet provides three types of licenses - **Basic**, **Trial**, and **Paid**. These can be further categorized into different subscription plans. Visit **[ToolJet Pricing](https://www.tooljet.com/pricing)** page for more details on different subscription plans. ### Basic License @@ -17,11 +17,11 @@ This is a free license where a user can access basic offerings such as creating ### Trial License -ToolJet offers a trial license which is valid for 14 days, where users can access all premium features and evaluate ToolJet according to their needs. You can contact **[ToolJet Team](mailto:hello@tooljet.com)** to generate a trial license key. +ToolJet offers a trial license which is valid for 14 days, where users can access all premium features and evaluate ToolJet according to their needs. You can contact **[ToolJet Team](mailto:support@tooljet.com)** to generate a trial license key. ### Paid License -ToolJet offers various subscription plans for paid licenses. Visit the **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page for more details on different subscription plans. Once you have decided on a suitable plan for your needs you can then contact the **[ToolJet Team](mailto:hello@tooljet.com)** to complete the onboarding process. +ToolJet offers various subscription plans for paid licenses. Visit the **[ToolJet Pricing](https://www.tooljet.com/pricing)** page for more details on different subscription plans. Once you have decided on a suitable plan for your needs you can then contact the **[ToolJet Team](mailto:support@tooljet.com)** to complete the onboarding process.
@@ -61,7 +61,7 @@ Starting from the version **`v3.5.20-ee-lts`**, the basic license will have the If a user is automatically archived due to the new pricing plan, the Super Admin can [archive](/docs/user-management/onboard-users/archive-user#instance-level) an active Builder or End User to free up a slot and then [unarchive](/docs/user-management/onboard-users/archive-user#instance-level-1) the desired user. -If you have any questions, feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at [hello@tooljet.com](mailto:hello@tooljet.com). +If you have any questions, feel free to join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA) or send us an email at [support@tooljet.com](mailto:support@tooljet.com). ## FAQs diff --git a/docs/versioned_docs/version-3.16.0-LTS/tj-setup/observability-otel.md b/docs/versioned_docs/version-3.16.0-LTS/tj-setup/observability-otel.md new file mode 100644 index 0000000000..35a2fb99c0 --- /dev/null +++ b/docs/versioned_docs/version-3.16.0-LTS/tj-setup/observability-otel.md @@ -0,0 +1,267 @@ +--- +id: observability-otel +title: Observability +--- + +ToolJet supports OpenTelemetry (OTEL) for comprehensive observability, enabling you to monitor application performance, track query executions, and analyze system health through metrics. + +**Categories of Metrics** + +1. **App-Based Metrics** - Monitor the performance and reliability of individual ToolJet applications. These metrics include detailed labels such as `app_name`, `query_name`, `environment`, `query_text`, and `query_mode` (SQL/GUI) for fine-grained analysis. + - **Query Executions:** Track total query executions per application + - **Query Duration:** Measure query execution times with histogram buckets + - **Query Failures:** Monitor failed queries with error categorization + - **Success Rates:** Application-level success rate percentages + - **App Usage:** Track application access and interaction events

+2. **Platform-Based Metrics** - Monitor the overall health and performance of your ToolJet instance: + - **HTTP Server Metrics:** Request rates, response times, status codes + - **API Performance:** Endpoint-specific latency and throughput + - **Database Operations:** Query execution times and connection health + - **Node.js Runtime:** Event loop delays, garbage collection, memory usage + - **V8 Memory:** Heap usage and external memory tracking + +## Configuration + +Enable OpenTelemetry by setting the following environment variables in your ToolJet deployment: + +#### Required Variables + +```js +# Enable OpenTelemetry metrics collection +ENABLE_OTEL=true +``` + +#### Optional Variables + +```js +# OTLP Endpoint Configuration +OTEL_EXPORTER_OTLP_TRACES=http://localhost:4318/v1/traces +OTEL_EXPORTER_OTLP_METRICS=http://localhost:4318/v1/metrics + +# Service Identification +OTEL_SERVICE_NAME=tooljet + +# Authentication (if required by your OTEL collector) +OTEL_EXPORTER_OTLP_HEADERS=api-key=your-api-key + +# Advanced Configuration +OTEL_LOG_LEVEL=debug # Enable debug logging for OTEL +OTEL_ACTIVE_USER_WINDOW_MINUTES=5 # Activity window for concurrent user tracking (default: 5) +OTEL_MAX_TRACKED_USERS=10000 # Maximum tracked users/sessions (default: 10000) + +# WARNING: High Cardinality - Only enable for debugging +OTEL_INCLUDE_QUERY_TEXT=false # Include actual query text in metrics (default: false) + # Creates HIGH CARDINALITY - use OTEL Collector to drop in production +``` + +For a complete list of OpenTelemetry environment variables, refer to the [OpenTelemetry documentation](https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/). + +## Setup Examples + +### Local OTEL Collector + +Deploy an OpenTelemetry Collector alongside ToolJet to receive and forward metrics: + +```yaml +# docker-compose.yml excerpt +otel-collector: + image: otel/opentelemetry-collector-contrib:latest + command: ["--config=/etc/otel-collector-config.yaml"] + volumes: + - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml + ports: + - "4318:4318" # OTLP HTTP receiver + - "8889:8889" # Prometheus exporter +``` + +### Grafana Cloud + +Configure ToolJet to send metrics directly to Grafana Cloud: + +```bash +ENABLE_OTEL=true +OTEL_EXPORTER_OTLP_TRACES=https://otlp-gateway-prod-us-central-0.grafana.net/otlp/v1/traces +OTEL_EXPORTER_OTLP_METRICS=https://otlp-gateway-prod-us-central-0.grafana.net/otlp/v1/metrics +OTEL_EXPORTER_OTLP_HEADERS=Authorization=Basic +OTEL_SERVICE_NAME=tooljet-production +``` + +### Datadog + +Send metrics to Datadog using the OTLP endpoint: + +```bash +ENABLE_OTEL=true +OTEL_EXPORTER_OTLP_TRACES=https://api.datadoghq.com/v1/traces +OTEL_EXPORTER_OTLP_METRICS=https://api.datadoghq.com/v1/metrics +OTEL_EXPORTER_OTLP_HEADERS=dd-api-key= +OTEL_SERVICE_NAME=tooljet +``` + +### New Relic + +Configure for New Relic OTLP endpoint: + +```bash +ENABLE_OTEL=true +OTEL_EXPORTER_OTLP_TRACES=https://otlp.nr-data.net:4318/v1/traces +OTEL_EXPORTER_OTLP_METRICS=https://otlp.nr-data.net:4318/v1/metrics +OTEL_EXPORTER_OTLP_HEADERS=api-key= +OTEL_SERVICE_NAME=tooljet +``` + +## Grafana Dashboards + +ToolJet provides two pre-built Grafana dashboards for visualizing metrics: + +### Per-App Metrics Dashboard + +Download the dashboard: +```bash +curl -O https://tooljet-deployments.s3.us-west-1.amazonaws.com/tooljet-app-dashboard.json +``` + +This dashboard focuses on application-specific metrics and includes: + +- **App Overview:** Total query executions, success rate gauge, p95 latency, failure counts +- **Query Performance:** Execution rates by query, latency percentiles, data source breakdown +- **Top Queries:** Most executed queries, slowest queries (p95), most failed queries +- **Environment Filtering:** Filter by app name, environment (production/staging/development), and mode (view/edit) + +The dashboard automatically extracts query text and environment names for immediate debugging without consulting logs. + +### Platform Metrics Dashboard + +Download the dashboard: +```bash +curl -O https://tooljet-deployments.s3.us-west-1.amazonaws.com/tooljet-platform-dashboard.json +``` + +This dashboard provides comprehensive platform monitoring: + +- **System Health:** P95 response time, request rate, error rate, total requests +- **API Analytics:** Traffic distribution, top endpoints by hits, slowest endpoints +- **Performance Trends:** Multi-percentile response time analysis (P50, P95, P99) +- **Status Codes:** Success/error distribution over time +- **Database Performance:** Query execution times, connection health +- **Runtime Metrics:** Node.js event loop, GC performance, V8 memory usage +- **Distributed Tracing:** Integration with Jaeger for trace viewing + +### Importing Dashboards + +To import the Grafana dashboards: + +1. Download the dashboard JSON files: + ```bash + # Download App-Based Metrics Dashboard + curl -O https://tooljet-deployments.s3.us-west-1.amazonaws.com/tooljet-app-dashboard.json + + # Download Platform-Based Metrics Dashboard + curl -O https://tooljet-deployments.s3.us-west-1.amazonaws.com/tooljet-platform-dashboard.json + ``` +2. Open Grafana and navigate to **Dashboards** โ†’ **Import** +3. Click **Upload JSON file** and select the downloaded dashboard JSON file +4. Select your Prometheus data source +5. Click **Import** + +The dashboards will be immediately available with real-time data from your ToolJet instance. + +## Production Considerations + +### High Cardinality Warning + +The app-based metrics can optionally include a `query_text` label that contains the actual SQL or query content. **By default, this is disabled** to prevent high cardinality issues. + +#### Enabling Query Text (For Debugging Only) + +To enable query text in metrics for debugging purposes: + +```bash +OTEL_INCLUDE_QUERY_TEXT=true +``` + +:::warning +Enabling `query_text` creates **high cardinality time series** that can significantly impact Prometheus storage and query performance. Only enable this temporarily for debugging specific query issues. +::: + +#### Production Best Practices + +If you must enable `query_text` in production: + +1. **Use an OTEL Collector** to drop the label before metrics reach Prometheus: + +```yaml +# otel-collector-config.yaml +processors: + attributes: + actions: + - key: query_text + action: delete + +service: + pipelines: + metrics: + receivers: [otlp] + processors: [attributes] + exporters: [prometheus] +``` + +2. **Alternative: Hash the query text** to reduce cardinality: + +```yaml +processors: + transform: + metric_statements: + - context: datapoint + statements: + - set(attributes["query_text"], SHA256(attributes["query_text"])) +``` + +### Performance Impact + +OpenTelemetry metrics collection has minimal performance impact: + +- Metric collection is asynchronous and non-blocking +- Histogram buckets are pre-configured for optimal performance +- Observable gauges (like success rates) are updated on a 15-minute interval + +### Sampling and Filtering + +For high-volume deployments, consider: + +- **Filtering environments:** Only collect metrics from production environments +- **Sampling queries:** Use OTEL Collector sampling for high-frequency queries +- **Aggregation:** Pre-aggregate metrics at the collector level before storage + +## Troubleshooting + +### Metrics Not Appearing + +1. Verify `ENABLE_OTEL=true` is set +2. Check OTEL collector endpoint is reachable: + ```bash + curl http://localhost:4318/v1/metrics + curl http://localhost:4318/v1/traces + ``` +3. Review ToolJet server logs for OTEL connection errors +4. Verify OTEL collector configuration and Prometheus scrape targets + +### High Memory Usage + +If you experience high memory usage: + +1. Remove high-cardinality labels like `query_text` using OTEL Collector processors +2. Reduce histogram bucket counts if needed +3. Implement metric filtering at the collector level +4. Consider using remote write to offload storage + +### Missing Labels or Metrics + +Ensure you're using ToolJet version 3.16.0-LTS or higher, which includes the full OTEL implementation with both app-based and platform-based metrics. + +## Additional Resources + +- [OpenTelemetry Documentation](https://opentelemetry.io/docs/) +- [OpenTelemetry Collector](https://opentelemetry.io/docs/collector/) +- [Grafana OTLP Integration](https://grafana.com/docs/grafana-cloud/monitor-infrastructure/otlp/) +- [Prometheus OTLP Receiver](https://prometheus.io/docs/prometheus/latest/feature_flags/#otlp-receiver) diff --git a/docs/versioned_docs/version-3.16.0-LTS/tooljet-api.md b/docs/versioned_docs/version-3.16.0-LTS/tooljet-api.md index 0dfa708084..1f018224a9 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/tooljet-api.md +++ b/docs/versioned_docs/version-3.16.0-LTS/tooljet-api.md @@ -48,20 +48,12 @@ By default, the ToolJet API is disabled. To enable the API, add these variables The ToolJet API is secured with an access token created by you in your `.env` file. You need to pass the access token in the `Authorization` header to authenticate your requests. The access token should be sent in the format `Basic `. -
- -cURL Request Example - -```bash - -curl -X GET 'https://your-tooljet-instance.com/api/ext/users' \ +```bash title="cURL Request Example" +curl -X GET 'https://{your-tooljet-instance.com}/api/ext/users' \ -H 'Authorization: Basic ' \ -H 'Content-Type: application/json' - ``` -
- ## API Endpoints ### Get All Users @@ -73,72 +65,108 @@ curl -X GET 'https://your-tooljet-instance.com/api/ext/users' \ - **Content-Type:** `application/json` - **Response:** Array of User objects. + + ```bash title="cURL Request" + curl -X GET https://{your-domain}/api/ext/users \ + -H "Authorization: Basic " \ + -H "Content-Type: application/json" + ``` +
**Response Example** ```json [ - { - "id": "5b1608df-5e14-474b-b304-919623a9be57", - "name": "Sam Oliver", - "email": "sam@example.com", - "status": "active", - "workspaces": [ - { - "id": "a831db72-c3d2-4b36-a98e-0023ffb15e66", - "name": "demo-workspace", - "status": "active", - "groups": [ - { - "id": "b3ae95dd-b1ca-4a21-abac-b321ee76698e", - "name": "all_users" - }, - { - "id": "1830a113-24e5-4e33-8af2-e6502d477239", - "name": "admin" - } - ] + { + "id":"1034fd65-7b40-474c-ab79-42d32780b299", + "name":"John Doe", + "email":"john@example.com", + "status":"active", + "workspaces": + [ + { + "id":"22056424-6e01-41d9-b090-62a321388433", + "name":"Nexus Corps", + "status":"active", + "userPermission":{ + "id":"325dac2e-fb34-47a3-bc8f-0653aa38c465", + "organizationId":"22056424-6e01-41d9-b090-62a321388433", + "name":"admin", + "type":"default", + "appCreate":true, + "appDelete":true, + "workflowCreate":true, + "workflowDelete":true, + "folderCRUD":true, + "orgConstantCRUD":true, + "dataSourceCreate":true, + "dataSourceDelete":true, + "appPromote":true, + "appRelease":true, + "createdAt":"2025-09-23T13:33:43.196Z", + "updatedAt":"2025-09-23T13:33:43.196Z" } - ] - }, - { - "id": "919623a-5e14-4v4b-63b4-3343a9be57", - "name": "David Smith", - "email": "david@example.com", - "status": "active", - "workspaces": [ - { - "id": "a831db72-c3d2-4b36-a98e-0023ffb15e66", - "name": "demo-workspace", - "status": "active", - "groups": [ - { - "id": "b3ae95dd-b1ca-4a21-abac-b321ee76698e", - "name": "all_users" - }, - { - "id": "1830a113-24e5-4e33-8af2-e6502d477239", - "name": "admin" - } - ] - }, - { - "id": "b8a0c07d-2430-46fd-ba71-2a71e48fde30", - "name": "team-spac", - "status": "active", - "groups": [ - { - "id": "7f7af977-a7e7-49e3-a08a-2dffce6f5942", - "name": "all_users" - }, - { - "id": "eda68cf3-b70d-455f-8a2a-8cd4bbff77a6", - "name": "admin" - } - ] - } - ] } - ] + ], + "userGroups": + [ + { + "id":"c8865750-f5cb-4af5-addd-dd56f51f9bcd", + "name":"admin" + } + ], + "userDetails":[] + }, + { + "id":"8778588d-972f-4fe1-bd6c-7432e64d6632", + "name":"James Smith", + "email":"james@example.com", + "status":"invited", + "workspaces": + [ + { + "id":"22056424-6e01-41d9-b090-62a321388433", + "name":"Nexus Corps", + "status":"active", + "userPermission":{ + "id":"a5af486e-28e6-468c-b92c-eac5d7583d00", + "organizationId":"22056424-6e01-41d9-b090-62a321388433", + "name":"end-user", + "type":"default", + "appCreate":false, + "appDelete":false, + "workflowCreate":false, + "workflowDelete":false, + "folderCRUD":false, + "orgConstantCRUD":false, + "dataSourceCreate":false, + "dataSourceDelete":false, + "appPromote":false, + "appRelease":false, + "createdAt":"2025-09-23T13:33:43.196Z", + "updatedAt":"2025-09-23T13:33:43.196Z" + } + } + ], + "userGroups": + [ + { + "id":"e27ca96f-c8a9-4cdc-aa9d-a435cab1358b", + "name":"end-user" + } + ], + "userDetails": + [ + { + "organizationId":"22056424-6e01-41d9-b090-62a321388433", + "ssoUserInfo":null, + "userMetadata": + { + "user_api_key":"123xxfjnf489njf589o53njfv0935n0953" + } + } + ] + } +] ```
@@ -151,6 +179,12 @@ curl -X GET 'https://your-tooljet-instance.com/api/ext/users' \ - **Content-Type:** `application/json` - **Response:** Array of Workspace objects. + ```bash title="cURL Request" + curl -X GET https://{your-domain}/api/ext/workspaces \ + -H "Authorization: Basic " \ + -H "Content-Type: application/json" + ``` +
Response Example @@ -202,6 +236,12 @@ curl -X GET 'https://your-tooljet-instance.com/api/ext/users' \ - **workspace_id**: The ID of the workspace. - **Response:** Array of app details for all the applications in the workspace. + ```bash title="cURL Request" + curl -X GET https://{your-domain}/api/ext/workspace/:workspace_id/apps \ + -H "Authorization: Basic " \ + -H "Content-Type: application/json" + ``` +
**Response Example** ```json @@ -259,6 +299,12 @@ curl -X GET 'https://your-tooljet-instance.com/api/ext/users' \ - id (string): The ID of the user. - **Response:** User object. + ```bash title="cURL Request" + curl -X GET https://{your-domain}/api/ext/user/:id \ + -H "Authorization: Basic " \ + -H "Content-Type: application/json" + ``` +
**Response Example** ```json @@ -322,7 +368,31 @@ curl -X GET 'https://your-tooljet-instance.com/api/ext/users' \ - `groups` (array, optional): An array of group objects associated with the workspace. Each group object can contain: - `id` (string, optional): The unique identifier of the group. - `name` (string, optional): The name of the group. - - `status` (string, optional): The status of the group. Can be either `active` or `archived`. + + ```bash title="cURL Request" + curl -X POST https://{your-domain}/api/ext/users \ + -H "Authorization: Basic " \ + -H "Content-Type: application/json" \ + -d '{ + "name": "", + "email": "", + "password": "", + "status": "", + "workspaces": [ + { + "id": "", + "name": "", + "status": "", + "groups": [ + { + "id": "", + "name": "" + } + ] + } + ] + }' + ```
**Request Body Example** @@ -363,6 +433,17 @@ curl -X GET 'https://your-tooljet-instance.com/api/ext/users' \ - `password` (string, optional): The updated password for the user. Must be between 5 and 100 characters. - `status` (string, optional): The updated status of the user. Can be either `active` or `archived`. + ```bash title="cURL Request" + curl -X PATCH https://{your-domain}/api/ext/user/:id \ + -H "Authorization: Basic " \ + -H "Content-Type: application/json" \ + -d '{ + "name": "", + "email": "", + "password": "", + "status": "" + }' + ```
@@ -394,6 +475,15 @@ curl -X GET 'https://your-tooljet-instance.com/api/ext/users' \ - `newRole` (string, required): The updated user role of the user. - `userId` (string, required): The unique identifier of the user. + ```bash title="cURL Request" + curl -X PUT https://{your-domain}/api/ext/update-user-role/workspace/:workspaceId \ + -H "Authorization: Basic " \ + -H "Content-Type: application/json" \ + -d '{ + "newRole": "", + "userId": "" + }' + ```
@@ -426,16 +516,50 @@ curl -X GET 'https://your-tooljet-instance.com/api/ext/users' \ - `groups` (array, optional): An array of group objects associated with the workspace. Each group object can contain: - `id` (string, optional): The unique identifier of the group. - `name` (string, optional): The name of the group. - - `status` (string, optional): The status of the group. Can be either `active` or `archived`. + + ```bash title="cURL Request" + curl -X PUT https://{your-domain}/api/ext/user/:id/workspaces \ + -H "Authorization: Basic " \ + -H "Content-Type: application/json" \ + -d '[ + { + "id": "", + "name": "", + "status": "", + "groups": [ + { + "id": "", + "name": "" + } + ] + } + ]' + ``` + +
+ +Request Body Example + +```json +{ + "status": "archived", + "groups": [ + { + "name": "all_users" + } + ] +} +``` + +
- **Note:** If the array is empty, it will remove all existing workspace relations. - **Response:** `200 OK` - ### Replace User Workspace - **Description:** Updates a specific workspace relation associated with a user. - - **URL:** `/api/ext/user/:id/workspaces/:workspaceId` + - **URL:** `/api/ext/user/:id/workspace/:workspaceId` - **Method:** PATCH - **Authorization:** `Basic ` - **Content-Type:** `application/json` @@ -450,6 +574,23 @@ curl -X GET 'https://your-tooljet-instance.com/api/ext/users' \ - `id` (string, optional): The ID of the group. - `name` (string, optional): The name of the group. + ```bash title="cURL Request" + curl -X PATCH https://{your-domain}/api/ext/user/:id/workspace/:workspaceId \ + -H "Authorization: Basic " \ + -H "Content-Type: application/json" \ + -d '{ + "id": "", + "name": "", + "status": "", + "groups": [ + { + "id": "", + "name": "" + } + ] + }' + ``` +
Request Body Example @@ -471,8 +612,6 @@ curl -X GET 'https://your-tooljet-instance.com/api/ext/users' \ ### Export Application -From version **`v3.5.7-ee-lts`**, you can use ToolJet API to export application. - - **Description:** Export a ToolJet Application from a specified workspace. - **URL:** `/api/ext/export/workspace/:workspace_id/apps/:app_id` - **Method:** POST @@ -487,6 +626,12 @@ From version **`v3.5.7-ee-lts`**, you can use ToolJet API to export application. - **exportAllVersions** (boolean): Defines whether to export all the available versions. By default it exports the latest version of the app. - **Response:** Exported application json. + ```bash title="cURL Request" + curl -X POST "https://{your-domain}/api/ext/export/workspace/:workspace_id/apps/:app_id?exportTJDB=&appVersion=&exportAllVersions=" \ + -H "Authorization: Basic " \ + -H "Content-Type: application/json" + ``` +
Response Example @@ -921,8 +1066,6 @@ From version **`v3.5.7-ee-lts`**, you can use ToolJet API to export application. ### Import Application -From version **`v3.5.7-ee-lts`**, you can use ToolJet API to import application. - - **Description:** Import a Application in ToolJet Workspace. - **URL:** `/api/ext/import/workspace/:workspace_id/apps` - **Method:** POST @@ -934,6 +1077,16 @@ From version **`v3.5.7-ee-lts`**, you can use ToolJet API to import application. - Application JSON - `appName` (string, optional): Defines the application name. If not defined then the app will be imported with the existing app name. + ```bash title="cURL Request" + curl -X POST https://{your-domain}/api/ext/import/workspace/:workspace_id/apps \ + -H "Authorization: Basic " \ + -H "Content-Type: application/json" \ + -d '{ + "appName": "", + + }' + ``` + :::info By default, server accepts maximum JSON size as 50 MB. To increase this limit, use the following environment variable: `MAX_JSON_SIZE` diff --git a/docs/versioned_docs/version-3.16.0-LTS/tooljet-db/querying-tooljet-db.md b/docs/versioned_docs/version-3.16.0-LTS/tooljet-db/querying-tooljet-db.md index d264421385..e4f6f0d6df 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/tooljet-db/querying-tooljet-db.md +++ b/docs/versioned_docs/version-3.16.0-LTS/tooljet-db/querying-tooljet-db.md @@ -128,7 +128,6 @@ When you are creating, updating, or deleting records in a table that has a forei ToolJet database - - Similarly, if you are trying to delete a row in the target table, you need to ensure that the foreign key value is not being referenced in the source table. ## Join Tables @@ -145,7 +144,7 @@ You can join two or more tables in the ToolJet database by using the **Join** op - **On**: Select the column from the **selected table** and the **joining table** on which you want to join the tables. Currently, only `=` operation is supported for joining tables. If the selected table and the joining table have a foreign key relationship, both the columns will be auto-populated in the **On** dropdown. ToolJet database - + - **AND or OR condition**: You can add multiple conditions by clicking on the **+Add more** button below each join. The conditions can be joined by `AND` or `OR` operation. ToolJet Database editor @@ -270,5 +269,5 @@ A nested JSON object is a JSON structure that contains key-value pairs, where so
:::info -If you have any other questions or feedback about **ToolJet Database**, please reach us out at hello@tooljet.com or join our **[Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA)** +If you have any other questions or feedback about **ToolJet Database**, please reach us out at support@tooljet.com or join our **[Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-2rk4w42t0-ZV_KJcWU9VL1BBEjnSHLCA)** ::: diff --git a/docs/versioned_docs/version-3.16.0-LTS/tooljet-db/tooljet-database.md b/docs/versioned_docs/version-3.16.0-LTS/tooljet-db/tooljet-database.md index 0c7c4bbf93..bf7eba49fa 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/tooljet-db/tooljet-database.md +++ b/docs/versioned_docs/version-3.16.0-LTS/tooljet-db/tooljet-database.md @@ -14,6 +14,7 @@ Use the ToolJet-hosted database to build apps faster, and manage your data with ## Enabling the ToolJet Database for your instance Requires: + - PostgREST server - Additional configuration for ToolJet server @@ -26,18 +27,18 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#toolj PostgREST is a standalone web server that turns your PostgreSQL database directly into queryable RESTful APIs which is utilized for Tooljet Database. This server only communicates with the ToolJet server and therefore does not need to be publicly exposed. :::tip -If you have openssl installed, you can run the +If you have openssl installed, you can run the command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. If this parameter is not specified, then PostgREST refuses authentication requests. ::: -|
Variable
|
Description
| -| ---------------------------- | ----------------------------------------------- | -| PGRST_JWT_SECRET | JWT token client provided for authentication | -| PGRST_DB_URI | database connection string for tooljet database | -| PGRST_LOG_LEVEL | `info` | -| PGRST_DB_PRE_CONFIG | postgrest.pre_config | +|
Variable
|
Description
| +| ---------------------------------------------- | ------------------------------------------------- | +| PGRST_JWT_SECRET | JWT token client provided for authentication | +| PGRST_DB_URI | database connection string for tooljet database | +| PGRST_LOG_LEVEL | `info` | +| PGRST_DB_PRE_CONFIG | postgrest.pre_config | :::info Please make sure that DB_URI is given in the format `postgres://[USERNAME]:[PASSWORD]@[HOST]:[PORT]/[DATABASE]` @@ -47,19 +48,17 @@ Please make sure that DB_URI is given in the format `postgres://[USERNAME]:[PASS #### Additional ToolJet server configuration - -|
Variable
|
Description
| -| ------------------ | -------------------------------------------- | -| TOOLJET_DB | Default value is `tooljet_db` | -| TOOLJET_DB_HOST | database host | -| TOOLJET_DB_USER | database username | -| TOOLJET_DB_PASS | database password | -| TOOLJET_DB_PORT | database port | -| PGRST_JWT_SECRET | JWT token client provided for authentication | -| PGRST_HOST | postgrest database host | -| TOOLJET_DB_BULK_UPLOAD_MAX_ROWS | Maximum rows allowed to bulk upload. Default value is 1000 | -| TOOLJET_DB_BULK_UPLOAD_MAX_CSV_FILE_SIZE_MB | Maximum file size of CSV for bulk upload. Default value is 5 MB | - +|
Variable
|
Description
| +| ---------------------------------------------- | --------------------------------------------------------------- | +| TOOLJET_DB | Default value is `tooljet_db` | +| TOOLJET_DB_HOST | database host | +| TOOLJET_DB_USER | database username | +| TOOLJET_DB_PASS | database password | +| TOOLJET_DB_PORT | database port | +| PGRST_JWT_SECRET | JWT token client provided for authentication | +| PGRST_HOST | postgrest database host | +| TOOLJET_DB_BULK_UPLOAD_MAX_ROWS | Maximum rows allowed to bulk upload. Default value is 1000 | +| TOOLJET_DB_BULK_UPLOAD_MAX_CSV_FILE_SIZE_MB | Maximum file size of CSV for bulk upload. Default value is 5 MB | If you intend to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). @@ -92,12 +91,10 @@ ToolJet database allows you to: Once you log-in to your ToolJet account, from the left sidebar of the dashboard you can navigate to **ToolJet Database**. -The ToolJet Database is available on: **[ToolJet Cloud](https://tooljet.ai)**, **[Self-Host](/docs/setup/)**, and **Enterprise Edition**. You can manage your database and its data using the **Database editor UI**. +The ToolJet Database is available on: **[ToolJet Cloud](https://tooljet.com)**, **[Self-Host](/docs/setup/)**, and **Enterprise Edition**. You can manage your database and its data using the **Database editor UI**.
ToolJet database
- - diff --git a/docs/versioned_docs/version-3.16.0-LTS/user-management/role-based-access/access-control.md b/docs/versioned_docs/version-3.16.0-LTS/user-management/role-based-access/access-control.md index 3d7a669d36..890361d48d 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/user-management/role-based-access/access-control.md +++ b/docs/versioned_docs/version-3.16.0-LTS/user-management/role-based-access/access-control.md @@ -8,18 +8,18 @@ ToolJet enables you to manage access control by configuring permissions like cre ## Permissions The following permissions can be configured for the given resources: -| Resource | Permission | Description | -|:----------------------------|:----------------------|:--------------------------------------------------------------------------------------------| -| **Apps** | Create | Allows users of the group to create new applications within the workspace. | -| | Delete | Allows users of the group to delete applications from the workspace. | -| | Promote | Allows users of the group to promote the applications from one environment to the other. | -| | Release | Allows users of the group to release the applications from the production environment. | -| **Data sources** | Create | Allows users of the group to add new data sources in the workspace. | -| | Delete | Allows users of the group to remove data sources from the workspace. | -| **Folder** | Create/Update/Delete | Allows users of the group to create, update, or delete folders to organize resources. | +| Resource | Permission | Description | +|:---------|:-----------|:------------| +| **Apps** | Create | Allows users of the group to create new applications within the workspace. | +| | Delete | Allows users of the group to delete applications from the workspace. | +| | Promote | Allows users of the group to promote the applications from one environment to the other. | +| | Release | Allows users of the group to release the applications from the production environment. | +| **Data sources** | Create | Allows users of the group to add new data sources in the workspace. | +| | Delete | Allows users of the group to remove data sources from the workspace. | +| **Folder** | Create/Update/Delete | Allows users of the group to create, update, or delete folders to organize resources. | | **Workspace constants/variables** | Create/Update/Delete | Allows users of the group to define, modify, or remove constants and variables used across the workspace. | -| **Workflows** | Create | Allows users of the group to create new workflows within the workspace. | -| | Delete | Allows users of the group to delete workflows from the workspace. | +| **Workflows** | Create | Allows users of the group to create new workflows within the workspace. | +| | Delete | Allows users of the group to delete workflows from the workspace. | To configure view or edit access, please refer to **[Granular Access Control](#granular-access-control)**. @@ -52,7 +52,7 @@ To configure Granular Access Control, you need to create custom groups. Refer to - **Edit**: Grants edit access to the selected apps. With this access, users can build or edit the apps they are granted access to. This permission should be assigned to builders or developers. -- **View**: With view access, users can view the released version of the selected apps and use them to perform tasks. This access does not allow users to edit or make changes to the apps. This permission should be assigned to end users or the consumers. +- **View**: With View access, users can preview the application in the development and staging environments, and access the released version in the production environment. This access level does not allow users to edit or modify the application. It is best suited for end users, testers, or consumers who only need to review or use the app. - **Hide from dashboard**: Hides the selected apps from the dashboard, making them accessible only via URL for users with view access. While the users with edit access can always see the app on the dashboard. diff --git a/docs/versioned_docs/version-3.16.0-LTS/user-management/sso/ldap.md b/docs/versioned_docs/version-3.16.0-LTS/user-management/sso/ldap.md index 03075d9d7e..bbb532018f 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/user-management/sso/ldap.md +++ b/docs/versioned_docs/version-3.16.0-LTS/user-management/sso/ldap.md @@ -41,3 +41,26 @@ Role Required: **Admin**
During the first login, ToolJet performs additional checks. It verifies the user groups in the LDAP server, and if the corresponding group exists in the ToolJet workspace, the user will be automatically added to that group. Additionally, ToolJet also looks for the user's profile picture in the LDAP server and updates the ToolJet account accordingly. ::: + +## Support for Multiple Organizational Units + +ToolJetโ€™s LDAP SSO implementation supports authentication across multiple Organizational Units (OUs). This allows ToolJet to search across multiple base Distinguished Names (DNs) to locate and authenticate users, making it easier to support complex directory structures. + +### How to Enable Multi-OU Support + +To enable support for multiple OUs, admins can configure a list of base DNs using an environment variable. ToolJet will attempt to authenticate users against each base DN in the order they are defined. + +**Environment Variable** +Set the `TOOLJET_LDAP_BASE_DNS__` environment variable with a JSON array of base DNs. Make sure to update your workspace slug in place of ``. + +Example: + +```javascript +TOOLJET_LDAP_BASE_DNS__nexus_corps='["ou=team1,dc=company,dc=com","ou=team2,dc=company,dc=com"]' +``` + +ToolJet will iterate through the provided list during login attempts, checking each base DN until a matching user is found or all options are exhausted. + +**Notes** +- If `TOOLJET_LDAP_BASE_DNS__` is not set, ToolJet will default to the single OU behavior to maintain backward compatibility. +- The order of base DNs mattersโ€”authentication will follow the sequence defined in the array. diff --git a/docs/versioned_docs/version-3.16.0-LTS/user-management/sso/oidc/okta.md b/docs/versioned_docs/version-3.16.0-LTS/user-management/sso/oidc/okta.md index 3c04a56277..a9a727e333 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/user-management/sso/oidc/okta.md +++ b/docs/versioned_docs/version-3.16.0-LTS/user-management/sso/oidc/okta.md @@ -12,7 +12,10 @@ Okta can be configured as the Identity Provider for OIDC, which is an authentica 2. Navigate to the **Applications** section and click **Create App Integration**. Okta: SSO -3. Select **OIDC - OpenID Connect** as the **Sign-in method** and **Web Application** as the **Application type**. Click on the **Next** button. +3. Select **OIDC - OpenID Connect** as the **Sign-in method** and select the **Application type**: + - **Web Application** for Authorization Code + - **Single Page Application** for Authorization Code with PKCE

+Click on the **Next** button.

Okta: SSO 4. Enter an **App integration name** and set the **Sign-in redirect URIs** to Redirect URL from ToolJet. diff --git a/docs/versioned_docs/version-3.16.0-LTS/user-management/sso/oidc/setup.md b/docs/versioned_docs/version-3.16.0-LTS/user-management/sso/oidc/setup.md index d55fecb638..0b903be4cd 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/user-management/sso/oidc/setup.md +++ b/docs/versioned_docs/version-3.16.0-LTS/user-management/sso/oidc/setup.md @@ -15,6 +15,16 @@ title: OpenID Connect Setup OpenID Connect (OIDC) is an authentication protocol that helps applications verify users' identities using an identity provider. By configuring OIDC with identity providers like **[Azure AD](/docs/user-management/sso/oidc/azuread)**, **[Google](/docs/user-management/sso/oidc/google)** or **[Okta](/docs/user-management/sso/oidc/okta)**, you can set up easy and safe authentication for your users in ToolJet. +## Grant Type + +#### Authorization Code + +Choose this when configuring SSO for server-side applications where you can securely store the Client Secret. This is ideal for enterprise setups where ToolJet can safely handle the secret and communicate with your identity provider. + +#### Authorization Code with PKCE + +Choose this when configuring SSO for public clients like apps running in the browser, mobile apps, or environments where storing a Client Secret securely is not possible. PKCE ensures secure authentication without exposing secrets. + ## Configuring OIDC Follow these steps to enable OIDC in your system: @@ -34,11 +44,13 @@ Go to **Settings > Instance login**.
(Example URL - `https://app.corp.com/nexus/workspace-settings/workspace-login`) 3. On the right, you'll see toggles to enable SSO via different clients. All the client toggles are disabled by default. Turn on the toggle in front of OpenID Connect. - Add user button + Add user button -4. After turning it on, a modal will appear with input fields for parameters such as Name, Client ID, Client secret and Well known URL. At the top left of the modal, there is a toggle to enable this modal. Turn it on, and then, without entering any parameters, click on the Save changes button. This will generate a Redirect URL, which you will need to obtain the credentials from the Identity Provider. - Add user button +4. After turning it on, a modal will appear with input fields for parameters such as Name, Client ID, and Well known URL. At the top left of the modal, there is a toggle to enable this modal. Turn it on, and then, without entering any parameters, click on the Save changes button. This will generate a Redirect URL, which you will need to obtain the credentials from the Identity Provider. + Add user button -5. Find and set **Client Id**, **Client Secret**, and **Well Known URL** from your identity provider and click on **Save changes** at the bottom of the modal. +5. Open the modal again and choose the Grant type. ToolJet supports Authorization Code, which requires a Client ID and Client Secret, and Authorization Code with PKCE, which does not require a Client Secret. + +6. After selecting the grant type, provide the Client ID, Client Secret / Code Verifier, and Well-Known URL from your identity provider. Once done, click Save changes at the bottom of the modal. Upon saving, OIDC SSO will be successfully enabled using your configured Identity Provider, allowing your users to seamlessly authenticate via OpenID Connect for enhanced security and ease of use. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.16.0-LTS/user-management/sso/scim/overview.md b/docs/versioned_docs/version-3.16.0-LTS/user-management/sso/scim/overview.md new file mode 100644 index 0000000000..a671c5135f --- /dev/null +++ b/docs/versioned_docs/version-3.16.0-LTS/user-management/sso/scim/overview.md @@ -0,0 +1,180 @@ +--- +id: overview +title: Overview +--- + +
+
+ Icon + Paid feature +
+
+ +System for Cross-domain Identity Management (**SCIM**) enables automated user and group provisioning for enterprise customers. With SCIM, identity providers (IdPs) like Okta can automatically create, update, deactivate, and sync users in ToolJet, removing the need for manual user management. + +#### Use Cases +- Automatically provision new users in ToolJet when they are added in the IdP. +- Update user attributes (name, email, role mapping) in real time based on IdP changes. +- Archive users in ToolJet instantly when access is revoked in the IdP. +- Maintain a centralized, secure identity workflow across large teams and enterprises. +- Reduce manual user management and minimize access control errors. + +#### Roles vs Groups + +- ToolJet only manages Custom Groups via SCIM. +- User Roles must be passed as part of the User attributes (not through groups). +- If no role is provided, **the user defaults to an end-user**, this **may cause permission mismatches** if the user belongs to a builder/admin custom group. + +#### Default Workspace + +- All SCIM operations (User and Group creation, updates, deletions) are performed in the Default Workspace of your ToolJet instance. + +#### Group Management + +- Only Custom Groups are supported via SCIM. +- Any group created in your IDP will be considered a Custom Group for Tooljet +- To sync a group with ToolJet, assign the group to your SCIM application or push groups manually from your IdP (e.g., Okta). + +#### User Management + +- Users must be assigned to the ToolJet SCIM application in your IdP. +- Only then will be provisioning and updates (create, update, deactivate, delete) be synchronized with ToolJet. + +#### Editable User Attributes + +ToolJet supports SCIM updates for: +- firstName +- lastName +- email +- status +- groups + +## SCIM Setup + +### API Configuration + +To enable SCIM provisioning, integrate the ToolJet SCIM API endpoint with your IdP. + +Base URL: + +```js +https:///api/scim/v2 +``` + +### Authentication Setup + +ToolJet supports Basic Authentication as well as Header Token Authentication. + +Add the following environment variables in your ToolJet backend `.env` file: + +```js +SCIM_BASIC_AUTH_USER=customer +SCIM_BASIC_AUTH_PASS=pass +SCIM_HEADER_AUTH_TOKEN=12345 +SCIM_ENABLED=true +``` +:::warning IMPORTANT +Make sure `SCIM_ENABLED` is set to **true** โ€” otherwise SCIM endpoints will not be active. +::: + +### Verify the Connection + +Once setup is complete, test the SCIM connection from your IdP. Send a **GET** request to `/Users` and `/Groups`: + +``` +https://your-domain.com/api/scim/v2/Users +``` + +You should receive a list of existing users and groups from ToolJet. If the connection succeeds, your SCIM app is ready to proceed. + +
+ +Request Body Example + +```json +{ + "totalResults": 0, + "startIndex": 0, + "itemsPerPage": 0, + "Resources": [ + { + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:User" + ], + "userName": "string", + "name": { + "givenName": "string", + "familyName": "string" + }, + "active": true, + "password": "string", + "emails": [ + { + "value": "string", + "primary": true, + "type": "string" + } + ], + "externalId": "string", + "groups": [ + { + "value": "string", + "display": "string" + } + ], + "meta": { + "resourceType": "User", + "created": "2019-08-24T14:15:22Z", + "lastModified": "2019-08-24T14:15:22Z" + }, + "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08" + } + ] +} +``` + +
+ +## Attribute Mapping (Required) + +Since ToolJet requires a default user role (**admin**, **builder**, or **end-user**), we must inform the IdP (e.g., Okta) to include this information during user provisioning. + +### Steps for Okta + +1. Go to Directory โ†’ Profile Editor. +2. Select your ToolJet SCIM app. +3. Click Add Attribute. +4. In the form: + - Display Name: Can be anything (e.g., ToolJet Role) + - External Name: role (Must be role only) + +**External Namespace:** + +```js +urn:ietf:params:scim:schemas:extension:tooljet:User:2.0 +``` +:::warning IMPORTANT +This namespace **must match exactly**, do not modify or use a different string. +::: + +Attribute Mapping for Okta + +Once this is done, Okta will send the userโ€™s role attribute to ToolJet during provisioning or updates. + +## SCIM Standards Support + +ToolJet fully supports all standard SCIM endpoints, including: +- `/Schemas` +- `/ResourceTypes` +- `/ServiceProviderConfig` + +This ensures complete compatibility with standard-compliant IdPs such as Okta, Azure AD, and others. + +## Supported SCIM APIs +For a complete list of ToolJet SCIM API endpoints and specifications, refer to [SCIM References](/api/scim). + diff --git a/docs/versioned_docs/version-3.16.0-LTS/versions.md b/docs/versioned_docs/version-3.16.0-LTS/versions.md index 6cf7a42367..843d871376 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/versions.md +++ b/docs/versioned_docs/version-3.16.0-LTS/versions.md @@ -6,48 +6,48 @@ title: ToolJet Documentation Versions ## Current LTS Versions (Stable) | Version | Documentation | -|------------|------------------------------------------------------------| -| 3.16.0-LTS | [Documentation](https://docs.tooljet.ai/docs/) | -| 3.5.0-LTS | [Documentation](https://docs.tooljet.ai/docs/3.5.0-LTS/) | -| 3.0.0-LTS | [Documentation](https://docs.tooljet.ai/docs/3.0.0-LTS/) | -| 2.50.0-LTS | [Documentation](https://docs.tooljet.ai/docs/2.50.0-LTS/) | +| ---------- | ---------------------------------------------------------- | +| 3.16.0-LTS | [Documentation](https://docs.tooljet.com/docs/) | +| 3.5.0-LTS | [Documentation](https://docs.tooljet.com/docs/3.5.0-LTS/) | +| 3.0.0-LTS | [Documentation](https://docs.tooljet.com/docs/3.0.0-LTS/) | +| 2.50.0-LTS | [Documentation](https://docs.tooljet.com/docs/2.50.0-LTS/) | - ## Past Versions (Not Maintained Anymore) -| Version | Documentation | -|-------------|----------------------------------------------------------------| -| 2.65.0 | [Documentation](https://archived-docs.tooljet.com/docs/) | -| 2.62.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.62.0) | -| 2.61.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.61.0) | -| 2.43.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.43.0) | -| 2.39.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.39.0) | -| 2.36.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.36.0) | -| 2.35.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.35.0) | -| 2.34.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.34.0) | -| 2.33.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.33.0) | -| 2.30.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.30.0) | -| 2.29.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.29.0) | -| 2.27.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.27.0) | -| 2.25.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.25.0) | -| 2.24.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.24.0) | -| 2.23.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.23.0) | -| 2.22.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.22.0) | -| 2.19.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.19.0) | -| 2.18.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.18.0) | -| 2.17.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.17.0) | -| 2.16.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.16.0) | -| 2.15.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.15.0) | -| 2.14.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.14.0) | -| 2.13.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.13.0) | -| 2.12.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.12.0) | -| 2.11.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.11.0) | -| 2.10.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.10.0) | -| 1.x.x | [Documentation](https://archived-docs.tooljet.com/docs/1.x.x) | +| Version | Documentation | +| ------- | -------------------------------------------------------------- | +| 2.65.0 | [Documentation](https://archived-docs.tooljet.com/docs/) | +| 2.62.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.62.0) | +| 2.61.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.61.0) | +| 2.43.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.43.0) | +| 2.39.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.39.0) | +| 2.36.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.36.0) | +| 2.35.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.35.0) | +| 2.34.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.34.0) | +| 2.33.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.33.0) | +| 2.30.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.30.0) | +| 2.29.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.29.0) | +| 2.27.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.27.0) | +| 2.25.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.25.0) | +| 2.24.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.24.0) | +| 2.23.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.23.0) | +| 2.22.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.22.0) | +| 2.19.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.19.0) | +| 2.18.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.18.0) | +| 2.17.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.17.0) | +| 2.16.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.16.0) | +| 2.15.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.15.0) | +| 2.14.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.14.0) | +| 2.13.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.13.0) | +| 2.12.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.12.0) | +| 2.11.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.11.0) | +| 2.10.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.10.0) | +| 1.x.x | [Documentation](https://archived-docs.tooljet.com/docs/1.x.x) | diff --git a/docs/versioned_docs/version-3.16.0-LTS/widgets/file-picker.md b/docs/versioned_docs/version-3.16.0-LTS/widgets/file-picker.md index 367a433bd3..6270872d46 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/widgets/file-picker.md +++ b/docs/versioned_docs/version-3.16.0-LTS/widgets/file-picker.md @@ -17,14 +17,15 @@ To accept any/all file type(s), set `Accept file types` to an empty value. ## Properties -|
Property
|
Description
|
Expected Value
| -| :--------------------------------------------- | :--------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | -| Label | Text to display as the label for the field. | String | -| Placeholder | A hint displayed to guide the user. | String | -| Use drop zone | Creates a drag & drop zone. Files can be dragged and dropped to the "drag & drop" zone. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | -| Use file picker | On clicking it invokes the default OS file prompt. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | -| Allow picking multiple files | Allows drag and drop (or selection from the file dialog) of multiple files. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | -| Enable parsing | Enable parsing to automatically convert uploaded CSV or JSON files into usable data within your app. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +|
Property
|
Description
|
Expected Value
| +| :--------------------------------------------- | :------------------------------------------------ | :--------------------------------------------------- | +| Label | Text to display as the label for the field. | String | +| Placeholder | A hint displayed to guide the user. | String | +| Use drop zone | Creates a drag & drop zone. Files can be dragged and dropped to the "drag & drop" zone. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Use file picker | On clicking it invokes the default OS file prompt. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Allow picking multiple files | Allows drag and drop (or selection from the file dialog) of multiple files. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Enable parsing | Enable parsing to automatically convert uploaded files into usable data within your app. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| File Type | When parsing is enabled, you can choose the file type from the dropdown - Autodetect Extension, CSV, TSV, XLS, or XLSX. When CSV is selected, you can also choose the delimiter used to separate the values. | Choose from the dropdown. | ## Events @@ -66,30 +67,30 @@ The following actions of the component can be controlled using the component-spe ## Validation -|
Validation Option
|
Description
|
Expected Value
| -| :------------------------------------------------------ | :------------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------------------------------------------------- | -| Make this field mandatory | Displays a 'This field is mandatory. Please select a file.' message if no file is selected. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | -| File type | Select the acceptable file type. | Choose from dropdown or dynamically configure the value by clicking on **fx** and entering a logical expression. | -| Min size limit | Sets the minimum file size that can be uploaded. | File size in Bytes. | -| Max size limit | Sets the maximum file size that can be uploaded. | File size in Bytes. | -| Min file count | Sets the minimum number of files that needs to be uploaded. | Numeric | -| Max file count | Sets the maximum number of files that can be uploaded. | Numeric | +|
Validation Option
|
Description
|
Expected Value
| +| :------------------------------------------------------ | :------------------------------------------------ | :--------------------------------------------------- | +| Make this field mandatory | Displays a 'This field is mandatory. Please select a file.' message if no file is selected. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| File type | Select the acceptable file type. | Choose from dropdown or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Min size limit | Sets the minimum file size that can be uploaded. | File size in Bytes. | +| Max size limit | Sets the maximum file size that can be uploaded. | File size in Bytes. | +| Min file count | Sets the minimum number of files that needs to be uploaded. | Numeric | +| Max file count | Sets the maximum number of files that can be uploaded. | Numeric | ## Additional Actions -|
Action
|
Description
|
Configuration Options
| -| :------------------------------------------- | :------------------------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------------------------------------------------- | -| Loading state | Enables a loading spinner, often used with `isLoading` to indicate progress. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | -| Visibility | Controls component visibility. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | -| Disable | Enables or disables the component. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | -| Tooltip | Provides additional information on hover. Set a string value for display. | String | +|
Action
|
Description
|
Configuration Options
| +| :------------------------------------------- | :------------------------------------------------ | :---------------------------------------------------------- | +| Loading state | Enables a loading spinner, often used with `isLoading` to indicate progress. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Visibility | Controls component visibility. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Disable | Enables or disables the component. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Tooltip | Provides additional information on hover. Set a string value for display. | String | ## Devices -|
Property
|
Description
|
Expected Value
| -| :--------------------------------------------- | :------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | -| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +|
Property
|
Description
|
Expected Value
| +| :--------------------------------------------- | :------------------------------------------------ | :--------------------------------------------------- | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | ## Styles @@ -97,19 +98,19 @@ The following actions of the component can be controlled using the component-spe |
Property
|
Description
|
Configuration Options
| | :--------------------------------------------- | :------------------------------------------------ | :---------------------------------------------------------- | -| Title | Sets the title text color. | Select a theme or choose from color picker. | -| Active color | Sets the active state color. | Select a theme or choose from color picker. | -| Error color | Sets the color for error text. | Select a theme or choose from color picker. | +| Title | Sets the title text color. | Select a theme or choose from color picker. | +| Active color | Sets the active state color. | Select a theme or choose from color picker. | +| Error color | Sets the color for error text. | Select a theme or choose from color picker. | ### Container -|
Property
|
Description
|
Configuration Options
| -| :--------------------------------------------- | :------------------------------------------------ | :----------------------------------------------------------------------------------------------------- | -| Background | Sets the component background color. | Select a theme or choose from color picker. | -| Border | Sets the border color of the component. | Select a theme or choose from color picker. | -| Border radius | Modifies the border radius of the component. | Enter a number or click on **fx** and enter a code that programmatically returns a numeric value. | -| Box shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust the related properties or programmatically set it using **fx**. | -| Padding | Allows you to maintain a standard padding. | Numeric Value. | +|
Property
|
Description
|
Configuration Options
| +| :--------------------------------------------- | :------------------------------------------------ | :---------------------------------------------------------- | +| Background | Sets the component background color. | Select a theme or choose from color picker. | +| Border | Sets the border color of the component. | Select a theme or choose from color picker. | +| Border radius | Modifies the border radius of the component. | Enter a number or click on **fx** and enter a code that programmatically returns a numeric value. | +| Box shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust the related properties or programmatically set it using **fx**. | +| Padding | Allows you to maintain a standard padding. | Numeric Value. | :::info Any property having **fx** button next to its field can be **programmatically configured**. diff --git a/docs/versioned_docs/version-3.16.0-LTS/widgets/form/form.md b/docs/versioned_docs/version-3.16.0-LTS/widgets/form/form.md index e645a0b6b8..58b4c917a4 100644 --- a/docs/versioned_docs/version-3.16.0-LTS/widgets/form/form.md +++ b/docs/versioned_docs/version-3.16.0-LTS/widgets/form/form.md @@ -6,7 +6,7 @@ title: Generate Form The **Form** component in ToolJet allows you to group multiple input fields together and manage them as a single unit. It simplifies data collection, validation, and submission workflows by bundling all form-related components and logic in one place. :::caution Restricted components -Components like **Kanban**, **Calendar**, **Modal**, **Container**, **ListView**, **Tabs**, **Table**, and **Form** can't be dropped inside the **Form** component. +Components like **Kanban**, **Calendar**, **Container**, **ListView**, **Tabs**, and **Form** can't be dropped inside the **Form** component. ::: This guide covers the different ways to generate a form in ToolJet. For detailed information on properties, CSAs, and schema customization, refer to the following guides: diff --git a/docs/versioned_docs/version-3.5.0-LTS/build-with-ai/tooljet-mcp.md b/docs/versioned_docs/version-3.5.0-LTS/build-with-ai/tooljet-mcp.md index 61992359d6..da77fb8aad 100644 --- a/docs/versioned_docs/version-3.5.0-LTS/build-with-ai/tooljet-mcp.md +++ b/docs/versioned_docs/version-3.5.0-LTS/build-with-ai/tooljet-mcp.md @@ -1,7 +1,6 @@ --- id: tooljet-mcp title: ToolJet MCP - ---
@@ -43,7 +42,7 @@ Before you begin, you'll need: ### Step 1: Get an Access Token -Get an access token from your ToolJet instance. You'll need this token to authenticate the MCP server. Refer to the [ToolJet API](https://docs.tooljet.ai/docs/tooljet-api#enabling-tooljet-api) documentation for more details on how to generate an API token. +Get an access token from your ToolJet instance. You'll need this token to authenticate the MCP server. Refer to the [ToolJet API](https://docs.tooljet.com/docs/tooljet-api#enabling-tooljet-api) documentation for more details on how to generate an API token. ### Step 2: Configure Your AI Tool @@ -60,10 +59,7 @@ Follow the instructions below to configure your preferred AI tool to connect wit "mcpServers": { "tooljet": { "command": "npx", - "args": [ - "-y", - "@tooljet/mcp", - ], + "args": ["-y", "@tooljet/mcp"], "env": { "TOOLJET_ACCESS_TOKEN": "", "TOOLJET_HOST": "https://your-tooljet-instance.com" @@ -89,10 +85,7 @@ Replace `` with your ToolJet access token and update the host "mcpServers": { "tooljet": { "command": "npx", - "args": [ - "-y", - "@tooljet/mcp", - ], + "args": ["-y", "@tooljet/mcp"], "env": { "TOOLJET_ACCESS_TOKEN": "", "TOOLJET_HOST": "https://your-tooljet-instance.com" @@ -158,10 +151,7 @@ For more info on using MCP in VS Code, see the [Copilot documentation](https://c "mcpServers": { "tooljet": { "command": "npx", - "args": [ - "-y", - "@tooljet/mcp", - ], + "args": ["-y", "@tooljet/mcp"], "env": { "TOOLJET_ACCESS_TOKEN": "", "TOOLJET_HOST": "https://your-tooljet-instance.com" @@ -187,10 +177,7 @@ Replace `` with your ToolJet access token and update the host "mcpServers": { "tooljet": { "command": "npx", - "args": [ - "-y", - "@tooljet/mcp", - ], + "args": ["-y", "@tooljet/mcp"], "env": { "TOOLJET_ACCESS_TOKEN": "", "TOOLJET_HOST": "https://your-tooljet-instance.com" @@ -215,10 +202,7 @@ Replace `` with your ToolJet access token and update the host "mcpServers": { "tooljet": { "command": "npx", - "args": [ - "-y", - "@tooljet/mcp", - ], + "args": ["-y", "@tooljet/mcp"], "env": { "TOOLJET_ACCESS_TOKEN": "", "TOOLJET_HOST": "https://your-tooljet-instance.com" @@ -244,12 +228,7 @@ If you're using Windows, prefix the command with `cmd /c`: "mcpServers": { "tooljet": { "command": "cmd", - "args": [ - "/c", - "npx", - "-y", - "@tooljet/mcp", - ], + "args": ["/c", "npx", "-y", "@tooljet/mcp"], "env": { "TOOLJET_ACCESS_TOKEN": "", "TOOLJET_HOST": "https://your-tooljet-instance.com" @@ -265,24 +244,24 @@ ToolJet MCP provides several tools that AI assistants can use to interact with y ### User Management -| Tool | Description | -| --- | --- | -| `get-all-users` | Retrieve a list of all users in your ToolJet instance | -| `get-user` | Get detailed information about a specific user | -| `create-user` | Create a new user in a specified workspace | -| `update-user` | Update a user's profile information | -| `update-user-role` | Change a user's role within a workspace | +| Tool | Description | +| ------------------ | ----------------------------------------------------- | +| `get-all-users` | Retrieve a list of all users in your ToolJet instance | +| `get-user` | Get detailed information about a specific user | +| `create-user` | Create a new user in a specified workspace | +| `update-user` | Update a user's profile information | +| `update-user-role` | Change a user's role within a workspace | ### Workspace Management -| Tool | Description | -| --- | --- | +| Tool | Description | +| -------------------- | -------------------------------------------- | | `get-all-workspaces` | List all workspaces in your ToolJet instance | ### Application Management -| Tool | Description | -| --- | --- | +| Tool | Description | +| -------------- | ------------------------------------------------- | | `get-all-apps` | List all applications within a specific workspace | ## Example Usage @@ -294,8 +273,4 @@ Once connected, your AI assistant can perform tasks like: - "List all the apps in the Development workspace" - "Update the role of user@example.com to Admin in the Sales workspace" - For a full list of tools available, see the [GitHub README](https://github.com/ToolJet/tooljet-mcp). If you experience any issues, [submit a bug report](https://github.com/ToolJet/tooljet-mcp/issues/new). - - - diff --git a/docs/versioned_docs/version-3.5.0-LTS/contributing-guide/setup/codespaces.md b/docs/versioned_docs/version-3.5.0-LTS/contributing-guide/setup/codespaces.md index c64aacb24a..c877dfa1b2 100644 --- a/docs/versioned_docs/version-3.5.0-LTS/contributing-guide/setup/codespaces.md +++ b/docs/versioned_docs/version-3.5.0-LTS/contributing-guide/setup/codespaces.md @@ -3,13 +3,13 @@ id: codespaces title: GitHub Codespaces --- -Follow the steps below to set up ToolJet on GitHub Codespaces. We recommend reading our guide on [architecture](https://docs.tooljet.ai/docs/contributing-guide/setup/architecture) of ToolJet before proceeding. +Follow the steps below to set up ToolJet on GitHub Codespaces. We recommend reading our guide on [architecture](https://docs.tooljet.com/docs/contributing-guide/setup/architecture) of ToolJet before proceeding. Open the terminal and run the commands below. ## Setting up -### 1. Set up the environment +### 1. Set up the environment 1. Install Node.js ( version: v18.18.2 ) and npm (version: v9.8.1) @@ -31,7 +31,7 @@ sudo apt-get update sudo apt-get install postgresql-13 postgresql-contrib-13 ``` -To start the postgresql service run the below command: +To start the postgresql service run the below command: ``` sudo service postgresql start @@ -44,14 +44,14 @@ sudo su sudo -u postgres psql -\password postgres +\password postgres \q ``` ### 2. Set up environment variables -Create a `.env` file by running the command `touch .env`. More information on the variables that can be set is given in the [environment variables reference](https://docs.tooljet.ai/docs/setup/env-vars) +Create a `.env` file by running the command `touch .env`. More information on the variables that can be set is given in the [environment variables reference](https://docs.tooljet.com/docs/setup/env-vars) **For basic set-up you add the below env variables:** @@ -81,7 +81,7 @@ SERVE_CLIENT=true > > `LOCKBOX_MASTER_KEY` requires a 32 byte key. (Run `openssl rand -hex 32` to create a 32 byte secure random key) -### 3. Install and build dependencies +### 3. Install and build dependencies Make sure node version is set to 18.18.2 before running the below command: @@ -92,7 +92,6 @@ npm install --prefix frontend npm run build:plugins ``` - ### 4. Set up database ``` diff --git a/docs/versioned_docs/version-3.5.0-LTS/data-sources/custom-js.md b/docs/versioned_docs/version-3.5.0-LTS/data-sources/custom-js.md index 07cd2824fc..08117fa636 100644 --- a/docs/versioned_docs/version-3.5.0-LTS/data-sources/custom-js.md +++ b/docs/versioned_docs/version-3.5.0-LTS/data-sources/custom-js.md @@ -2,6 +2,7 @@ id: run-js title: Run JavaScript Code --- + The **Run JavaScript Code** feature in ToolJet allows custom JavaScript code to be executed to enhance application interactivity. This feature is useful for performing calculations, generating values, or interacting with queries and components.
@@ -24,6 +25,7 @@ The **Run JavaScript Code** feature in ToolJet allows custom JavaScript code to Parameters allow for dynamic control over the JavaScript code execution without altering the core script. This provides flexibility by allowing the same code to execute with different inputs. Each parameter requires: + - **Name**: Name for the parameter - **Default value**: The value can be constant strings, numbers and object. @@ -43,9 +45,10 @@ Once added, the **parameter can be referenced in the code using the syntax**: `p ### Displaying a Parameter Value in an Alert Box -Let's create a new parameter named *newAlert* and set the value as object `Displaying the Parameter Value in an Alert Box` and use the alert js method to show the value on the pop-up. +Let's create a new parameter named _newAlert_ and set the value as object `Displaying the Parameter Value in an Alert Box` and use the alert js method to show the value on the pop-up. Syntax: + ``` alert(parameters.newAlert) ``` @@ -58,31 +61,34 @@ When the query is triggered the alert will show the parameters value. Parameters can also be used to trigger other queries and pass custom values. Below is an example of how to call one query from another by providing custom parameters. -1. Begin by creating a new RunJS query named *multiply*. - - In this query, add the following parameters: +1. Begin by creating a new RunJS query named _multiply_. - - *num1* with a default value of **10** - - *num2* with a default value of **2**. - - Add the following JavaScript Code: + - In this query, add the following parameters: - ```javascript - return parameters.num1 * parameters.num2; - ``` - - To display the result, place a text component on the canvas and set its text to `{{queries.multiply.data}}`. -
- Run JavaScript code + - _num1_ with a default value of **10** + - _num2_ with a default value of **2**. -2. Now, let's create another RunJS query called *callMultiply*, where we will invoke the *multiply* query created earlier using custom parameter values. Here's the code snippet for *callMultiply*: - - ```js - queries.multiply.run({num1: 20, num2: 7}) - ``` - - By executing this code within *callMultiply*, we trigger the *multiply* query with specific values for its parameters. - - Run JavaScript code + - Add the following JavaScript Code: -With this setup, the *multiply* query can be called from other queries, such as *callMultiply*, by providing custom parameter values. This allows you to reuse the *multiply* query with different inputs and display the results accordingly. + ```javascript + return parameters.num1 * parameters.num2; + ``` + + - To display the result, place a text component on the canvas and set its text to `{{queries.multiply.data}}`. +
+ Run JavaScript code + +2. Now, let's create another RunJS query called _callMultiply_, where we will invoke the _multiply_ query created earlier using custom parameter values. Here's the code snippet for _callMultiply_: + + ```js + queries.multiply.run({ num1: 20, num2: 7 }); + ``` + + By executing this code within _callMultiply_, we trigger the _multiply_ query with specific values for its parameters. + + Run JavaScript code + +With this setup, the _multiply_ query can be called from other queries, such as _callMultiply_, by providing custom parameter values. This allows you to reuse the _multiply_ query with different inputs and display the results accordingly.
@@ -104,12 +110,12 @@ return a; ``` 4. Edit the properties of widgets: - 1. Add an event handler to the button: - 1. Select event as **On Click** - 2. Action as **Run Query** - 3. Select the *runjs1* query that we created. This will run the JavaScript code every time the button is clicked. - 2. Edit the property of text widget: - 1. In the text field enter **Random number:** `{{queries.runjs1.data}}`. It will display the output as Random number: *result from JS code* + 1. Add an event handler to the button: + 1. Select event as **On Click** + 2. Action as **Run Query** + 3. Select the _runjs1_ query that we created. This will run the JavaScript code every time the button is clicked. + 2. Edit the property of text widget: + 1. In the text field enter **Random number:** `{{queries.runjs1.data}}`. It will display the output as Random number: _result from JS code_ Run JavaScript code @@ -121,6 +127,7 @@ The following code generates a unique ID in the format "id" followed by a sequen var id = "id" + Math.random().toString(16).slice(2); return id; ``` + For example, it could be something like "id2f4a1b". Run JavaScript code @@ -130,7 +137,10 @@ For example, it could be something like "id2f4a1b". In this code, the resulting ID will have the format "timestamp + randomHex", where "timestamp" is the current time in base-32 and "randomHex" is a random hexadecimal value. ```js -return String(Date.now().toString(32) + Math.random().toString(16)).replace(/\./g, ''); +return String(Date.now().toString(32) + Math.random().toString(16)).replace( + /\./g, + "" +); ``` This ID will be longer than the one generated earlier, and it could look like "2g3h1d6a4h3". @@ -138,11 +148,12 @@ This ID will be longer than the one generated earlier, and it could look like "2 Run JavaScript code :::tip Resources -- You can also write custom JavaScript code to get the data from **External APIs** and manipulate the response for graphical representation. Here's the [tutorial](https://blog.tooljet.ai/build-github-stars-history-app-in-5-minutes-using-low-code/) on how we used custom JavaScript code to build an app using GitHub API. + +- You can also write custom JavaScript code to get the data from **External APIs** and manipulate the response for graphical representation. Here's the [tutorial](https://blog.tooljet.com/build-github-stars-history-app-in-5-minutes-using-low-code/) on how we used custom JavaScript code to build an app using GitHub API. - [Import external libraries](/docs/how-to/import-external-libraries-using-runjs) using RunJS. - [Intentionally Fail](/docs/how-to/intentionally-fail-js-query) a RunJS query. - [Trigger query at specified intervals](/docs/how-to/run-query-at-specified-intervals) using RunJS. -::: + :::
@@ -152,11 +163,11 @@ This ID will be longer than the one generated earlier, and it could look like "2 ToolJet allows you to internally utilize these libraries: -| Name | Documentation | -| ----------- | ----------- | -| Moment | [https://momentjs.com/docs/](https://momentjs.com/docs/) | -| Lodash | [https://lodash.com/docs/](https://lodash.com/docs/) | -| Axios | [https://axios-http.com/docs/intro](https://axios-http.com/docs/intro) | +| Name | Documentation | +| ------ | ---------------------------------------------------------------------- | +| Moment | [https://momentjs.com/docs/](https://momentjs.com/docs/) | +| Lodash | [https://lodash.com/docs/](https://lodash.com/docs/) | +| Axios | [https://axios-http.com/docs/intro](https://axios-http.com/docs/intro) | :::info Issues with writing custom JavaScript code? Ask in our [Slack Community](https://tooljet.com/slack). diff --git a/docs/versioned_docs/version-3.5.0-LTS/data-sources/restapi/authentication.md b/docs/versioned_docs/version-3.5.0-LTS/data-sources/restapi/authentication.md index 987521a16f..b814508006 100644 --- a/docs/versioned_docs/version-3.5.0-LTS/data-sources/restapi/authentication.md +++ b/docs/versioned_docs/version-3.5.0-LTS/data-sources/restapi/authentication.md @@ -14,7 +14,7 @@ ToolJetโ€™s REST API data source supports Basic Authentication as the authentica 1. Go to the **Data Sources** page from the ToolJet dashboard, select **API** category on sidebar and choose the **REST API** data source. 2. In the **Base URL** field, enter the base URL. The base URL specifies the network address of the API service. For example, `http://localhost:3001/api/basic-auth` 3. Enter the **Headers** if required. Headers are key-value pairs to include as headers with REST API requests. -4. Select **Authentication** type as *Basic* from the dropdown. +4. Select **Authentication** type as _Basic_ from the dropdown. 5. Enter the **Username** and **Password** in the respective fields. The username and password are the credentials required to authenticate the user. ToolJet - Data source - REST API @@ -28,19 +28,20 @@ ToolJetโ€™s REST API data source supports Bearer Token as the authentication typ 1. Go to the **Data Sources** page from the ToolJet dashboard, select **API** category on sidebar and choose the **REST API** data source. 2. In the **Base URL** field, enter the base URL. The base URL specifies the network address of the API service. For example, `http://localhost:3001/api/bearer-auth` 3. Enter the **Headers** if required. Headers are key-value pairs to include as headers with REST API requests. -4. Select **Authentication** type as *Bearer* from the dropdown. +4. Select **Authentication** type as _Bearer_ from the dropdown. 5. Enter the **Token** in the field. The token is a security token that is issued by the authentication server to the client. The client then uses the token to access the protected resources hosted by the resource server. - + ToolJet - Data source - REST API -6. Now you have option to select the **SSL Certificate** if required. SSL certificate is used to verify the server certificate. By default, it is set to *None*. You can provide the **CA Certificate** or **Client Certificate** from the dropdown. - 1. **CA Certificate**: Requires a CA certificate to verify the server certificate. Copy the content of `server.crt` file and paste it in the **CA Cert** field. `server.crt` file is the certificate file that is used to verify the server certificate. - - ToolJet - Data source - REST API +6. Now you have option to select the **SSL Certificate** if required. SSL certificate is used to verify the server certificate. By default, it is set to _None_. You can provide the **CA Certificate** or **Client Certificate** from the dropdown. - 2. **Client Certificate**: Requires a client certificate to authenticate with the server. **client.key**, **client.crt**, and **server.crt** files are the certificate files that are used to authenticate with the server. Copy the content of **client.key** file and paste it in the **Client Key** field. Copy the content of **client.crt** file and paste it in the **Client Cert** field. Copy the content of **server.crt** file and paste it in the **CA Cert** field. - - ToolJet - Data source - REST API + 1. **CA Certificate**: Requires a CA certificate to verify the server certificate. Copy the content of `server.crt` file and paste it in the **CA Cert** field. `server.crt` file is the certificate file that is used to verify the server certificate. + + ToolJet - Data source - REST API + + 2. **Client Certificate**: Requires a client certificate to authenticate with the server. **client.key**, **client.crt**, and **server.crt** files are the certificate files that are used to authenticate with the server. Copy the content of **client.key** file and paste it in the **Client Key** field. Copy the content of **client.crt** file and paste it in the **Client Cert** field. Copy the content of **server.crt** file and paste it in the **CA Cert** field. + + ToolJet - Data source - REST API 7. Once you have configured the REST API data source, click on the **Save** button. @@ -71,11 +72,11 @@ Google Cloud Platform provides access to more than 350 APIs and Services that ca 1. Sign in to your [Google Cloud](https://cloud.google.com/) account, and from the console create a New Project. 2. Navigate to the **APIs and Services**, and then open the **OAuth consent screen** section from the left sidebar. -3. Enter the Application details and select the appropriate scopes for your application. We will select the profile and the email scopes. +3. Enter the Application details and select the appropriate scopes for your application. We will select the profile and the email scopes. 4. Once you have created the OAuth consent screen, Create new credentials for the **OAuth client ID** from the **Credentials** section in the left sidebar. 5. Select the application type, enter the application name, and then add the following URIs under Authorized Redirect URIs(Callback URL): - 1. `https://app.tooljet.ai/oauth2/authorize` (if youโ€™re using ToolJet cloud) - 2. `http://localhost:8082/oauth2/authorize` (if youโ€™re using ToolJet locally) + 1. `https://app.tooljet.com/oauth2/authorize` (if youโ€™re using ToolJet cloud) + 2. `http://localhost:8082/oauth2/authorize` (if youโ€™re using ToolJet locally) ToolJet - How To - REST API CallBack URL in OAuth 2.0 @@ -91,16 +92,16 @@ Let's follow the steps to authorize ToolJet to access your Google profile data: 1. Go to the **Data Sources** page from the ToolJet dashboard, select API category on sidebar and choose the **REST API** data source. 2. In the **Base URL** field, enter the base URL `https://www.googleapis.com/oauth2/v1/userinfo`; the base URL specifies the network address of the API service. -3. Select **Authentication** type as *OAuth 2.0* -4. Keep the default values for **Grant Type**, **Add Access Token To**, and **Header Prefix** i.e. *Authorization Code*, *Request Header*, and *Bearer* respectively. +3. Select **Authentication** type as _OAuth 2.0_ +4. Keep the default values for **Grant Type**, **Add Access Token To**, and **Header Prefix** i.e. _Authorization Code_, _Request Header_, and _Bearer_ respectively. 5. Enter **Access Token URL**: `https://oauth2.googleapis.com/token`; this token allows users to verify their identity, and in return, receive a unique access token. 6. Enter the **Client ID** and **Client Secret** that we generated from the [Google Console](http://console.developers.google.com/). 7. In the **Scope** field, enter `https://www.googleapis.com/auth/userinfo.profile`; Scope is a mechanism in OAuth 2.0 to limit an application's access to a user's account. Check the scopes available for [Google OAuth2 API here](https://developers.google.com/identity/protocols/oauth2/scopes#oauth2). 8. Enter **Authorization URL:** `https://accounts.google.com/o/oauth2/v2/auth`; the Authorization URL requests authorization from the user and redirects to retrieve an authorization code from identity server. 9. Create three **Custom Authentication Parameters:** - 1. **response_type**: code ( `code` refers to the Authorization Code) - 2. **client_id**: Client ID - 3. **redirect_url**: `http://localhost:8082/oauth2/authorize` if using ToolJet locally or enter this `https://app.tooljet.ai/oauth2/authorize` if using ToolJet Cloud. + 1. **response_type**: code ( `code` refers to the Authorization Code) + 2. **client_id**: Client ID + 3. **redirect_url**: `http://localhost:8082/oauth2/authorize` if using ToolJet locally or enter this `https://app.tooljet.com/oauth2/authorize` if using ToolJet Cloud. 10. Keep the default selection for **Client Authentication** and **Save** the data source. ToolJet - How To - REST API authentication using OAuth 2.0 @@ -111,8 +112,8 @@ Let's follow the steps to authorize ToolJet to access your Google profile data: 1. Go to the **Data Sources** page from the ToolJet dashboard, select API category on sidebar and choose the **REST API** data source. 2. In the **Base URL** field, enter the base URL `https://www.googleapis.com/oauth2/v1/userinfo`; the base URL specifies the network address of the API service. -3. Select **Authentication** type as *OAuth 2.0* -4. Select the **Grant Type** as *Client credentials*. +3. Select **Authentication** type as _OAuth 2.0_ +4. Select the **Grant Type** as _Client credentials_. 5. Enter **Access Token URL**: `https://oauth2.googleapis.com/token`; this token allows users to verify their identity, and in return, receive a unique access token. 6. Enter the **Client ID** and **Client Secret** that we generated from the [Google Console](http://console.developers.google.com/). 7. In the **Scope** field, enter `https://www.googleapis.com/auth/userinfo.profile`; Scope is a mechanism in OAuth 2.0 to limit an application's access to a user's account. Check the scopes available for [Google OAuth2 API here](https://developers.google.com/identity/protocols/oauth2/scopes#oauth2). @@ -125,6 +126,6 @@ Let's follow the steps to authorize ToolJet to access your Google profile data: Letโ€™s create a query to make a `GET` request to the URL, it will pop a new window and ask the user to authenticate against the API. - Add a new query and select the REST API data source from the dropdown -- In the **Method** dropdown select `GET` and enable the `Run query on application load?` -- Run the query. -- A new window will pop for authentication and once auth is successful, you can run the query again to get the user data like Name and Profile Picture. \ No newline at end of file +- In the **Method** dropdown select `GET` and enable the `Run query on application load?` +- Run the query. +- A new window will pop for authentication and once auth is successful, you can run the query again to get the user data like Name and Profile Picture. diff --git a/docs/versioned_docs/version-3.5.0-LTS/data-sources/s3.md b/docs/versioned_docs/version-3.5.0-LTS/data-sources/s3.md index 6517794bf4..1764864c43 100644 --- a/docs/versioned_docs/version-3.5.0-LTS/data-sources/s3.md +++ b/docs/versioned_docs/version-3.5.0-LTS/data-sources/s3.md @@ -11,7 +11,7 @@ ToolJet can connect to **Amazon S3** buckets and perform various operations on t To establish a connection with the **Amazon S3** data source, you can either click on the **+ Add new Data source** button located on the query panel or navigate to the **[Data Sources](/docs/data-sources/overview/)** page from the ToolJet dashboard. -ToolJet supports connecting to AWS S3 using **IAM Access Keys**, **AWS Instance Credentials** or **AWS ARN Role**. +ToolJet supports connecting to AWS S3 using **IAM Access Keys**, **AWS Instance Credentials** or **AWS ARN Role**. If you are using **IAM Access Keys**, you will need to provide the following details: @@ -64,18 +64,19 @@ Query results can be transformed using transformations. Read our [transformation ## Supported Operations You can create query for AWS S3 data source to perform several actions such as: + - **[Create a new bucket](#create-a-new-bucket)** - **[Read object](#read-object)** - **[Upload object](#upload-object)** - **[Remove object](#remove-object)** - **[List buckets](#list-buckets)** - **[List objects in a bucket](#list-objects-in-a-bucket)** -- **[Signed URL for download](#signed-url-for-download)** -- **[Signed URL for upload](#signed-url-for-upload)** +- **[Signed URL for download](#signed-url-for-download)** +- **[Signed URL for upload](#signed-url-for-upload)** ### Create a New Bucket -You can create a new bucket in your S3 by using this operation. +You can create a new bucket in your S3 by using this operation. #### Required Parameters @@ -85,7 +86,7 @@ You can create a new bucket in your S3 by using this operation. ### Read Object -You can read an object in a bucket by using this operation. +You can read an object in a bucket by using this operation. #### Required Parameters @@ -96,7 +97,7 @@ You can read an object in a bucket by using this operation. ### Upload Object -You can use this operation to upload objects(files) to your S3 bucket. +You can use this operation to upload objects(files) to your S3 bucket. #### Required Parameters @@ -105,11 +106,11 @@ You can use this operation to upload objects(files) to your S3 bucket. - **Content Type** - **Upload data** -aws s3 upload +aws s3 upload ### Remove Object -You can use this operation to remove an object from your S3 bucket. +You can use this operation to remove an object from your S3 bucket. #### Required Parameters @@ -139,7 +140,6 @@ This operation will fetch the list of all the files in your bucket. It requires - **Offset** - **Next Continuation Token** - :::info **Next Continuation Token**
For listing a bucket for objects that begin with a specific character or a prefix, then use the **Offset** parameter. For example, if you want to list all the objects that begin with **a**, then set the **Offset** parameter to **a**. Similarly, if you want to list all the objects that begin with **ab**, then set the **Offset** parameter to **ab**.
@@ -151,7 +151,7 @@ The results will continue from where the last listing finished. ### Signed URL for Download -The object owner can optionally share objects with others by creating a presigned URL, using their own security credentials, to grant time-limited permission to download the objects. +The object owner can optionally share objects with others by creating a presigned URL, using their own security credentials, to grant time-limited permission to download the objects. #### Required Parameters @@ -163,7 +163,7 @@ The object owner can optionally share objects with others by creating a presigne ### Signed URL for Upload -The presigned URLs are useful if you want your user/customer to be able to upload a specific object to your bucket, but you don't require them to have AWS security credentials or permissions. +The presigned URLs are useful if you want your user/customer to be able to upload a specific object to your bucket, but you don't require them to have AWS security credentials or permissions. #### Required Parameters @@ -175,7 +175,7 @@ The presigned URLs are useful if you want your user/customer to be able to uploa aws s3 signed upload :::info -We built an app to view and upload files to AWS S3 buckets. Check out the complete tutorial **[here](https://blog.tooljet.ai/build-an-aws-s3-broswer-with-tooljet/)**. +We built an app to view and upload files to AWS S3 buckets. Check out the complete tutorial **[here](https://blog.tooljet.com/build-an-aws-s3-broswer-with-tooljet/)**. ::: -
\ No newline at end of file +
diff --git a/docs/versioned_docs/version-3.5.0-LTS/data-sources/stripe.md b/docs/versioned_docs/version-3.5.0-LTS/data-sources/stripe.md index 2352956053..678a0b51f9 100644 --- a/docs/versioned_docs/version-3.5.0-LTS/data-sources/stripe.md +++ b/docs/versioned_docs/version-3.5.0-LTS/data-sources/stripe.md @@ -6,7 +6,7 @@ title: Stripe ToolJet can connect to your Stripe account to read or write customers' and payments' data. :::info -Check out the **[Stripe Refund App tutorial](https://blog.tooljet.ai/build-a-stripe-refund-tool-using-low-code/)** +Check out the **[Stripe Refund App tutorial](https://blog.tooljet.com/build-a-stripe-refund-tool-using-low-code/)** :::
@@ -16,6 +16,7 @@ Check out the **[Stripe Refund App tutorial](https://blog.tooljet.ai/build-a-str To establish a connection with the Stripe data source, you can either click on the **+ Add new Data source** button located on the query panel or navigate to the **[Data Sources](/docs/data-sources/overview/)** page from the ToolJet dashboard and choose Stripe as the data source. ToolJet requires the following to connect to Stripe datasource. + - **Stripe API key** ToolJet - Data source - Stripe @@ -49,149 +50,149 @@ You can check out the some of the operations mentioned below. All the operations

Account Operations

-| **Method** | **Endpoint** | **Description** | -|------------|------------------------|-----------------------------------| -| DELETE | `/v1/account` | Delete an account | -| GET | `/v1/account` | Retrieve account details | -| POST | `/v1/account` | Create or update account | +| **Method** | **Endpoint** | **Description** | +| ---------- | ------------- | ------------------------ | +| DELETE | `/v1/account` | Delete an account | +| GET | `/v1/account` | Retrieve account details | +| POST | `/v1/account` | Create or update account |

Bank Accounts (Account)

-| **Method** | **Endpoint** | **Description** | -|------------|---------------------------------------|-----------------------------------| -| POST | `/v1/account/bank_accounts` | Add a bank account | -| DELETE | `/v1/account/bank_accounts/{id}` | Delete a bank account | -| GET | `/v1/account/bank_accounts/{id}` | Retrieve bank account details | -| POST | `/v1/account/bank_accounts/{id}` | Update bank account details | +| **Method** | **Endpoint** | **Description** | +| ---------- | -------------------------------- | ----------------------------- | +| POST | `/v1/account/bank_accounts` | Add a bank account | +| DELETE | `/v1/account/bank_accounts/{id}` | Delete a bank account | +| GET | `/v1/account/bank_accounts/{id}` | Retrieve bank account details | +| POST | `/v1/account/bank_accounts/{id}` | Update bank account details |

Capabilities (Account)

-| **Method** | **Endpoint** | **Description** | -|------------|------------------------------------------|-----------------------------------| -| GET | `/v1/account/capabilities` | Retrieve account capabilities | -| GET | `/v1/account/capabilities/{capability}` | Retrieve specific capability | -| POST | `/v1/account/capabilities/{capability}` | Update specific capability | +| **Method** | **Endpoint** | **Description** | +| ---------- | --------------------------------------- | ----------------------------- | +| GET | `/v1/account/capabilities` | Retrieve account capabilities | +| GET | `/v1/account/capabilities/{capability}` | Retrieve specific capability | +| POST | `/v1/account/capabilities/{capability}` | Update specific capability |

External Accounts (Account)

-| **Method** | **Endpoint** | **Description** | -|------------|---------------------------------------|-----------------------------------| -| GET | `/v1/account/external_accounts` | Retrieve external accounts | -| POST | `/v1/account/external_accounts` | Add an external account | -| DELETE | `/v1/account/external_accounts/{id}` | Delete an external account | -| GET | `/v1/account/external_accounts/{id}` | Retrieve external account details | -| POST | `/v1/account/external_accounts/{id}` | Update external account details | +| **Method** | **Endpoint** | **Description** | +| ---------- | ------------------------------------ | --------------------------------- | +| GET | `/v1/account/external_accounts` | Retrieve external accounts | +| POST | `/v1/account/external_accounts` | Add an external account | +| DELETE | `/v1/account/external_accounts/{id}` | Delete an external account | +| GET | `/v1/account/external_accounts/{id}` | Retrieve external account details | +| POST | `/v1/account/external_accounts/{id}` | Update external account details |

People (Account)

-| **Method** | **Endpoint** | **Description** | -|------------|---------------------------------------|-----------------------------------| -| GET | `/v1/account/people` | Retrieve people associated | -| POST | `/v1/account/people` | Add a person to account | -| DELETE | `/v1/account/people/{person}` | Delete a person | -| GET | `/v1/account/people/{person}` | Retrieve person details | -| POST | `/v1/account/people/{person}` | Update person details | +| **Method** | **Endpoint** | **Description** | +| ---------- | ----------------------------- | -------------------------- | +| GET | `/v1/account/people` | Retrieve people associated | +| POST | `/v1/account/people` | Add a person to account | +| DELETE | `/v1/account/people/{person}` | Delete a person | +| GET | `/v1/account/people/{person}` | Retrieve person details | +| POST | `/v1/account/people/{person}` | Update person details |

Persons (Account)

-| **Method** | **Endpoint** | **Description** | -|------------|---------------------------------------|-----------------------------------| -| POST | `/v1/account/persons` | Add a person | -| DELETE | `/v1/account/persons/{person}` | Delete a person | -| GET | `/v1/account/persons/{person}` | Retrieve person details | -| POST | `/v1/account/persons/{person}` | Update person details | +| **Method** | **Endpoint** | **Description** | +| ---------- | ------------------------------ | ----------------------- | +| POST | `/v1/account/persons` | Add a person | +| DELETE | `/v1/account/persons/{person}` | Delete a person | +| GET | `/v1/account/persons/{person}` | Retrieve person details | +| POST | `/v1/account/persons/{person}` | Update person details |

Other Account Operations

-| **Method** | **Endpoint** | **Description** | -|------------|-------------------------------|-----------------------------------| -| POST | `/v1/account/login_links` | Create login link for account | -| POST | `/v1/account_links` | Create account links | +| **Method** | **Endpoint** | **Description** | +| ---------- | ------------------------- | ----------------------------- | +| POST | `/v1/account/login_links` | Create login link for account | +| POST | `/v1/account_links` | Create account links |

Accounts (Specific) Operations

-| **Method** | **Endpoint** | **Description** | -|------------|---------------------------------------|-----------------------------------| -| GET | `/v1/accounts` | Retrieve list of accounts | -| POST | `/v1/accounts` | Create a new account | -| DELETE | `/v1/accounts/{account}` | Delete a specific account | -| GET | `/v1/accounts/{account}` | Retrieve specific account details | -| POST | `/v1/accounts/{account}` | Update specific account details | +| **Method** | **Endpoint** | **Description** | +| ---------- | ------------------------ | --------------------------------- | +| GET | `/v1/accounts` | Retrieve list of accounts | +| POST | `/v1/accounts` | Create a new account | +| DELETE | `/v1/accounts/{account}` | Delete a specific account | +| GET | `/v1/accounts/{account}` | Retrieve specific account details | +| POST | `/v1/accounts/{account}` | Update specific account details |

Bank Accounts (Specific)

-| **Method** | **Endpoint** | **Description** | -|------------|---------------------------------------|-----------------------------------| -| POST | `/v1/accounts/{account}/bank_accounts`| Add a bank account | -| DELETE | `/v1/accounts/{account}/bank_accounts/{id}`| Delete a bank account | -| GET | `/v1/accounts/{account}/bank_accounts/{id}`| Retrieve bank account details | +| **Method** | **Endpoint** | **Description** | +| ---------- | ------------------------------------------- | ----------------------------- | +| POST | `/v1/accounts/{account}/bank_accounts` | Add a bank account | +| DELETE | `/v1/accounts/{account}/bank_accounts/{id}` | Delete a bank account | +| GET | `/v1/accounts/{account}/bank_accounts/{id}` | Retrieve bank account details |

Capabilities (Specific)

-| **Method** | **Endpoint** | **Description** | -|------------|------------------------------------------|-----------------------------------| -| GET | `/v1/accounts/{account}/capabilities` | Retrieve account capabilities | -| GET | `/v1/accounts/{account}/capabilities/{capability}`| Retrieve specific capability details | -| POST | `/v1/accounts/{account}/capabilities/{capability}`| Update specific capability | +| **Method** | **Endpoint** | **Description** | +| ---------- | -------------------------------------------------- | ------------------------------------ | +| GET | `/v1/accounts/{account}/capabilities` | Retrieve account capabilities | +| GET | `/v1/accounts/{account}/capabilities/{capability}` | Retrieve specific capability details | +| POST | `/v1/accounts/{account}/capabilities/{capability}` | Update specific capability |

External Accounts (Specific)

-| **Method** | **Endpoint** | **Description** | -|------------|------------------------------------------|-----------------------------------| -| GET | `/v1/accounts/{account}/external_accounts`| Retrieve external accounts | -| POST | `/v1/accounts/{account}/external_accounts`| Add an external account | -| DELETE | `/v1/accounts/{account}/external_accounts/{id}`| Delete an external account | -| GET | `/v1/accounts/{account}/external_accounts/{id}`| Retrieve external account details| +| **Method** | **Endpoint** | **Description** | +| ---------- | ----------------------------------------------- | --------------------------------- | +| GET | `/v1/accounts/{account}/external_accounts` | Retrieve external accounts | +| POST | `/v1/accounts/{account}/external_accounts` | Add an external account | +| DELETE | `/v1/accounts/{account}/external_accounts/{id}` | Delete an external account | +| GET | `/v1/accounts/{account}/external_accounts/{id}` | Retrieve external account details |

People (Specific)

-| **Method** | **Endpoint** | **Description** | -|------------|------------------------------------------|-----------------------------------| -| GET | `/v1/accounts/{account}/people` | Retrieve people associated | -| POST | `/v1/accounts/{account}/people` | Add a person to account | -| DELETE | `/v1/accounts/{account}/people/{person}` | Delete a person | -| GET | `/v1/accounts/{account}/people/{person}` | Retrieve person details | -| POST | `/v1/accounts/{account}/people/{person}` | Update person details | +| **Method** | **Endpoint** | **Description** | +| ---------- | ---------------------------------------- | -------------------------- | +| GET | `/v1/accounts/{account}/people` | Retrieve people associated | +| POST | `/v1/accounts/{account}/people` | Add a person to account | +| DELETE | `/v1/accounts/{account}/people/{person}` | Delete a person | +| GET | `/v1/accounts/{account}/people/{person}` | Retrieve person details | +| POST | `/v1/accounts/{account}/people/{person}` | Update person details |

Persons (Specific)

-| **Method** | **Endpoint** | **Description** | -|------------|---------------------------------------|-----------------------------------| -| POST | `/v1/accounts/{account}/persons` | Add a person | -| DELETE | `/v1/accounts/{account}/persons/{person}`| Delete a person | -| GET | `/v1/accounts/{account}/persons/{person}`| Retrieve person details | -| POST | `/v1/accounts/{account}/persons/{person}`| Update person details | +| **Method** | **Endpoint** | **Description** | +| ---------- | ----------------------------------------- | ----------------------- | +| POST | `/v1/accounts/{account}/persons` | Add a person | +| DELETE | `/v1/accounts/{account}/persons/{person}` | Delete a person | +| GET | `/v1/accounts/{account}/persons/{person}` | Retrieve person details | +| POST | `/v1/accounts/{account}/persons/{person}` | Update person details |

Other Account-Specific Operations

-| **Method** | **Endpoint** | **Description** | -|------------|------------------------------------------|-----------------------------------| -| POST | `/v1/accounts/{account}/login_links` | Create login link for account | -| POST | `/v1/accounts/{account}/reject` | Reject an account | +| **Method** | **Endpoint** | **Description** | +| ---------- | ------------------------------------ | ----------------------------- | +| POST | `/v1/accounts/{account}/login_links` | Create login link for account | +| POST | `/v1/accounts/{account}/reject` | Reject an account |

Apple Pay Operations

-| **Method** | **Endpoint** | **Description** | -|------------|---------------------------------|-----------------------------------| -| GET | `/v1/apple_pay/domains` | Retrieve Apple Pay domains | -| POST | `/v1/apple_pay/domains` | Add a domain to Apple Pay | -| DELETE | `/v1/apple_pay/domains/{domain}`| Delete a domain from Apple Pay | -| GET | `/v1/apple_pay/domains/{domain}`| Retrieve specific Apple Pay domain| +| **Method** | **Endpoint** | **Description** | +| ---------- | -------------------------------- | ---------------------------------- | +| GET | `/v1/apple_pay/domains` | Retrieve Apple Pay domains | +| POST | `/v1/apple_pay/domains` | Add a domain to Apple Pay | +| DELETE | `/v1/apple_pay/domains/{domain}` | Delete a domain from Apple Pay | +| GET | `/v1/apple_pay/domains/{domain}` | Retrieve specific Apple Pay domain |

Application Fees Operations

-| **Method** | **Endpoint** | **Description** | -|------------|-------------------------------------------|-----------------------------------| -| GET | `/v1/application_fees` | Retrieve list of application fees | -| GET | `/v1/application_fees/{id}` | Retrieve specific application fee | -| POST | `/v1/application_fees/{id}/refund` | Refund an application fee | -| GET | `/v1/application_fees/{id}/refunds` | Retrieve list of refunds | -| POST | `/v1/application_fees/{id}/refunds` | Create a refund for an application| +| **Method** | **Endpoint** | **Description** | +| ---------- | ----------------------------------- | ---------------------------------- | +| GET | `/v1/application_fees` | Retrieve list of application fees | +| GET | `/v1/application_fees/{id}` | Retrieve specific application fee | +| POST | `/v1/application_fees/{id}/refund` | Refund an application fee | +| GET | `/v1/application_fees/{id}/refunds` | Retrieve list of refunds | +| POST | `/v1/application_fees/{id}/refunds` | Create a refund for an application |

Application Fee Refunds (Specific)

-| **Method** | **Endpoint** | **Description** | -|------------|---------------------------------------------|-----------------------------------| -| GET | `/v1/application_fees/{fee}/refunds/{id}` | Retrieve specific refund details +| **Method** | **Endpoint** | **Description** | +| ---------- | ----------------------------------------- | -------------------------------- | +| GET | `/v1/application_fees/{fee}/refunds/{id}` | Retrieve specific refund details |
diff --git a/docs/versioned_docs/version-3.5.0-LTS/getting-started/quickstart-guide.md b/docs/versioned_docs/version-3.5.0-LTS/getting-started/quickstart-guide.md index c420e7005b..4df28da2b3 100644 --- a/docs/versioned_docs/version-3.5.0-LTS/getting-started/quickstart-guide.md +++ b/docs/versioned_docs/version-3.5.0-LTS/getting-started/quickstart-guide.md @@ -3,11 +3,10 @@ id: quickstart-guide title: Quickstart Guide --- - This quickstart guide walks you through the process of creating an employee directory app using ToolJet. The application lets users track and update employee details while working with core features of the platform, all within a user-friendly interface. Here are the step-by-step instructions: -**[1. Create Your First Application](#1-create-your-first-application)**
-**[2. Create a Database Table](#2-create-a-database-table)**
+**[1. Create Your First Application](#1-create-your-first-application)**
+**[2. Create a Database Table](#2-create-a-database-table)**
**[3. Create a Query to Fetch Data](#3-create-a-query-to-fetch-data)**
**[4. Bind Queried Data to the UI](#4-bind-queried-data-to-the-ui)**
**[5. Create a Query to Add Data](#5-create-a-query-to-add-data)**
@@ -18,29 +17,30 @@ This quickstart guide walks you through the process of creating an employee dire ### 1. Create Your First Application -To begin, create a free **[ToolJet](https://www.tooljet.ai/signup)** account and follow the steps below. +To begin, create a free **[ToolJet](https://www.tooljet.com/signup)** account and follow the steps below.

-- Click on the **Create new app** button on the dashboard. Name your application as "Employee Directory". -- Click and drag a **[Table](/docs/widgets/table)** component on the canvas. Optionally, you can also design a header by adding more components. +- Click on the **Create new app** button on the dashboard. Name your application as "Employee Directory". +- Click and drag a **[Table](/docs/widgets/table)** component on the canvas. Optionally, you can also design a header by adding more components.
### 2. Create a Database Table -Now, create a new table in **[ToolJetโ€™s Database](/docs/tooljet-db/tooljet-database/)** to store employee records. + +Now, create a new table in **[ToolJetโ€™s Database](/docs/tooljet-db/tooljet-database/)** to store employee records.

-- Name the table *employees*, then add the following columns: first_name, last_name, email, phone, department, position, joining, and status. +- Name the table _employees_, then add the following columns: first_name, last_name, email, phone, department, position, joining, and status. - Add a few employee records in the database table as placeholder data.
@@ -58,10 +58,10 @@ To display employees in the application, you will first have to fetch the data f - Click on the **Add** button in the **[Query Panel](/docs/app-builder/query-panel/)** to create a new query. - Select **ToolJet Database** as the data source for the query. -- Rename the query to *getEmployees*. -- Choose *employees* as the Table name, and *List rows* as the Operation. +- Rename the query to _getEmployees_. +- Choose _employees_ as the Table name, and _List rows_ as the Operation. - Click on the **Run** button to fetch data. -- To automatically run the query when the app starts, enable the toggle for *Run this query on application load* from the query setting. +- To automatically run the query when the app starts, enable the toggle for _Run this query on application load_ from the query setting.
@@ -69,7 +69,7 @@ To display employees in the application, you will first have to fetch the data f ### 4. Bind Queried Data to the UI -Now, you need to bind the data returned by the *getEmployees* query with the Table created in the first step. +Now, you need to bind the data returned by the _getEmployees_ query with the Table created in the first step.
@@ -80,10 +80,14 @@ Now, you need to bind the data returned by the *getEmployees* query with the Tab - Under the Data property, enter the below code: ```js -{{queries.getEmployees.data}} +{ + { + queries.getEmployees.data; + } +} ``` -Now the Table component is filled with the data returned by the *getEmployees* query. +Now the Table component is filled with the data returned by the _getEmployees_ query.
@@ -91,7 +95,7 @@ Now the Table component is filled with the data returned by the *getEmployees* q ### 5. Create a Query to Add Data -In the bottom-right corner of the Table component, there is a **+(Add new row)** button that opens an auto-generated form to add new data to the Table. Follow the steps below to create an *addEmployees* query and execute it when you click the **Save** button on the auto-generated form. +In the bottom-right corner of the Table component, there is a **+(Add new row)** button that opens an auto-generated form to add new data to the Table. Follow the steps below to create an _addEmployees_ query and execute it when you click the **Save** button on the auto-generated form.
@@ -99,8 +103,8 @@ In the bottom-right corner of the Table component, there is a **+(Add new row)**
- Click on the **Add** button in the query panel, and select **ToolJet Database** as the data source. -- Select *employees* as the Table name, and Create row as the Operation. -- Rename the query to *addEmployees*. +- Select _employees_ as the Table name, and Create row as the Operation. +- Rename the query to _addEmployees_. - Click on **Add Column** to add the required columns. - Enter the code below for **first_name** and **email** column keys: @@ -111,13 +115,14 @@ In the bottom-right corner of the Table component, there is a **+(Add new row)** ``` Frame all the remaining keys in the same format. +
### 6. Use Events to Trigger Queries -The *addEmployees* query should run when you click the **Save** button on the auto-generated form. The Table component should then reload and display the updated data whenever a new employee is added. Follow the steps below to set up this functionality using events. +The _addEmployees_ query should run when you click the **Save** button on the auto-generated form. The Table component should then reload and display the updated data whenever a new employee is added. Follow the steps below to set up this functionality using events.
@@ -125,9 +130,9 @@ The *addEmployees* query should run when you click the **Save** button on the au
- Click on the Table component, and click on **New event handler** in the properties panel. -- Choose Add new rows as the Event, Run Query as the Action, and *addEmployees* as the Query. -- In the *addEmployees* query's configuration, under the settings tab, click on **New event handler** to add a new event. -- Select Query Success as the Event, Run Query as the Action, and *getEmployees* as the Query. +- Choose Add new rows as the Event, Run Query as the Action, and _addEmployees_ as the Query. +- In the _addEmployees_ query's configuration, under the settings tab, click on **New event handler** to add a new event. +- Select Query Success as the Event, Run Query as the Action, and _getEmployees_ as the Query. Now, when you click the **+ (Add new row)** button on the Table component, enter the employee details, and click **Save**, the data will be added to the database and automatically reflected in the Table component on the UI. @@ -148,8 +153,6 @@ The preview, release and share buttons are at the top-right of the App-Builder. - Once the development is done and you are ready to use the application, click on the **Release** button to deploy the app. - Finally, share your application with your end users using the **Share** button. -Congratulations on completing the tutorial! You've successfully built an employee directory application and, in the process, learnt the fundamentals of ToolJet. +Congratulations on completing the tutorial! You've successfully built an employee directory application and, in the process, learnt the fundamentals of ToolJet.
- - diff --git a/docs/versioned_docs/version-3.5.0-LTS/how-to/pass-values-in-rest-api.md b/docs/versioned_docs/version-3.5.0-LTS/how-to/pass-values-in-rest-api.md index a371f9b3cd..3a20a27a86 100644 --- a/docs/versioned_docs/version-3.5.0-LTS/how-to/pass-values-in-rest-api.md +++ b/docs/versioned_docs/version-3.5.0-LTS/how-to/pass-values-in-rest-api.md @@ -7,13 +7,14 @@ This guide gives you an overview of how you can pass values in a REST API Query
-## Raw JSON +## Raw JSON In the following JSON code, the `${}` syntax is used for JavaScript string interpolation within template literals (also called template strings). This allows dynamic values from JavaScript variables or expressions to be injected directly into the string. ```javascript -{{ - `{ +{ + { + `{ "contents": [{ "parts": [{ "text": "Generate the following content for this image in markdown format: @@ -27,8 +28,9 @@ In the following JSON code, the `${}` syntax is used for JavaScript string inter } },], },], - }` - }} + }`; + } +} ```
@@ -49,7 +51,7 @@ In this example, simple key-value pairs are entered in the provided input fields
-To see REST API queries in action, check out the following tutorials: +To see REST API queries in action, check out the following tutorials: -1. **[Gemini AI Content Generator](https://blog.tooljet.ai/build-an-ai-content-generator-using-gemini-api-and-tooljet-in-10-minutes/)** -2. **[Open AI Audio Transcriber](https://blog.tooljet.ai/building-an-audio-transcriber-and-analyzer-using-tooljet-and-openai/)** \ No newline at end of file +1. **[Gemini AI Content Generator](https://blog.tooljet.com/build-an-ai-content-generator-using-gemini-api-and-tooljet-in-10-minutes/)** +2. **[Open AI Audio Transcriber](https://blog.tooljet.com/building-an-audio-transcriber-and-analyzer-using-tooljet-and-openai/)** diff --git a/docs/versioned_docs/version-3.5.0-LTS/how-to/use-axios.md b/docs/versioned_docs/version-3.5.0-LTS/how-to/use-axios.md index 4ac9556aae..b7cab59b7b 100644 --- a/docs/versioned_docs/version-3.5.0-LTS/how-to/use-axios.md +++ b/docs/versioned_docs/version-3.5.0-LTS/how-to/use-axios.md @@ -2,6 +2,7 @@ id: use-axios-in-runjs title: Use Axios in RunJS --- +
ToolJet supports three libraries: **Moment.js**, **Lodash**, and **Axios**. This guide focuses on using the Axios library with RunJS queries. **[Axios](https://axios-http.com/docs/intro)** is a promise-based HTTP client for making requests to your own or external servers. It supports various request types like `GET`, `POST`, `PUT/PATCH`, and `DELETE`. @@ -21,10 +22,10 @@ var url = "https://jsonplaceholder.typicode.com/users/1"; var data = (await axios.get(url)).data; -return data +return data; ``` -*This code sets up a URL variable, makes a GET request to the API, and returns the data. Preview the query to see the API's response.* +_This code sets up a URL variable, makes a GET request to the API, and returns the data. Preview the query to see the API's response._
@@ -43,18 +44,18 @@ return data ```javascript var url = "https://jsonplaceholder.typicode.com/users"; -var data = axios.post(url,{ +var data = axios.post(url, { id: 11, name: "Shubhendra", username: "camelcaseguy", - email: "shubhendra@tooljet.com",}) + email: "shubhendra@tooljet.com", +}); -return data +return data; ``` This POST request sends user details to the server. The server's response, as shown below, includes **Status: 201** indicating successful resource creation. -
Use Axios in RunJS @@ -62,7 +63,6 @@ This POST request sends user details to the server. The server's response, as sh
To see Axios in action in a project, check out this tutorial: -**[Build GitHub star history tracker](https://blog.tooljet.ai/build-github-stars-history-app-in-5-minutes-using-low-code/)**. +**[Build GitHub star history tracker](https://blog.tooljet.com/build-github-stars-history-app-in-5-minutes-using-low-code/)**. - -
\ No newline at end of file +
diff --git a/docs/versioned_docs/version-3.5.0-LTS/setup/env-vars.md b/docs/versioned_docs/version-3.5.0-LTS/setup/env-vars.md index ba1e4e190f..952f2a9e7b 100644 --- a/docs/versioned_docs/version-3.5.0-LTS/setup/env-vars.md +++ b/docs/versioned_docs/version-3.5.0-LTS/setup/env-vars.md @@ -11,23 +11,26 @@ ToolJet requires several environment variables to function properly. Below is a #### ToolJet Host -- `TOOLJET_HOST`: Public URL of ToolJet (e.g., `https://app.tooljet.ai`) +- `TOOLJET_HOST`: Public URL of ToolJet (e.g., `https://app.tooljet.com`) #### Lockbox Configuration + - `LOCKBOX_MASTER_KEY`: 32-byte hex string for encrypting datasource credentials - Generate using: `openssl rand -hex 32` #### Application Secret + - `SECRET_KEY_BASE`: 64-byte hex string for encrypting session cookies - Generate using: `openssl rand -hex 64` #### Database Configuration + - `PG_HOST`: PostgreSQL database host - `PG_DB`: Database name - `PG_USER`: Username - `PG_PASS`: Password - `PG_PORT`: Port - + **Docker Compose Setup:** If you are using a Docker Compose setup with an in-built PostgreSQL instance, set `PG_HOST` to `postgres`. This ensures that Docker's internal DNS resolves the hostname correctly, allowing the ToolJet server to connect to the database seamlessly. **Database Connection URL:** If you intend to use the database connection URL and your database does not support SSL, use the following format when setting the `DATABASE_URL` variable: @@ -39,9 +42,11 @@ DATABASE_URL=postgres://PG_USER:PG_PASS@PG_HOST:5432/PG_DB?sslmode=disable Replace `username`, `password`, `hostname`, `port`, and `database_name` with your actual database details. #### Disabling Automatic Database & Extension Creation (Optional) + - `PG_DB_OWNER=false`: ToolJet by default tries to create database based on `PG_DB` variable set and additionally my try to create postgres extensions. This requires the postgres user to have `CREATEDB` permission. If this cannot be granted you can disable this behaviour by setting `PG_DB_OWNER` as `false` and will have to manually run them. #### ToolJet Database + - `TOOLJET_DB`: Default database name (`tooljet_db`) - `TOOLJET_DB_HOST`: Database host - `TOOLJET_DB_USER`: Database username @@ -52,10 +57,10 @@ Replace `username`, `password`, `hostname`, `port`, and `database_name` with you ToolJet requires two separate databases for optimal functionality. **TOOLJET_DB** is used to store the platform's internal metadata, including tables created within ToolJet. On the other hand, **PG_DB** acts as the primary database for application data, handling end-user data managed by the apps built on ToolJet. - **Automatic Database Creation:** The database name specified in `TOOLJET_DB` will be automatically created during the server boot process in all production deployment setups. #### PostgREST + ToolJet uses **PostgREST (v12.2.0)** for API access. The following environment variables are required for PostgREST: - `PGRST_JWT_SECRET`: JWT secret (Generate using `openssl rand -hex 32`). If this parameter is not specified, PostgREST will refuse authentication requests. @@ -100,25 +105,29 @@ REDIS_PASSWORD= - `COMMENT_FEATURE_ENABLE=true/false`: Use this environment variable to enable/disable the feature that allows you to add comments on the canvas. To configure this environment variable, ensure that multiplayer editing is enabled in the Settings. #### User Session Expiry + - `USER_SESSION_EXPIRY`: Controls session expiry time (in minutes). Default: **10 days**. Note: The variable expects the value in minutes. ex: USER_SESSION_EXPIRY = 120 which is 2 hours #### Password Retry Limit -By default, an account is locked after 5 failed login attempts. You can control this with: -- `DISABLE_PASSWORD_RETRY_LIMIT=true`: Disables the retry limit. +By default, an account is locked after 5 failed login attempts. You can control this with: + +- `DISABLE_PASSWORD_RETRY_LIMIT=true`: Disables the retry limit. - `PASSWORD_RETRY_LIMIT=`: Sets a custom retry limit (default is 5). #### Hide Account Setup Link - `HIDE_ACCOUNT_SETUP_LINK`: Set to `true` to hide the account setup link from the admin in the manage user page. Ensure SMTP is configured to send welcome emails. -#### Restrict Signups +#### Restrict Signups + Set `DISABLE_SIGNUPS=true` to allow only invited users to sign up. The signup page will still be visible but unusable. #### SMTP Configuration -ToolJet sends emails via SMTP. + +ToolJet sends emails via SMTP. :::info If you have upgraded from a version prior to v2.62.0, the SMTP variables in your .env file will automatically be mapped to the UI. For versions v2.62.0 and later, SMTP configuration will no longer be picked up from the .env file for Enterprise Edition. You must configure SMTP through the UI. You can safely remove these variables from your .env file after ensuring that the configuration is properly set up in the UI. @@ -135,66 +144,79 @@ For **Community Edition**, use these environment variables: - `SMTP_PORT`: SMTP port #### Custom CA Certificate + If ToolJet needs to connect to self-signed HTTPS endpoints, ensure the `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path of the CA certificate file. - `NODE_EXTRA_CA_CERTS=/path/to/cert.pem`: Absolute path to the PEM file (can contain multiple certificates). #### ToolJet API Import Application -By default, server accepts maximum JSON size as 50 MB. To increase this limit, use the following environment variable: +By default, server accepts maximum JSON size as 50 MB. To increase this limit, use the following environment variable: - `MAX_JSON_SIZE = "150mb"` ### Third-Party Integrations #### Slack + To use Slack as a data source in ToolJet, create a Slack app and set: - `SLACK_CLIENT_ID`: Slack app client ID - `SLACK_CLIENT_SECRET`: Slack app client secret #### Google OAuth + To connect ToolJet with Google services like Google Sheets, create OAuth credentials in Google Cloud Console. - `GOOGLE_CLIENT_ID`: Google OAuth client ID - `GOOGLE_CLIENT_SECRET`: Google OAuth client secret #### Google Maps API + To use the Maps widget in ToolJet, create a Google Maps API key and set: - `GOOGLE_MAPS_API_KEY`: Google Maps API key #### Application Monitoring (APM) + - `APM_VENDOR=sentry`: Set APM vendor. - `SENTRY_DNS`: Sentry project DSN. - `SENTRY_DEBUG=true/false`: Enable/disable Sentry debugging. #### Security & Authentication + By default, ToolJet sends user count updates every 24 hours. To disable this, use: - `DISABLE_TOOLJET_TELEMETRY=true`: Disables telemetry.(Enabled by default) #### Single Sign-On (SSO) + Enable Google or GitHub SSO with these environment variables: **Google SSO:** + - `SSO_GOOGLE_OAUTH2_CLIENT_ID`: Google OAuth client ID **GitHub SSO:** + - `SSO_GIT_OAUTH2_CLIENT_ID`: GitHub OAuth client ID - `SSO_GIT_OAUTH2_CLIENT_SECRET`: GitHub OAuth client secret - `SSO_GIT_OAUTH2_HOST`: GitHub host if self-hosted **General SSO Settings:** + - `SSO_ACCEPTED_DOMAINS`: Comma-separated list of allowed email domains - `SSO_DISABLE_SIGNUPS=true`: Restricts signups to existing users #### Group Synchronization + If any of the following environment variables are set to true, group synchronization will be skipped during the login process for the respective SSO provider: + - `DISABLE_LDAP_GROUP_SYNC=true` โ€“ Disables group sync for LDAP during login. - `DISABLE_SAML_GROUP_SYNC=true` โ€“ Disables group sync for SAML during login. #### REST API Cookie Forwarding + By default, ToolJet does not forward cookies with REST API requests. To enable this (self-hosted only), set: - `FORWARD_RESTAPI_COOKIES=true`: Allows forwarding cookies with REST API requests. @@ -203,14 +225,16 @@ By default, ToolJet does not forward cookies with REST API requests. To enable t This is required when the assets for the client are to be loaded from elsewhere (eg: CDN). This can be an absolute path, or relative to main HTML file. -- `ASSET_PATH`: Path for loading frontend assets (e.g., `https://app.tooljet.ai/`) +- `ASSET_PATH`: Path for loading frontend assets (e.g., `https://app.tooljet.com/`) ## Additional Configurations #### Log File Path + - `LOG_FILE_PATH`: Path to store audit logs (e.g., `tooljet/log/tooljet-audit.log`) #### Embedding Private Apps + By default, only public apps can be embedded. To allow embedding of private ToolJet apps, set: - `ENABLE_PRIVATE_APP_EMBED=true/false`: Allows embedding of private ToolJet apps. @@ -218,19 +242,19 @@ By default, only public apps can be embedded. To allow embedding of private Tool **Note: Available in ToolJet Enterprise 2.8.0+ and Community/Cloud 2.10.0+.** #### Default Language -Set the default language using the `LANGUAGE` variable. Supported options: +Set the default language using the `LANGUAGE` variable. Supported options:
-| Language | Code | Native Name | -|-------------|------|-------------------| -| English | en | English | -| French | fr | Franรงais | -| Spanish | es | Espaรฑol | -| Italian | it | Italiano | +| Language | Code | Native Name | +| -------- | ---- | ----------- | +| English | en | English | +| French | fr | Franรงais | +| Spanish | es | Espaรฑol | +| Italian | it | Italiano |
@@ -238,12 +262,12 @@ Set the default language using the `LANGUAGE` variable. Supported options:
-| Language | Code | Native Name | -|-------------|------|-------------------| -| Indonesian | id | Bahasa Indonesia | -| Ukrainian | uk | ะฃะบั€ะฐั—ะฝััŒะบะฐ | -| Russian | ru | ะ ัƒััะบะธะน | -| German | de | Deutsch | +| Language | Code | Native Name | +| ---------- | ---- | ---------------- | +| Indonesian | id | Bahasa Indonesia | +| Ukrainian | uk | ะฃะบั€ะฐั—ะฝััŒะบะฐ | +| Russian | ru | ะ ัƒััะบะธะน | +| German | de | Deutsch |
@@ -251,4 +275,4 @@ Set the default language using the `LANGUAGE` variable. Supported options: Example: `LANGUAGE=fr` (for French). -**Note:** This setting is not available in ToolJet Cloud. \ No newline at end of file +**Note:** This setting is not available in ToolJet Cloud. diff --git a/docs/versioned_docs/version-3.5.0-LTS/tj-setup/licensing/cloud.md b/docs/versioned_docs/version-3.5.0-LTS/tj-setup/licensing/cloud.md index 77bab634ab..8062812850 100644 --- a/docs/versioned_docs/version-3.5.0-LTS/tj-setup/licensing/cloud.md +++ b/docs/versioned_docs/version-3.5.0-LTS/tj-setup/licensing/cloud.md @@ -3,11 +3,11 @@ id: cloud title: ToolJet Cloud --- -This guide explains the different types of subscriptions present and provides instructions on upgrading your subscription for ToolJet Cloud. For assistance in selecting an appropriate plan, visit the **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page or **[contact the ToolJet team](mailto:hello@tooljet.com)**. +This guide explains the different types of subscriptions present and provides instructions on upgrading your subscription for ToolJet Cloud. For assistance in selecting an appropriate plan, visit the **[ToolJet Pricing](https://www.tooljet.com/pricing)** page or **[contact the ToolJet team](mailto:hello@tooljet.com)**. ## Types of Subscriptions -ToolJet provides three types of subscriptions - **Basic**, **Trial**, and **Paid**. These can be further categorized in different plans based on the services and features. Visit **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page for more details on different plans. +ToolJet provides three types of subscriptions - **Basic**, **Trial**, and **Paid**. These can be further categorized in different plans based on the services and features. Visit **[ToolJet Pricing](https://www.tooljet.com/pricing)** page for more details on different plans. ### Basic Subscription @@ -19,13 +19,13 @@ ToolJet offers a trial subscription which is valid for 14 days, where users can ### Paid Subscription -ToolJet offers various plans for paid subscription. Visit the **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page for more details on different plans. Once you have decided a suitable plan for your needs then you can upgrade to a paid subscription by simply clicking on the upgrade button. +ToolJet offers various plans for paid subscription. Visit the **[ToolJet Pricing](https://www.tooljet.com/pricing)** page for more details on different plans. Once you have decided a suitable plan for your needs then you can upgrade to a paid subscription by simply clicking on the upgrade button. ## AI Credit System Starting from **`v3.5.0-cloud-lts`** ToolJet supports **Build with AI** allowing you to build applications effortlessly using natural language. Refer to **[Build with AI](/docs/build-with-ai/overview)** guide for more information. -The AI credits are consumed on every AI operation performed in ToolJet. Credits are allocated at the workspace level, varying based on the pricing plan and replenishing every month. Unused credits do not carry over to the next month, they expire at the end of each billing cycle. AI-powered operations consume credits depending on their complexity. Visit **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page for more details. +The AI credits are consumed on every AI operation performed in ToolJet. Credits are allocated at the workspace level, varying based on the pricing plan and replenishing every month. Unused credits do not carry over to the next month, they expire at the end of each billing cycle. AI-powered operations consume credits depending on their complexity. Visit **[ToolJet Pricing](https://www.tooljet.com/pricing)** page for more details. ### Credit Usage diff --git a/docs/versioned_docs/version-3.5.0-LTS/tj-setup/licensing/self-hosted.md b/docs/versioned_docs/version-3.5.0-LTS/tj-setup/licensing/self-hosted.md index 3431ffbb35..ea6d756cfa 100644 --- a/docs/versioned_docs/version-3.5.0-LTS/tj-setup/licensing/self-hosted.md +++ b/docs/versioned_docs/version-3.5.0-LTS/tj-setup/licensing/self-hosted.md @@ -3,13 +3,13 @@ id: self-hosted title: Self-Hosted --- -This guide explains the different types of licenses present and provides instructions on upgrading your license for Self-Hosted ToolJet. Self-Hosted ToolJet works on a license model and you can reach out to the **[ToolJet Team](mailto:hello@tooljet.com)** to generate the key. For assistance in selecting an appropriate plan visit the **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page or contact the **[ToolJet team](mailto:hello@tooljet.com)**. +This guide explains the different types of licenses present and provides instructions on upgrading your license for Self-Hosted ToolJet. Self-Hosted ToolJet works on a license model and you can reach out to the **[ToolJet Team](mailto:hello@tooljet.com)** to generate the key. For assistance in selecting an appropriate plan visit the **[ToolJet Pricing](https://www.tooljet.com/pricing)** page or contact the **[ToolJet team](mailto:hello@tooljet.com)**.
## Types of Licenses -ToolJet provides three types of licenses - **Basic**, **Trial**, and **Paid**. These can be further categorized into different subscription plans. Visit **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page for more details on different subscription plans. +ToolJet provides three types of licenses - **Basic**, **Trial**, and **Paid**. These can be further categorized into different subscription plans. Visit **[ToolJet Pricing](https://www.tooljet.com/pricing)** page for more details on different subscription plans. ### Basic License @@ -21,7 +21,7 @@ ToolJet offers a trial license which is valid for 14 days, where users can acces ### Paid License -ToolJet offers various subscription plans for paid licenses. Visit the **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page for more details on different subscription plans. Once you have decided on a suitable plan for your needs you can then contact the **[ToolJet Team](mailto:hello@tooljet.com)** to complete the onboarding process. +ToolJet offers various subscription plans for paid licenses. Visit the **[ToolJet Pricing](https://www.tooljet.com/pricing)** page for more details on different subscription plans. Once you have decided on a suitable plan for your needs you can then contact the **[ToolJet Team](mailto:hello@tooljet.com)** to complete the onboarding process.
@@ -29,7 +29,7 @@ ToolJet offers various subscription plans for paid licenses. Visit the **[ToolJe Starting from **`v3.5.0-ee-lts`** ToolJet supports **Build with AI** allowing you to build applications effortlessly using natural language. Refer to **[Build with AI](/docs/build-with-ai/overview)** guide for more information. -The AI credits are consumed on every AI operation performed in ToolJet. Credits operate at an instance level and are allocated based on the pricing plan and are replenished monthly. Unused credits do not carry over to the next month, they expire at the end of each billing cycle. AI-powered operations consume credits depending on their complexity. Visit **[ToolJet Pricing](https://www.tooljet.ai/pricing)** page for more details. +The AI credits are consumed on every AI operation performed in ToolJet. Credits operate at an instance level and are allocated based on the pricing plan and are replenished monthly. Unused credits do not carry over to the next month, they expire at the end of each billing cycle. AI-powered operations consume credits depending on their complexity. Visit **[ToolJet Pricing](https://www.tooljet.com/pricing)** page for more details. ### Credit Usage diff --git a/docs/versioned_docs/version-3.5.0-LTS/tooljet-db/tooljet-database.md b/docs/versioned_docs/version-3.5.0-LTS/tooljet-db/tooljet-database.md index 440e71f082..3f8d0511f0 100644 --- a/docs/versioned_docs/version-3.5.0-LTS/tooljet-db/tooljet-database.md +++ b/docs/versioned_docs/version-3.5.0-LTS/tooljet-db/tooljet-database.md @@ -20,7 +20,7 @@ Use the ToolJet-hosted database to build apps faster, and manage your data with PostgREST is a standalone web server that turns your PostgreSQL database directly into queryable RESTful APIs which is utilized for Tooljet Database. This server only communicates with the ToolJet server and therefore does not need to be publicly exposed. :::tip -If you have openssl installed, you can run the +If you have openssl installed, you can run the command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. If this parameter is not specified, PostgREST will refuse authentication requests. @@ -45,18 +45,17 @@ PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOO
-|
Variable
|
Description
| -| ------------------ | -------------------------------------------- | -| TOOLJET_DB | Default value is `tooljet_db` | -| TOOLJET_DB_HOST | database host | -| TOOLJET_DB_USER | database username | -| TOOLJET_DB_PASS | database password | -| TOOLJET_DB_PORT | database port | -| PGRST_JWT_SECRET | JWT token client provided for authentication | -| PGRST_HOST | postgrest database host | -| TOOLJET_DB_BULK_UPLOAD_MAX_ROWS | Maximum rows allowed to bulk upload. Default value is 1000 | -| TOOLJET_DB_BULK_UPLOAD_MAX_CSV_FILE_SIZE_MB | Maximum file size of CSV for bulk upload. Default value is 5 MB | - +|
Variable
|
Description
| +| ---------------------------------------------- | --------------------------------------------------------------- | +| TOOLJET_DB | Default value is `tooljet_db` | +| TOOLJET_DB_HOST | database host | +| TOOLJET_DB_USER | database username | +| TOOLJET_DB_PASS | database password | +| TOOLJET_DB_PORT | database port | +| PGRST_JWT_SECRET | JWT token client provided for authentication | +| PGRST_HOST | postgrest database host | +| TOOLJET_DB_BULK_UPLOAD_MAX_ROWS | Maximum rows allowed to bulk upload. Default value is 1000 | +| TOOLJET_DB_BULK_UPLOAD_MAX_CSV_FILE_SIZE_MB | Maximum file size of CSV for bulk upload. Default value is 5 MB | If you intend to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). @@ -89,12 +88,10 @@ ToolJet database allows you to: Once you log-in to your ToolJet account, from the left sidebar of the dashboard you can navigate to **ToolJet Database**. -The ToolJet Database is available on: **[ToolJet Cloud](https://tooljet.ai)**, **[Self-Host](/docs/setup/)**, and **Enterprise Edition**. You can manage your database and its data using the **Database editor UI**. +The ToolJet Database is available on: **[ToolJet Cloud](https://tooljet.com)**, **[Self-Host](/docs/setup/)**, and **Enterprise Edition**. You can manage your database and its data using the **Database editor UI**.
ToolJet database
- - diff --git a/docs/versioned_docs/version-3.5.0-LTS/user-management/sso/ldap.md b/docs/versioned_docs/version-3.5.0-LTS/user-management/sso/ldap.md index 947de51621..b64e44bca0 100644 --- a/docs/versioned_docs/version-3.5.0-LTS/user-management/sso/ldap.md +++ b/docs/versioned_docs/version-3.5.0-LTS/user-management/sso/ldap.md @@ -42,16 +42,16 @@ ToolJetโ€™s LDAP SSO implementation supports authentication across multiple Orga To enable support for multiple OUs, admins can configure a list of base DNs using an environment variable. ToolJet will attempt to authenticate users against each base DN in the order they are defined. **Environment Variable** -Set the `TOOLJET_LDAP_BASE_DNS__` environment variable with a JSON array of base DNs. Make sure to update your workspace slug in place of ``. +Set the `TOOLJET_LDAP_BASE_DNS__` environment variable with a JSON array of base DNs. Make sure to update your workspace slug in place of ``. Example: ```javascript -TOOLJET_LDAP_BASE_DNS__nexus-corps='["ou=team1,dc=company,dc=com","ou=team2,dc=company,dc=com"]' +TOOLJET_LDAP_BASE_DNS__nexus_corps='["ou=team1,dc=company,dc=com","ou=team2,dc=company,dc=com"]' ``` ToolJet will iterate through the provided list during login attempts, checking each base DN until a matching user is found or all options are exhausted. **Notes** -- If `TOOLJET_LDAP_BASE_DNS__` is not set, ToolJet will default to the single OU behavior to maintain backward compatibility. +- If `TOOLJET_LDAP_BASE_DNS__` is not set, ToolJet will default to the single OU behavior to maintain backward compatibility. - The order of base DNs mattersโ€”authentication will follow the sequence defined in the array. diff --git a/docs/versioned_docs/version-3.5.0-LTS/versions.md b/docs/versioned_docs/version-3.5.0-LTS/versions.md index 0cd3940905..0e1ae197f5 100644 --- a/docs/versioned_docs/version-3.5.0-LTS/versions.md +++ b/docs/versioned_docs/version-3.5.0-LTS/versions.md @@ -6,48 +6,48 @@ title: ToolJet Documentation Versions ## Current LTS Versions (Stable) | Version | Documentation | -|------------|------------------------------------------------------------| -| 3.16.0-LTS | [Documentation](https://docs.tooljet.ai/docs/) | -| 3.5.0-LTS | [Documentation](https://docs.tooljet.ai/docs/3.5.0-LTS/) | -| 3.0.0-LTS | [Documentation](https://docs.tooljet.ai/docs/3.0.0-LTS/) | -| 2.50.0-LTS | [Documentation](https://docs.tooljet.ai/docs/2.50.0-LTS/) | +| ---------- | ---------------------------------------------------------- | +| 3.16.0-LTS | [Documentation](https://docs.tooljet.com/docs/) | +| 3.5.0-LTS | [Documentation](https://docs.tooljet.com/docs/3.5.0-LTS/) | +| 3.0.0-LTS | [Documentation](https://docs.tooljet.com/docs/3.0.0-LTS/) | +| 2.50.0-LTS | [Documentation](https://docs.tooljet.com/docs/2.50.0-LTS/) | - ## Past Versions (Not Maintained Anymore) -| Version | Documentation | -|-------------|-------------------------------------------| -| 2.65.0 | [Documentation](https://archived-docs.tooljet.com/docs/) | -| 2.62.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.62.0) | -| 2.61.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.61.0) | -| 2.43.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.43.0) | -| 2.39.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.39.0) | -| 2.36.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.36.0) | -| 2.35.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.35.0) | -| 2.34.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.34.0) | -| 2.33.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.33.0) | -| 2.30.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.30.0) | -| 2.29.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.29.0) | -| 2.27.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.27.0) | -| 2.25.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.25.0) | -| 2.24.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.24.0) | -| 2.23.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.23.0) | -| 2.22.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.22.0) | -| 2.19.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.19.0) | -| 2.18.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.18.0) | -| 2.17.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.17.0) | -| 2.16.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.16.0) | -| 2.15.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.15.0) | -| 2.14.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.14.0) | -| 2.13.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.13.0) | -| 2.12.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.12.0) | -| 2.11.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.11.0) | -| 2.10.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.10.0) | -| 1.x.x | [Documentation](https://archived-docs.tooljet.com/docs/1.x.x) | +| Version | Documentation | +| ------- | -------------------------------------------------------------- | +| 2.65.0 | [Documentation](https://archived-docs.tooljet.com/docs/) | +| 2.62.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.62.0) | +| 2.61.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.61.0) | +| 2.43.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.43.0) | +| 2.39.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.39.0) | +| 2.36.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.36.0) | +| 2.35.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.35.0) | +| 2.34.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.34.0) | +| 2.33.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.33.0) | +| 2.30.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.30.0) | +| 2.29.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.29.0) | +| 2.27.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.27.0) | +| 2.25.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.25.0) | +| 2.24.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.24.0) | +| 2.23.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.23.0) | +| 2.22.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.22.0) | +| 2.19.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.19.0) | +| 2.18.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.18.0) | +| 2.17.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.17.0) | +| 2.16.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.16.0) | +| 2.15.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.15.0) | +| 2.14.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.14.0) | +| 2.13.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.13.0) | +| 2.12.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.12.0) | +| 2.11.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.11.0) | +| 2.10.0 | [Documentation](https://archived-docs.tooljet.com/docs/2.10.0) | +| 1.x.x | [Documentation](https://archived-docs.tooljet.com/docs/1.x.x) | diff --git a/docs/versioned_sidebars/version-3.16.0-LTS-sidebars.json b/docs/versioned_sidebars/version-3.16.0-LTS-sidebars.json index 1439081b3a..e5f26e4bb7 100644 --- a/docs/versioned_sidebars/version-3.16.0-LTS-sidebars.json +++ b/docs/versioned_sidebars/version-3.16.0-LTS-sidebars.json @@ -57,63 +57,63 @@ "type": "category", "label": "PostgreSQL 13 โ†’ 16 Upgrade", "items": [ - { - "type": "category", - "label": "AWS", - "items": [ - "setup/postgresql-13-16/aws/overview", - "setup/postgresql-13-16/aws/db-upgrade", - { - "type": "category", - "label": "Deployment Specific", - "items": [ - "setup/postgresql-13-16/aws/deployment/docker", - "setup/postgresql-13-16/aws/deployment/ami", - "setup/postgresql-13-16/aws/deployment/ecs", - "setup/postgresql-13-16/aws/deployment/eks" - ] - }, - "setup/postgresql-13-16/aws/verification", - "setup/postgresql-13-16/aws/best-practices" - ] - }, - { - "type": "category", - "label": "Azure", - "items": [ - "setup/postgresql-13-16/azure/overview", - "setup/postgresql-13-16/azure/db-upgrade", - { - "type": "category", - "label": "Deployment Specific", - "items": [ - "setup/postgresql-13-16/azure/deployment/aks", - "setup/postgresql-13-16/azure/deployment/container" - ] - }, - "setup/postgresql-13-16/azure/verification", - "setup/postgresql-13-16/azure/best-practices" - ] - }, - { - "type": "category", - "label": "GCP", - "items": [ - "setup/postgresql-13-16/gcp/overview", - "setup/postgresql-13-16/gcp/db-upgrade", - { - "type": "category", - "label": "Deployment Specific", - "items": [ - "setup/postgresql-13-16/gcp/deployment/docker", - "setup/postgresql-13-16/gcp/deployment/gke", - "setup/postgresql-13-16/gcp/deployment/cloud-run" - ] - }, - "setup/postgresql-13-16/gcp/verification", - "setup/postgresql-13-16/gcp/best-practices" - ] - } + { + "type": "category", + "label": "AWS", + "items": [ + "setup/postgresql-13-16/aws/overview", + "setup/postgresql-13-16/aws/db-upgrade", + { + "type": "category", + "label": "Deployment Specific", + "items": [ + "setup/postgresql-13-16/aws/deployment/docker", + "setup/postgresql-13-16/aws/deployment/ami", + "setup/postgresql-13-16/aws/deployment/ecs", + "setup/postgresql-13-16/aws/deployment/eks" + ] + }, + "setup/postgresql-13-16/aws/verification", + "setup/postgresql-13-16/aws/best-practices" + ] + }, + { + "type": "category", + "label": "Azure", + "items": [ + "setup/postgresql-13-16/azure/overview", + "setup/postgresql-13-16/azure/db-upgrade", + { + "type": "category", + "label": "Deployment Specific", + "items": [ + "setup/postgresql-13-16/azure/deployment/aks", + "setup/postgresql-13-16/azure/deployment/container" + ] + }, + "setup/postgresql-13-16/azure/verification", + "setup/postgresql-13-16/azure/best-practices" + ] + }, + { + "type": "category", + "label": "GCP", + "items": [ + "setup/postgresql-13-16/gcp/overview", + "setup/postgresql-13-16/gcp/db-upgrade", + { + "type": "category", + "label": "Deployment Specific", + "items": [ + "setup/postgresql-13-16/gcp/deployment/docker", + "setup/postgresql-13-16/gcp/deployment/gke", + "setup/postgresql-13-16/gcp/deployment/cloud-run" + ] + }, + "setup/postgresql-13-16/gcp/verification", + "setup/postgresql-13-16/gcp/best-practices" + ] + } ] }, "setup/try-tooljet", @@ -138,7 +138,9 @@ "setup/upgrade-to-lts", "setup/upgrade-to-v3", "setup/cloud-v3-migration", - "setup/upgrade-to-v3.16" + "setup/upgrade-to-v3.16", + "setup/workflow-temporal-to-bullmq-migration", + "setup/tooljet-domain-change" ] } ] @@ -152,6 +154,7 @@ "items": [ "build-with-ai/overview", "build-with-ai/generate-applications", + "build-with-ai/prompting101", "build-with-ai/ai-docs-assistant", "build-with-ai/debug-components", "build-with-ai/ai-credits", @@ -183,17 +186,7 @@ ] }, "app-builder/custom-theme", - { - "type": "category", - "label": "Modules", - "items": [ - "app-builder/modules/overview", - "app-builder/modules/create-module", - "app-builder/modules/input-output", - "app-builder/modules/data-flow", - "app-builder/modules/import-export-modules" - ] - } + "app-builder/customstyles" ] }, { @@ -242,7 +235,7 @@ }, { "type": "category", - "label": "Role Based Applications", + "label": "Dynamic Access Rules", "items": [ "app-builder/walkthrough/row-level-security", "app-builder/walkthrough/permissions" @@ -261,12 +254,15 @@ }, { "type": "category", - "label": "Share Application", + "label": "Modules", "items": [ - "app-builder/importing-exporting-applications", - "app-builder/embed-application" + "app-builder/modules/overview", + "app-builder/modules/create-module", + "app-builder/modules/input-output", + "app-builder/modules/data-flow" ] }, + "app-builder/embed-application", { "type": "category", "label": "References", @@ -524,6 +520,7 @@ "marketplace/plugins/marketplace-plugin-pocketbase", "marketplace/plugins/marketplace-plugin-portkey", "marketplace/plugins/marketplace-plugin-Presto", + "marketplace/plugins/marketplace-plugin-prometheus", "marketplace/plugins/marketplace-plugin-qdrant", "marketplace/plugins/marketplace-plugin-salesforce", "marketplace/plugins/marketplace-plugin-sharepoint", @@ -638,7 +635,8 @@ "tj-setup/smtp-setup/email-providers" ] }, - "tj-setup/whitelist-cdn-domains" + "tj-setup/whitelist-cdn-domains", + "tj-setup/observability-otel" ] }, { @@ -671,8 +669,7 @@ "items": [ "user-management/authentication/self-hosted/overview", "user-management/authentication/self-hosted/instance-login", - "user-management/authentication/self-hosted/workspace-login", - "user-management/authentication/self-hosted/pat" + "user-management/authentication/self-hosted/workspace-login" ] }, "user-management/authentication/cloud-login" @@ -726,6 +723,22 @@ "user-management/sso/saml/setup", "user-management/sso/saml/okta" ] + }, + { + "type": "category", + "label": "SCIM", + "link": { + "type": "doc", + "id": "user-management/sso/scim/overview" + }, + "items": [ + "user-management/sso/scim/overview", + { + "type": "link", + "label": "API References", + "href": "/api/scim" + } + ] } ] }, @@ -850,6 +863,15 @@ "items": [ "development-lifecycle/backup/gitsync-backup" ] + }, + { + "type": "category", + "label": "Import Export", + "items": [ + "development-lifecycle/import-export/importing-exporting-applications", + "development-lifecycle/import-export/import-export-workflows", + "development-lifecycle/import-export/import-export-modules" + ] } ] }, @@ -868,7 +890,14 @@ "security/constants/variables" ] }, - "security/audit-logs", + { + "type": "category", + "label": "Audit Logs", + "items": [ + "security/audit-logs/audit-logs", + "security/audit-logs/stream-audit-to-datadog" + ] + }, "security/compliance" ] }, @@ -879,7 +908,8 @@ "collapsible": false, "collapsed": true, "items": [ - "tooljet-api" + "tooljet-api", + "user-management/authentication/self-hosted/pat" ] }, { @@ -954,4 +984,4 @@ ] } ] -} +} \ No newline at end of file